한국기술교육대학교 장영조
한국기술교육대학교전기전자통신공학부 2
1. 구조적모델링 1. 모듈인스턴스와포트사양 2. 프리미티브게이트 3. 게이트지연시간 4. 파라미터 5. 인스턴스배열 6. generate 블록 2. 데이터플로우모델링 1. 연속할당문 2. 할당지연 3. 동작적모델링 1. 절차형블록 2. 절차형할당문 3. if~else문 4. case 문 5. 반복문 6. 태스크와함수 한국기술교육대학교전기전자통신공학부 3
할당문 연속할당문 : net 형객체에값을할당 assign 문 continuous_assign ::= assign [driving_strength] [delay] net_assignments; 절차형할당문 : variable 형객체에값을할당 always 블록, initial 블록, task, function 내부의할당문 blocking 할당문 : 할당기호 = 을사용 nonblocking 할당문 : 할당기호 <= 을사용 절차형연속할당문 (Procedural Continuous Assignment; PCA) assign - deassign 문, force - release 문 한국기술교육대학교전기전자통신공학부 4
할당문좌변의형태 할당문형태 연속할당 절차형할당 좌변 (Left-hand Side; LHS) Net (vector or scalar) Constant bit select of a vector net Constant part select of a vector net Constant indexed part select of a vector net Concatenation of any of the above four LHS Variables (vector or scalar) Bit-select of a vector reg, integer, or time variable Constant part select of a vector reg, integer, or time variable Memory word Indexed part select of vector reg, integer, or time variable Concatenation of regs; bit or part selects of regs 한국기술교육대학교전기전자통신공학부 5
assign 문을이용하여 net 형객체에값을할당 우변의값에변화 (event) 가발생했을때좌변객체에값의할당이일어남 단순한논리표현을이용한조합논리회로모델링에이용 암시적 (implicit) 연속할당문 net 선언문에연속할당문을포함시킨경우 wire mynet = enable & data; wire mynet; assign mynet = enable & data; 암시적연속할당문 명시적연속할당문 assign na = ~(in1 & in2); // 2 input NAND assign out = (sel==1)? d1 : d0; // 2-to-1 MUX assign carry = (cnt10==4 h9); assign sum = a + b; // 덧셈회로 module adder (sum_out, carry_out, carry_in, ina, inb); output wire [3:0] sum_out; output wire carry_out; input [3:0] ina, inb; 연속할당문을이용한 4비트가산기 input carry_in; assign {carry_out, sum_out} = ina + inb + carry_in; module 한국기술교육대학교전기전자통신공학부 6
예제 2.2.1-1 연속할당문 wire mem_we; assign mem_we = cs & wr; // 명시적연속할당 wire mem_rd = cs & rd; // 암시적연속할당 assign #10 out = in1 & in2; // 지연연속할당 assign #12 {c, sum} = a + b + cin; // 좌변비트결합 assign mux_out = (sel) : in1? in2; // 2 input MUX assign tc = (count == 4'h9); // 터미널카운팅 assign high_byte = data[15:8]; // 비트슬라이스우변 예제 2.2.1-3 연속할당문을사용한조합회로 assign mux4 = B? (C? i3 : i2) : (C? i1 : i0); // 4 to 1 mux, 조건연산자 assign total = (A + B) + C ; // adder, 산술연산자 assign sum = (A^B) ^C ; // sum, 논리연산자 assign carry = (A&B) (B&C) (C&A) ; // 캐리, 논리연산자 (1비트) assign agtb = (A>B); // 비교기, 관계연산자 assign aeqb = (A==B); // 비교기, 등가연산자 assign altb = (A<B); // 비교기, 관계연산자 한국기술교육대학교전기전자통신공학부 7
code 2.2.1-1 add_ap.v, 연속할당문을사용한가산기 module add_ap (a, b, res); parameter size = 8; input [size-1:0] a, b; output wire [size:0] res; assign res = a + b; // res[size] 는캐리 module code 2.2.1-3 add_sub.v, 연속할당문을사용한가감산기 module add_sub ( x, y, mode, res, ovf ); parameter size = 12; input [size-1:0] x, y; input mode; output wire [size-1:0] res; output wire ovf; assign {ovf, res} = mode? (x - y) : (x + y); module 한국기술교육대학교전기전자통신공학부 8
정규지연 - 연속할당문의지연값지정 assign 뒤에지연연산자 (#) 를사용하여지정 우변피연산자값의변화가좌변에할당되기까지의시간간격지정 wire out1; assign #10 out1 = in1 & in2; 암시적할당 wire #10 out1 = in1 & in2; // 선언과지연할당을같이 net 지연 - net 선언문에서지연값을지정 지정된 net 지연이경과한후에할당이이루어짐 해당 net 를구동하는모든구동자 ( 게이트프리미티브, 연속할당문등 ) 에영향을미침 wire #10 out1; assign out1 = in1 & in2; 한국기술교육대학교전기전자통신공학부 9
Verilog HDL 의 default 지연 지정된지연값보다입력신호의변화폭이작은경우, 입력신호의변화가출력에영향을미치지않음 관성지연은게이트수준모델링에도동일하게적용 code 2.2.2-1 inertial.v, 관성지연 `timescale 1ns/1ns module inertial; reg a, b; wire out1, out2; assign #10 out1 = a b; assign #30 out2 = a & b; initial begin a = 0; b = 0; #50 a = 1; b = 0; #50 a = 1; b = 1; #20 a = 0; b = 0; #40 a = 1; b = 1; #50 a = 0; b = 0; module 한국기술교육대학교전기전자통신공학부 10
조합논리회로, 순차논리회로의설계, 테스트벤치의작성에사용 always 구문, initial 구문, task, function 내부에사용 설계의추상화가가장높다. 구체적인회로의구조를생성하기위한합성기의지원필요 합성기의성능에따라회로의구조나성능차이 설계자가정확한모델링을하여야한다. 절차형블록인 initial 과 always 블록사용 한개혹은여러개의절차형블록사용 블록상호간의실행은동시적 (concurrent) 이며병렬적 블록내부의동작적문장은순차적실행 절차형할당문 절차형블록내에서의할당문 블록킹 (blocking) 할당문 논블록킹 (non-blocking) 할당문 조건적인실행 if~else 문 case 문 반복적인실행 for, repeat, while, forever initial begin m=2; n=10; p=3; always begin a <=m+n; if (a>10) d <= a << 2; always begin if (p) k = a ; else k = d;.. 한국기술교육대학교전기전자통신공학부 11
절차형블록내부의문장은기술순서대로실행 시뮬레이션에서블록내부의시행은 time 0 에서시작 한국기술교육대학교전기전자통신공학부 12
code 2.3.1-1 pro_blk1.v, 절차형블록실행흐름 `timescale 1ns/1ns module pro_blk1; reg a=0, b=0; reg c=0, d=0; initial begin #10 a = ~a; b = ~a; always begin #10c=~c;d=~c; module 한국기술교육대학교전기전자통신공학부 13
code 2.3.1-2 pro_blk2.v, 절차형블록실행흐름 `timescale 1ns/1ns module pro_blk2; reg a, b, c, d; initial begin a=1; b=0; c=1; d=0; #40 $stop; initial begin #5 a = 0; b = 1; #15 a = 1; b = 0; 시간 (ns) 실행문 0 a=1,b=0,c=1,d=0 5 a=0,b=1 10 c=0 15 d=1 20 a=1,b=0 30 d=0,c=1 40 $stop initial begin #10 c = 0; #5 d = 1; #15 d = 0; c = 1; module 한국기술교육대학교전기전자통신공학부 14
module behave; reg a, b; 주기신호의생성 initial begin a = 1'b1; b = 1'b0; always #50 a = ~a; // 초기값지정 // 주기신호생성 always // 주기신호생성 #100 b = ~b; module 한국기술교육대학교전기전자통신공학부 15
initial 구문 시뮬레이션이실행되는동안한번만실행 시작실행시간은 0 시간 initial begin blocking_or_nonblocking statements; 절차형문장들로구성되며, 문장이나열된순서대로실행 논리합성이지원되지않으므로시뮬레이션을위한테스트벤치에사용 initial begin din = 6'b000000; // initialize at time zero #10 din = 6'b011001; // first pattern #10 din = 6'b011011; // second pattern #10 din = 6'b011000; // third pattern #10 din = 6'b001000; // last pattern 한국기술교육대학교전기전자통신공학부 16
always 블록 조합회로혹은순차회로의모델링 always 구문 always [@(sensitivity_list)] begin blocking_or_nonblocking statements; @ (sensitivity_list) - always 문의실행을제어 sensitivity_list ( 감지신호목록 ) 에나열된신호들중하나이상에변화 (event) 가발생했을때 always 내부에있는 begin- 블록의실행이트리거됨 begin- 블록은절차형문장들로구성 blocking 할당문또는 nonblocking 할당문에따라실행방식이달라짐 시뮬레이션이진행되는동안무한히반복실행됨 한국기술교육대학교전기전자통신공학부 17
sensitivity_list 의사용 조합회로모델링 always 구문으로모델링되는회로의입력신호가모두나열되어야함 일부신호가감지신호목록에서빠지면, 합성이전의 RTL 시뮬레이션결과와합성후의시뮬레이션결과가다를수있음 함축적감지신호표현 (@*) 을사용가능 always @ (m, n) always @(*) // @(a or b or c or d or f) y =(a & b) (c & d) f; 순차회로모델링 동기식셋 / 리셋을갖는경우 : 클록신호만포함 비동기식셋 / 리셋을갖는경우 : 클록신호, 셋, 리셋신호를포함 always @ (posedge clk) always @ (negedge clk or posedge rst) 한국기술교육대학교전기전자통신공학부 18
code 2.3.1-3 shifter.v, 좌우이동및로드기 능이있는레지스터 module shifter(reset, clk, load, sl, sr, d, q); input reset, clk, load, sl, sr; input [7:0] d; output [7:0] q; reg [7:0] q; always @(negedge reset or posedge clk ) if (!reset) q <= 0; // 비동기리셋 else if (load) q <= d; // 동기형로드 else if (sl) q <= q << 1; // 왼쪽이동 else if (sr) q <= q >> 1; // 오른쪽이동 module 예제 2.3.1-1 감지신호목록의사용 a = repeat (5) @ (posedge clk) x&y; // x&y 연산후 clk5 개의양의에지후 a 에전달 always @ (*) // 조합회로의모든입력을감지신호목록에포함 always @ (a, b, c ) // a or b or c 와동일표현 always @ (posedge reset, negedge clk) // 동기형회로, 음의에지 clk 와 // 비동기 reset=1 에서활성화 always @ (x[3:0]) // 벡터신호사용 always @ ( {a,b} ) // 결합신호사용 한국기술교육대학교전기전자통신공학부 19
code 2.3.1-4 mux2t1_bad.v, 감지신호목록에일부신호가빠진경우 감지신호목록에 sel 미포함 - 출력 y 의오동작 module mux2t1_bad(a, b, sel, y); input a, b, sel; output y; reg y; always @(a or b) // sel 미포함 if(~sel) y = a; else y = b; module 감지신호목록에 sel 포함 한국기술교육대학교전기전자통신공학부 20
동기리셋 비동기리셋 code 2.3.1-5 dff4_srst.v, 동기리셋을가진 D 레지스터 code 2.3.1-6 dff4_arst.v, 비동기리셋을가진 D 레지스터 module dff4_srst(rst, clk, d, q); input rst, clk; input [3:0] d; output [3:0] q; reg [3:0] q; always @(posedge clk) if (rst) q <= 0; // 동기리셋 else q <= d; module module dff4_arst(rst, clk, d, q); input rst, clk; input [3:0] d; output [3:0] q; reg [3:0] q; always @(posedge rst, posedge clk) if (rst) q <= 0; // 비동기리셋 else q <= d; module 위두개의코드에대한동작을비교하기위한테스트벤치를작성하고시뮬레이션으로그동작을확인하시오. 한국기술교육대학교전기전자통신공학부 21
always 구문이테스트벤치에사용되는경우 시뮬레이션시간의진행에관련된제어가포함되어야함 그렇지않으면 zero-delay 무한루프 (infinite loop) 가발생되어교착상태 (deadlock) 에빠지게되어시뮬레이션이진행되지않음 always clk = ~clk; // zero-delay infinite loop always #50 clk = ~clk; // 주기가 100ns 인신호 clk 생성 한국기술교육대학교전기전자통신공학부 22
절차형블록내부에서사용하는할당문 절차형할당문에의해값이갱신될때까지변수에할당된값을유지 할당문의좌변은 reg, integer, real, time 등의레지스터변수사용 always, initial, task, function 등의프로시저 (procedure) 내부에서사용 문장이나열된순서대로실행 (execute) 되어할당문좌변의변수값을갱신하는소프트웨어적특성 우변수식의 event 발생과는무관 할당문들의순서가시뮬레이션결과에영향을미칠수있음 연속할당 : 피연산자값에변화 (event) 가발생할때마다우변의식이평가되고, 그결과값이좌변의 net를구동 (drive) 하는하드웨어적특성과차이가있음. Blocking 할당문 할당기호 = 을사용 Nonblocking 할당문 할당기호 <= 을사용 암시적변수할당문 variable 선언문에서 variable 에대한초기값을설정 배열에대한함축적변수할당은허용되지않음 한국기술교육대학교전기전자통신공학부 23
module proc_assignment(a, b, c, clk, out); input a, b, clk; output out; reg out, c; always @(posedge clk) begin c = a & b; // blocking assignment out <= c; // nonblocking assignment module // 암시적변수초기값할당, 하드웨어가아닌시뮬레이션용도 reg[3:0] areg = 4'h4; // 위와동일한할당 reg[3:0] areg; initial areg = 4'h4; 한국기술교육대학교전기전자통신공학부 24
reg_lvalue = [delay_or_event_operator] expression; begin~ 사이에기술된문장의순서대로순차적인할당 각문장의할당에대한실행이완료된후다음문장으로제어가넘어간다. 블록문내에서시뮬레이션실행의시간제어가있을경우, 시간값은블록문내에서누적 initial begin rega = 0; // reg형변수에대한할당 regb[3] = 1; // 단일비트에대한할당 regc[3:5] = 7; // 부분비트에대한할당 {carry, acc} = rega + regb; // 결합에대한할당 한국기술교육대학교전기전자통신공학부 25
reg_lvalue <= [delay_or_event_operator] expression; begin~ 사이에기술된문장의순서와는다르게병렬적인할당 나열된할당문들의순차적인할당에대한블록킹없이정해진할당스케줄 (assignment scheduling) 에의해좌변할당 각문장의할당이끝나기를기다리지않고다음문장으로제어가넘어간다. 논블록킹할당문은할당문의우변을 read 혹은평가하는것과출력변수인좌변에 write 혹은할당하는것이분리된다. 우변의평가는 " 지금 (now)" 이루어지지만좌변에전달 (update) 되는것은 " 나중 (future)" 에이루어진다. 즉, 우변은블록문의실행이시작될때동시에평가된후, 문장의나열순서또는지정된지연값에따른할당스케줄에의해좌변의값이갱신 한국기술교육대학교전기전자통신공학부 26
code 2.3.2-1 nblk1.v, intra 지연할당예 `timescale 1ns/1ns module nblk1; rega,b,c,d,e,f; // intra 지연을가진블로킹할당 initial begin a=#15 1; //15ns에서a에1 할당 b = #3 0; // 18 ns에서 b에 0 할당 c = #6 1; // 24 ns에서 c에 1 할당 //intra 지연을가진논블로킹할당 initial begin d <= #15 1; // 15 ns에서 d에 1 할당 e<=#3 0; //3ns에서e에0 할당 f <= #6 1; // 6 ns에서f에1 할당 module 한국기술교육대학교전기전자통신공학부 27
code 2.3.2-2 nblk2.v, regular 지연할당예 `timescale 1ns/1ns module nblk2; reg a, b, c, d, e, f; // regular 지연을가진블로킹할당 initial begin #15 a = 1; // 15 ns 에서 a 에 1 할당 #3 b = 0; // 18 ns 에서 b 에 0 할당 #6 c = 1; // 24 ns 에서 c 에 1 할당 // regular 지연을가진논블로킹할당 initial begin #15 d <= 1; // 10 ns 에서 d 에 1 할당 #3 e <= 0; // 18 ns 에서 e 에 0 할당 #6 f <= 1; // 24 ns 에서 f 에 1 할당 module 한국기술교육대학교전기전자통신공학부 28
code 2.3.2-3 nblk3.v, 블록킹할당예 code 2.3.2-4 nblk4.v, 논블록킹할당예 module nblk3; reg [7:0] y1, y2; reg [3:0] a, b; reg clk; initial begin a = 5; b = 9; clk = 0; always clk = #10 ~clk; always @(posedge clk) begin y1 = a + b; // y1=14 y2 = y1 + a; module // y2=19 즉시할당 module nblk4; reg [7:0] y1, y2; reg [3:0] a, b; reg clk; initial begin a = 5; b = 9; clk = 0; always clk = #10 ~clk; always @(posedge clk) begin y1 <= a + b; // y1= 14, 14 y2 <= y1+ a; module // y2= x, 19, 지연할당 한국기술교육대학교전기전자통신공학부 29
절차형할당문을사용한디지털시스템모델링가이드 조합회로 - 블록킹할당문사용 순차회로 - 논블록킹할당문사용 하나의 initial 혹은 always 블록내부에서는블록킹과논블록킹할당문을섞어서사용하지말것 블록킹할당문은기술된순서에따라그실행의결과가매우달라지므로순서에유의할것 한국기술교육대학교전기전자통신공학부 30
code 2.3.2-5 pipe1.v, 블록킹할당레지스터 code 2.3.2-6 pipe2.v, 논블록킹할당레지스터 module pipe1 (clk, d, q3); input clk; input [3:0] d; output [3:0] q3; reg [3:0] q3, q2, q1; always @(posedge clk) begin q1 = d; q2 = q1; q3 = q2; module q3 = q2; q2 = q1; q1 = d; module pipe2 (clk, d, q3); input clk; input [3:0] d; output [3:0] q3; reg [3:0] q3, q2, q1; always @(posedge clk) begin q1 <= d; q2 <= q1; q3 <= q2; module pipe2 모듈의합성결과 pipe1 모듈의합성결과 한국기술교육대학교전기전자통신공학부 31
code 2.3.2-7 acc_m.v, 조합회로와순차회로의혼합블록인누산기 code 2.3.2-8 acc_s.v, 조합회로와순차회로의분리된블록인누산기 module acc_m (clk, reset, a, b, ci, acc); input ci, clk, reset; input [3:0] a, b; output [4:0] acc; reg [4:0] acc; // 조합회로와순차회로의혼합 always @ ( negedge reset or posedge clk) if (~reset) acc <= 5'b0; else acc <= a + b + ci; module module acc_s(clk, reset, a, b, ci, acc); input ci, clk, reset; input [3:0] a, b; output [4:0] acc; reg [4:0] acc; reg co; reg [3:0] sum; // 레지스터순차회로 always @ ( negedge reset or posedge clk) if (~reset) acc <= 5'b0; else acc <= {co, sum}; always @(a or b or ci) // 가산기조합회로 {co, sum} = a + b + ci; module 한국기술교육대학교전기전자통신공학부 32
if(expression) statement_true; [else statement_false;] 조건식이참 (0이아닌값 ) 이면, statement_true 부분실행 조건식이거짓 (0, x, z) 이면, statement_false 부분실행 else 부분이없으면, 변수는이전에할당받은값을유지 (latch 동작 ) if 문의내포 (nested) ( 즉, if 문내부에또다른 if 문이있는경우 ) if 문내부에하나이상의 else 문장이생략되는경우, 내부의 else 문은이전의가장가까운 if와결합됨 각조건에서두개이상의실행문을포함하면 begin~로묶는다. nested if if ( a ) if ( x > y) max = x; else max = y; // IF-1 // IF-2 // else of the IF-2 if ( a ) begin if ( x > y) max = x; else max = y; // IF-1 // IF-2 // else of the IF-1 한국기술교육대학교전기전자통신공학부 33
code 2.3.3-1 mux4t1_b.v, if~else 문을사용한 4-to-1 mux module mux4t1_b (sel, in, y); input [1:0] sel; input [3:0] in; output y; reg y; always @ * if (sel==2'b11) y = in[3]; // 조합회로, 블록킹할당 else if (sel==2'b10) y = in[2]; else if (sel==2'b01) y = in[1]; else y = in[0]; module 한국기술교육대학교전기전자통신공학부 34
code 2.3.3-2 dec3t8_b.v, if~else 문을사용한 3-to-8 decoder module dec3t8_b (en, in, y); input en; input [2:0] in; output [7:0] y; reg [7:0] y; always @ (en, in) begin y = 8'b0; // 모든출력비트를먼저 0으로만든다. if (en) if ( in == 3'b111) y[7] = 1'b1; // 조합회로, 블록킹할당 else if ( in == 3'b110) else if ( in == 3'b101) else if ( in == 3'b100) else if ( in == 3'b011) else if ( in == 3'b010) else if ( in == 3'b001) else else y = 8'b0; module y[6] = 1'b1; y[5] = 1'b1; y[4] = 1'b1; y[3] = 1'b1; y[2] = 1'b1; y[1] = 1'b1; y[0] = 1'b1; en in 2 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 0 0 0 x x x y 7 6 5 4 3 2 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 한국기술교육대학교전기전자통신공학부 35
code 2.3.3-3 lt_if.v, latch module lt_if (g, d, q); input g, d ; output q; reg q; always @ (g, d) if (g==1) q = d; // no else, latch 생성 module if~else 문에서 else 가생략되면래치가생성된다 (unwanted latch). 조합회로에서는이를피하기위해서는반드시완전한 if~else 의매칭이이루어져야한다. 한국기술교육대학교전기전자통신공학부 36
code 2.3.3-5 dff_arl_b.v, 비동기리셋과동기형로드를가진 D 레지스터 module dff_arl_b (rst, ld, clk, d, q); parameter size = 4; input rst, ld, clk; input [size-1: 0] d; output [size-1: 0] q; reg [size-1: 0] q; always @ (negedge rst or posedge clk) if (~rst) q <= { size{ 1'b0} }; // 비동기리셋, 논블록킹할당 else if (ld) q <= d; // 동기형 load else q <= q; // hold module 한국기술교육대학교전기전자통신공학부 37
다중 (multi-way) 선택문 case(expression) case_item {, case_item} : statement_or_null; default [:] statement_or_null; case case 조건식의값과일치하는 case_item 의문장실행 조건식은각비트가 0, 1, x, z 를포함하여정확히같은경우에만일치로판단 조건식과모든 case_item 의비트크기는큰쪽에맞추어진다. case_item 의비교는열거된순서에따라서평가 case 조건식이 case_item 중하나와일치되면해당 case_item의문장이실행되고더이상의비교는하지않는다. 가장먼저검사되는 case_item의우선순위가가장높다. case_item들에대한비교에서일치되는항이없는경우에는 default 항실행 default 항이없으면변수는이전에할당받은값을유지 래치생성 하나의 case 문에서여러개의 default를사용할수없다. 각조건에서두개이상의실행문을포함하면 begin~로묶는다. case 문은중첩가능 casex z 와 x 를비교에서 don t care로처리 casez - z 를비교에서 don t care로처리 한국기술교육대학교전기전자통신공학부 38
code 2.3.4-1 `timescale 1ns/1ns module case_sim ; reg [3:0] encode; integer ca1, ca2; initial begin encode = 0; #10 encode = 4'bxxxx; #10 encode = 4'b01xz; #10 encode = 4'b1xxx; #10 encode = 4'bx1xx; #10 encode = 4'b1111; #10 encode = 4'b0001; #10 encode = 4'b0xx0; #10 encode = 4'bx0xx; #10 encode = 4'b0010; #10 $stop; case_sim.v, case 문의실행비교 always @(encode) begin casex (encode) 4'b1xxx : ca1 = 4; 4'b01xx : ca1 = 3; 4'b001x : ca1 = 2; 4'b0001 : ca1 = 1; default : ca1 = 5; case case(encode) 4'b1xxx : ca2 = 4; 4'bx1xx : ca2 = 3; 4'bxx1x : ca2 = 2; 4'bxxx1 : ca2 = 1; default : ca2 = 5; case module 한국기술교육대학교전기전자통신공학부 39
code 2.3.4-2 pri_enc.v, casex 을사용한우선순위인코더 module pri_enc(ain, enc); input [3:0] ain; output [1:0] enc; reg [1:0] enc; always @( ain ) begin casex ( ain ) 4'b1xxx : enc = 2'b11; 4'b01xx : enc = 2'b10; 4'b001x : enc = 2'b01; 4'b0001 : enc = 2'b00; default : enc = 2'b00; // no valid input case module 한국기술교육대학교전기전자통신공학부 40
code 2.3.4-5 sseg10.v, bcd to 7 세그먼트디코더 module sseg10 ( input [3:0] bcd, output reg [7:1] seg ); always @* case(bcd) // LED gfedcba CC형 4'b0000: seg = 7'b0111111 ; // 0 4'b0001: seg = 7'b0000110 ; // 1 4'b0010: seg = 7'b1011011 ; // 2 4'b0011: seg = 7'b1001111 ; // 3 4'b0100: seg = 7'b1100110 ; // 4 4'b0101: seg = 7'b1101101 ; // 5 4'b0110: seg = 7'b1111101 ; // 6 4'b0111: seg = 7'b0000111 ; // 7 4'b1000: seg = 7'b1111111 ; // 8 4'b1001: seg = 7'b1101111 ; // 9 default: seg = 7'b1000000 ; // "-" for invalid code case module 한국기술교육대학교전기전자통신공학부 41
for ( initial_assignment; expression; step_assignment ) statement or statement group while ( expression ) statement or statement group repeat ( number ) statement or statement_group forever statement or statement_group for 문 : 반복횟수를제어하는변수에의해문장이반복실행 while 문 : 조건식의값이거짓이될때까지문장이반복실행 조건식의초기값이거짓이면문장은실행되지않음 repeat 문 : 지정된수만큼문장이반복실행 반복횟수를나타내는수식이 x 또는 z로평가되면반복횟수는 0이되고, 문장은실행되지않음 forever 문 : 문장이무한히반복적으로실행 한국기술교육대학교전기전자통신공학부 42
예제 2.3.5-1 반복문사용예 // forever loop initial begin // 100 후에시작하는 50 주기파형생성 clk = 0; #100 forever #25 clk = ~clk; // while loop initial begin count1 = 0; while(count1 < 64) begin $display("while loop count = %d", count1); count1 = count1 + 1; // for loop initial for (count2=0; count2<64; count2=count2+1) $display (" for loop count = %d", count2); // repeat loop initial begin count3 = 0; repeat (64) begin $display ("repeat loop count = %d", count3 ); count3 = count3 + 1; 한국기술교육대학교전기전자통신공학부 43
병렬적하드웨어생성 code 2.3.5-1 for_lp.v, 단순한게이트회로 module for_lp (a, b, out); input [3:0] a, b; output [3:0] out; reg [2:0] i; // 루프 index, 비트수지정 reg [3:0] out; wire [3:0] a, b; always @(*) begin for (i = 0; i <= 3; i = i + 1) out[i] = a[i] ^ b[i]; // 4 비트 xor 게이트생성 module 한국기술교육대학교전기전자통신공학부 44
code 2.3.5-2 mult_sadd.v, shift-add 반복동작을이용한곱셈기 module mult_sadd(m, n, prod); parameter size=8, psize=size * 2; input [size-1:0] m, n; // m : 피승수, n : 승수 output [psize-1:0] prod; reg [size-1:0] sh_n; reg [size:0] pp; integer i; assign prod = {pp[size-1:0], sh_n}; // 곱셈출력 always @ * begin sh_n = n; // 승수시프트레지스터 pp = 0; // 부분곱초기화 for (i=0; i <size; i = i+1) begin if (sh_n[0]) pp = pp + m; // 부분곱 sh_n = {pp[0], sh_n[size-1:1]}; // 오른쪽이동, 부분곱의낮은자리저장 pp = {1'b0, pp[size:1]} ; // 오른쪽순환 module 한국기술교육대학교전기전자통신공학부 45
mult_sadd 의 RTL 합성회로 한국기술교육대학교전기전자통신공학부 46
code 2.3.5-3 add_cla.v, 캐리예견회로 (CLA) 를가진가산기 module add_cla(a, b, ci, co, s); input [3:0] a, b; input ci; output wire co; output wire [3:0] s; reg [3:0] carrychain; integer i; wire [3:0] p = a ^ b; // propagation stage wire [3:0] g = a & b; // generation stage wire [4:0] shiftcarry = {carrychain, ci}; wire [3:0] s = p ^ shiftcarry[3:0]; // 합 wire co = shiftcarry[4]; // 최종단캐리 always @(a or b or ci or g or p) begin // cla 회로 carrychain[0] = g[0] + (p[0] & ci); // 첫번째캐리예견 for (i = 1; i <= 3; i = i + 1) carrychain[i] = g[i] + (p[i] & carrychain[i-1]); module 한국기술교육대학교전기전자통신공학부 47
task 와함수 반복되는행위수준모델링부분을독립된코드의 task나함수 (function) 로정의하고, 이들을호출하여사용 규모가큰행위수준모델링을작은부분들로분할하여 task 또는함수로표현함 장점 소스코드의가독성 (readability) 과디버깅을용이하게함 종류 사용자정의 task, 함수 시스템 task, 함수 한국기술교육대학교전기전자통신공학부 48
function 적어도 1 개이상의 input 인수가필요 output, inout 인수를가질수없음 항상 1 개의결과값을 return 함 함수명을통해값을 return zero delay 를갖는조합회로구현 다른 function 호출가능 (task 는불가 ) zero simulation delay delay, event, timing control 문포함불가 task 0 개이상의 input, output, inout 인수포함 값을 return 하지않을수있음 output, inout 을통해다수개의값을 return delay, timing, event를갖고, multiple output을반환하는 source code에적용가능 task의 I/O에정의되지않은 module 내 reg로선언된변수 access 가능 다른 task 나 function 호출가능 non-zero simulation time 수행가능 delay, event, timing control 문포함가능 variable 자료형만가질수있으며, net 자료형은가질수없음 assign 문, 게이트프리미티브와모듈인스턴스는사용할수없음 initial 문과 always 문을포함할수없음 behavioral 문만포함가능함 한국기술교육대학교전기전자통신공학부 49
함수의정의 function [size_or_type] function_name; input declarations local variable declarations procedural_statement or statement_group function [size_or_type] 함수결과값의속성및범위지정 : [signed][range_type] 별도의지정이없으면, default 로 1 비트 reg 형이됨 함수가정의되면함수이름과동일한이름의변수가함수내부에선언됨 함수가정의되는영역에서함수이름과동일한이름의다른객체를선언하는 것이허용되지않음 한국기술교육대학교전기전자통신공학부 50
함수의규칙 함수는적어도하나이상의입력인수를포함해야한다. 함수는 output과 inout으로선언된어떠한인수도가질수없다. 함수는시간제어문장을가질수없다. 함수내부의어떠한구문도타이밍제어 (#, @ 또는 wait 등 ) 를포함할수없다. 함수는 task를호출할수없다. 함수는함수이름과동일한이름의내부변수에함수의결과값을할당하는문장을포함한다. 함수는 nonblocking 할당을가질수없다. 조합회로에사용 함수의호출 함수이름과입력인수사용 한국기술교육대학교전기전자통신공학부 51
예제 2.3.6-1 함수예 function [7:0] GetByte; // 함수정의 input [63:0] word; // 선언순서는호출모듈에서인수순서와동일 input [3:0] bytenum; integer bit; reg [7:0] temp; begin for (bit=0; bit<=7; bit=bit+1) temp[bit] = word[((bytenum-1)*8)+bit]; GetByte = temp; // 함수반환값, 함수이름과동일 function // 함수호출예 this_byte = GetByte(data, 4); 한국기술교육대학교전기전자통신공학부 52
code 2.3.6-1 fshift.v, 함수를사용한시프터모델링 module fshift (data, direct, mode, result); input [7:0] data; input direct, mode; output [7:0] result; wire [7:0] result; assign result = (mode)? (rotate(data, direct)): (shift (data, direct)); function [7:0] shift; input [7:0] data; input direct; shift = (direct == 1)? (data >> 1) : (data << 1); function function [7:0] rotate; input [7:0] data; input direct; rotate = (direct)? {data[0], data[7:1]} : {data[6:0], data[7]}; function module 한국기술교육대학교전기전자통신공학부 53
task 의정의 task task_name; input, output, and inout declarations local variable declarations procedural_statement or statement_group task 인수가없거나 input, output 및 inout 의어떤종류의인수도사용가능 태스크호출시정의에서사용한순서로인수전달 태스크내부에 #, @ 혹은 wait 와같은시간제어연산자사용가능 조합회로, 순차회로, 테스트벤치에사용 한국기술교육대학교전기전자통신공학부 54
code 2.3.6-2 bit_count.v 태스크를사용하여 1 의개수카운트 module bit_count (clk, data, bnbr); input clk; input [15:0] data; output [4:0] bnbr; reg [4:0] bnbr; always @ ( posedge clk) count_ones( data, bnbr); task count_ones; input [15:0] din; output [4:0] count; reg [4:0] count; reg [4:0] i; // loop index begin count = 0; for (i=0; i<16; i=i+1) if (din[i]) count = count + 1; // 1 count task 한국기술교육대학교전기전자통신공학부 55