Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
Verilog HDL을이용한디지털시스템설계및실습
5 행위수준 모델링5. 행위수준 모델링
Ver1.0 (2008)1한국기술교육대학교 정보기술공학부
5.1.1 always 구문행위수준모델링
조합논리회로와순차논리회로의설계, 설계된회로의시뮬레이션을위한리회 와 차 리회 의 계, 계 회 의시 레이 위
테스트벤치의작성에사용
always 구문, initial 구문, task, function 내부에사용
always 구문
always [@(sensitivity_list)] begin
@(sensitivity list)는 always문의실행을제어
blocking_or_nonblocking statements;end
@(sensitivity_list)는 always 문의실행을제어sensitivity_list (감지신호목록)에나열된신호들중하나이상에변화(event)가발생했을때 always 내부에있는 begin-end 블록의실행이트리거됨begin-end 블록은절차형문장들로구성blocking 할당문또는 nonblocking할당문에따라실행방식이달라짐시뮬레이션이진행되는동안무한히반복실행됨
Ver1.0 (2008)2
시뮬레이션이진행되는동안무한히반복실행됨
한국기술교육대학교 정보기술공학부
5.1.1 always 구문
module sample(a b out); 2입력OR게이트module sample(a, b, out);input a, b;output out;reg out;
2입력OR 게이트
g ;
always @(a or b) beginif(a==1 || b==1) out = 1; // blocking 할당문else out = 0; // blocking 할당문
endendmodule 코드 5.1
Ver1.0 (2008)3한국기술교육대학교 정보기술공학부
5.1.1 always 구문
module dff(clk, din, qout);input clk, din;
D 플립플롭
output qout;reg qout;
always @(posedge clk)qout <= din; // Non-blocking 할당문
endmodule 코드 5.2
Ver1.0 (2008)4한국기술교육대학교 정보기술공학부
5.1.1 always 구문always 구문의 sensitivity_list (감지신호목록)조합논리회로모델링조합논리회로모델링
always 구문으로모델링되는회로의입력신호가모두나열되어야함일부신호가감지신호목록에서빠지면, 합성이전의 RTL 시뮬레이션결과와합성후의시뮬레이션결과가다를수있음
함축적감지신호표현 (@*)을사용가능
순차회로모델링순차회로모델링
동기식셋/리셋을갖는경우 : 클록신호만포함비동기식셋/리셋을갖는경우 : 클록신호, 셋, 리셋신호를포함
always @(*) // equivalent to @(a or b or c or d or f)always @(*) // equivalent to @(a or b or c or d or f)y =(a & b) |(c & d) | f;
Ver1.0 (2008)5한국기술교육대학교 정보기술공학부
5.1.1 always 구문module mux21_bad(a, b, sel, out);
input [1:0] a, b;input sel;
감지신호목록에 sel이빠진경우p
output [1:0] out;reg [1:0] out;
always @(a or b) // sel is omittedyif(sel ==0)
out = a;else
out = b;endmodule 코드 5.3
Ver1.0 (2008)6한국기술교육대학교 정보기술공학부
5.1.1 always 구문always 구문이테스트벤치에사용되는경우시뮬레이션시간의진행에관련된제어가포함되어야함시뮬레이션시간의진행에관련된제어가포함되어야함
그렇지않으면 zero-delay 무한루프(infinite loop)가발생되어교착상태(deadlock)에빠지게되어시뮬레이션이진행되지않음
always clk = ~clk; // zero-delay infinite loop
always #20 clk = ~clk; // 주기가 40ns인 신호 clk를 생성
Ver1.0 (2008)7한국기술교육대학교 정보기술공학부
5.1.2 initial 구문initial 구문
initial beginblocking_or_nonblocking statements;
end
시뮬레이션이실행되는동안한번만실행
절차형문장들로구성되며, 문장이나열된순서대로실행,논리합성이지원되지않으므로시뮬레이션을위한테스트벤치에사용
initial begin0 // i i i liareg = 0; // initialize areg
for(index = 0; index < size; index = index + 1)memory[index] = 0; //initialize memory word
end
Ver1.0 (2008)8
end
한국기술교육대학교 정보기술공학부
5.1.2 initial 구문
시뮬레이션입력벡터생성
initial begindin = 6'b000000; // initialize at time zero
#10 din = 6'b011001; // first pattern#10 din = 6 b011001; // first pattern#10 din = 6'b011011; // second pattern#10 din = 6'b011000; // third pattern#10 din = 6'b001000; // last pattern#10 din 6 b001000; // last pattern
end
Ver1.0 (2008)9한국기술교육대학교 정보기술공학부
5.1.2 initial 구문주기신호의생성
module behave;reg a, b;
i iti l b i // 초기값 지정
코드 5.4
initial begin // 초기값 지정a = 1'b1;b = 1'b0;
end
always #50 a = ~a;
always #100 b = ~b;
endmodule
Ver1.0 (2008)10한국기술교육대학교 정보기술공학부
5.2절차형할당문절차형할당문
reg integer time real realtime자료형과메모리변수에값을갱신reg, integer, time, real, realtime 자료형과메모리변수에값을갱신문장이나열된순서대로실행(execute)되어할당문좌변의변수값을갱신하는소프트웨어적특성
연속할당 : 피연산자값에변화(event)가발생할때마다우변의식이평가되고, 그결과값이좌변의 net를구동(drive)하는하드웨어적특성
Bl ki 할당문Blocking 할당문할당기호 =을사용
Nonblocking할당문Nonblocking 할당문할당기호 <=을사용
Ver1.0 (2008)11한국기술교육대학교 정보기술공학부
5.2.1 Blocking 할당문Blocking 할당문
현재할당문의실행이완료된이후에그다음의할당문이실행되는순차적현재할당문의실행이완료된이후에그다음의할당문이실행되는순차적
흐름을가짐
reg_lvalue = [delay_or_event_operator] expression;
initial begingrega = 0; // reg형 변수에 대한 할당
regb[3] = 1; // 단일 비트에 대한 할당
regc[3:5] = 7; // 부분 비트에 대한 할당
mema[address] = 8'hff; // 메모리 요소에 대한 할당
{carry, acc} = rega + regb; // 결합에 대한 할당
end
Ver1.0 (2008)12한국기술교육대학교 정보기술공학부
5.2.2 Nonblocking 할당문Nonblocking 할당문나열된할당문들이순차적흐름에대한 blocking없이정해진할당스케줄나열된할당문들이순차적흐름에대한 blocking 없이정해진할당스케줄(assignment scheduling)에의해값이할당할당문들은우변이동시에평가된후, 문장의나열순서또는지정된지연값에따른할당스케줄에의해좌변의객체에값이갱신
동일시점에서변수들의순서나상호의존성에의해할당이이루어져야하는
경우에사용
reg lvalue <= [delay or event operator] expression;reg_lvalue <= [delay_or_event_operator] expression;
Ver1.0 (2008)13한국기술교육대학교 정보기술공학부
5.2.2 Nonblocking 할당문
module non_blk1;output out;reg a b clk;
module blk1;output out;reg a b clk;reg a, b, clk;
initial begina = 0;b 1
reg a, b, clk;
initial begina = 0;b 1b = 1;
clk = 0;end
l lk #5 lk
b = 1;clk = 0;
end
l lk #5 lkalways clk = #5 ~clk;
always @(posedge clk) begin a <= b;
always clk = #5 ~clk;
always @(posedge clk) begin a = b; // a=1
b <= a;end
endmodule
b = a; // b=a=1end
endmodule코드 5.5-(a) 코드 5.5-(b)
Ver1.0 (2008)14한국기술교육대학교 정보기술공학부
5.2.2 Nonblocking 할당문Nonblocking 할당문의시뮬레이션결과
Blocking 할당문의시뮬레이션결과
Ver1.0 (2008)15한국기술교육대학교 정보기술공학부
5.2.2 Nonblocking 할당문
module non_block2;reg a b c d e f;reg a, b, c, d, e, f;
//blocking assignments with intra-assignment delayinitial begin
a = #10 1; // a will be assigned 1 at time 10b = #2 0; // b will be assigned 0 at time 12b = #2 0; // b will be assigned 0 at time 12c = #4 1; // c will be assigned 1 at time 16
end//non-blocking assignments with intra-assignment delayinitial begininitial begin
d <= #10 1; // d will be assigned 1 at time 10e <= #2 0; // e will be assigned 0 at time 2f <= #4 1; // f will be assigned 1 at time 4
dendendmodule 코드 5.6
Ver1.0 (2008)16한국기술교육대학교 정보기술공학부
5.2.2 Nonblocking 할당문
module non_block3;reg a, b, c, d, e, f;
//blocking assignments with delay//blocking assignments with delayinitial begin
#10 a = 1; // a will be assigned 1 at time 10#2 b = 0; // b will be assigned 0 at time 12#4 c = 1; // c will be assigned 1 at time 16#4 c = 1; // c will be assigned 1 at time 16
end//non-blocking assignments with delayinitial begin
#10 d <= 1; // d will be assigned 1 at time 10#10 d <= 1; // d will be assigned 1 at time 10#2 e <= 0; // e will be assigned 0 at time 12#4 f <= 1; // f will be assigned 1 at time 16
endendmoduleendmodule
Ver1.0 (2008)17한국기술교육대학교 정보기술공학부
5.2.2 Nonblocking 할당문non_block2의시뮬레이션결과
non_block3의시뮬레이션결과
Ver1.0 (2008)18한국기술교육대학교 정보기술공학부
5.2.2 Nonblocking 할당문Nonblocking 할당문의내부지연
module multiple2;reg a;
initial a = 1;
코드 5.7
initial begina <= #4 1; // schedules a = 1 at time 4a <= #4 0; // schedules a = 0 at time 4#20 $stop; // At time 4, a = 0
endendmodule
Ver1.0 (2008)19한국기술교육대학교 정보기술공학부
5.2.2 Nonblocking 할당문Nonblocking 할당문의내부지연을이용한주기신호의생성
module multiple;reg r1;reg [2:0] i;
코드 5.8
initial beginr1 = 0;for(i = 0; i <= 5; i = i+1)
r1 <= #(i*10) i[0];end
endmodule
Ver1.0 (2008)20한국기술교육대학교 정보기술공학부
5.3 if 조건문if 조건문
if(expression)statement_true;
[elset t t f l ]
조건식이참 (0이아닌알려진값 )이면, statement_true 부분실행
statement_false;]
조건식이거짓 (0, x, z)이면, statement_false 부분실행else 부분이없으면, 변수는이전에할당받은값을유지 (latch 동작)if문의내포( t d) (즉 if문내부에또다른 if문이있는경우)if 문의내포(nested) (즉, if 문내부에또다른 if 문이있는경우)
if 문내부에하나이상의 else 문장이생략되는경우, 내부의 else 문은이전의가장가까운 if와결합됨들여쓰기또는 begin – end로명확하게표현
Ver1.0 (2008)21한국기술교육대학교 정보기술공학부
5.3 if 조건문
if(index > 0) // IF-1if(rega > regb) // IF-2if(rega > regb) // IF 2
result = rega;else // else of the IF-2
result = regb;
if(index > 0) begin // IF-1if(rega > regb)
result = rega; // IF-2endelse result = regb; // else of the IF-1
Ver1.0 (2008)22한국기술교육대학교 정보기술공학부
5.3 if 조건문module mux21_if(a, b, sel, out);
input [1:0] a, b;input sel;input sel;output [1:0] out;reg [1:0] out;
always @(a or b or sel)always @(a or b or sel)if(sel == 1'b0) // 또는 if(!sel)
out = a;else
out = b;out = b;endmodule 코드 5.9if 조건문을이용한 2:1 멀티플렉서
Ver1.0 (2008)23한국기술교육대학교 정보기술공학부
5.3 if 조건문
비동기 set/reset을갖는 D 플립플롭
module dff_sr_async(clk, d, rb, sb, q, qb);input clk, d, rb, sb;output q, qb;reg q;always @(posedge clk or negedge rb or negedge sb)begin
if(rb==0)q <= 0;
else if(sb==0)q <= 1;
elseq <= d;
end
assign qb = ~q;g q q
endmodule 코드 5.10
Ver1.0 (2008)24한국기술교육대학교 정보기술공학부
5.3 if 조건문
코드 5.10의시뮬레이션결과
Ver1.0 (2008)25한국기술교육대학교 정보기술공학부
5.4 case 문case 문
case(expression)case_item {, case_item} : statement_or_null;| default [:] statement_or_null;d
case 조건식의값과일치하는 case_item의문장이실행
endcase
각비트가 0, 1, x, z를포함하여정확히같은경우에만일치로판단case 문의조건식과모든 case_item의비트크기는큰쪽에맞추어져야함
모든 case item들에대한비교에서일치되는항이없는경우에는 default모든 case_item들에대한비교에서일치되는항이없는경우에는 default 항이실행
default 항이없으면변수는이전에할당받은값을유지하나의 case 문에서여러개의 default를사용하는것은허용되지않음
Ver1.0 (2008)26한국기술교육대학교 정보기술공학부
5.4 case 문
case문을이용한 2:1멀티플렉서
module mux21_case(a, b, sel, out);input [1:0] a, b;i t l
case문을이용한 2 1 멀티플렉서
input sel;output [1:0] out;reg [1:0] out;
always @(a or b or sel) begincase(sel)
0 : out = a;1 : out b;1 : out = b;
endcaseend
endmodule 코드 5.11
Ver1.0 (2008)27한국기술교육대학교 정보기술공학부
5.4 case 문case문을이용한디코더
reg [15:0] rega;reg [9:0] result;
always @(rega) beginalways @(rega) begincase(rega)
16'd0: result = 10'b0111111111;16'd1: result = 10'b1011111111;16'd2: result = 10'b1101111111;16'd3: result = 10'b1110111111;16'd4: result = 10'b1111011111;16'd5: result = 10'b1111101111;16'd5: result = 10'b1111101111;16'd6: result = 10'b1111110111;16'd7: result = 10'b1111111011;16'd8: result = 10'b1111111101;16'd9: result = 10'b1111111110;default: result = 10'bx;
endcaseend
Ver1.0 (2008)28
end
한국기술교육대학교 정보기술공학부
5.4 case 문case 문을이용한 x와 z의처리예
case(select[1:2])2'b00 : result = 0;2'b01 : result = flaga;2'b0x, 2'b0z : result = flaga ? 'bx : 0;2'b10 : result = flagb;2'bx0, 2'bz0 : result = flagb ? 'bx : 0;d f lt lt 'bdefault : result = 'bx;
endcase
case(sig)1 b $di l ( i l i fl i )
case 문을이용한 x와 z의검출예
1'bz: $display("signal is floating");1'bx: $display("signal is unknown");
default: $display("signal is %b", sig);endcase
Ver1.0 (2008)29
endcase
한국기술교육대학교 정보기술공학부
5.4 case 문don't care를갖는 case 문
casez문 : z를 don’t - care로취급하여해당비트를비교에서제외casez문 : z를 don t care로취급하여해당비트를비교에서제외don't – care 조건으로 ? 기호사용가능
casex문 : x와 z를 don’t - care로취급하여해당비트를비교에서제외
reg [7:0] ir;casez(ir)casez(ir)
8'b1???????: instruction1(ir);8'b01??????: instruction2(ir);8'b00010???: instruction3(ir);8 b00010???: instruction3(ir);8'b000001??: instruction4(ir);
endcase
Ver1.0 (2008)30한국기술교육대학교 정보기술공학부
5.4 case 문
casex문을이용한 3비트우선순위인코더(priority encoder)
module pri_enc_casex(encode, enc);input [3:0] encode;
casex 문을이용한 3비트우선순위인코더(priority encoder)
p [ ] ;output [1:0] enc;reg [1:0] enc;
always @(encode) begincasex(encode)
4'b1xxx : enc = 2'b11;4'b01xx : enc = 2'b10;4'b001x : enc = 2'b01;4'b0001 : enc = 2'b00;
dendcaseend
endmodule 코드 5.12
Ver1.0 (2008)31한국기술교육대학교 정보기술공학부
5.4 case 문
코드 5.12의시뮬레이션결과
Ver1.0 (2008)32한국기술교육대학교 정보기술공학부
5.4 case 문
case 조건식에상수값을사용한 3비트우선순위인코더
module pri_enc_case(encode, enc);input [3:0] encode;t t [1 0]output [1:0] enc;
reg [1:0] enc;
always @(encode) beginalways @(encode) begincase(1)
encode[3]: enc = 2'b11;encode[2]: enc = 2'b10;encode[2]: enc 2 b10;encode[1]: enc = 2'b01;encode[0]: enc = 2'b00;default : $display("Error: One of the bits expected ON");p y p
endcaseend
endmodule 코드 5.13
Ver1.0 (2008)33한국기술교육대학교 정보기술공학부
5.5반복문반복문
forever 문:문장이무한히반복적으로실행forever 문:문장이무한히반복적으로실행
repeat문:지정된횟수만큼문장이반복실행
반복횟수를나타내는수식이 x 또는 z로평가되면반복횟수는 0이되고, 문장은실행되지않음
while문:조건식의값이거짓이될때까지문장이반복실행
조건식의초기값이거짓이면문장은실행되지않음조건식의초기값이거짓이면문장은실행되지않음
for문:반복횟수를제어하는변수에의해문장이반복실행
forever statement;| repeat(expression) statement;| repeat(expression) statement;| while(expression) statement;| for(variable_assign); expression; variable_assign) statement;
Ver1.0 (2008)34한국기술교육대학교 정보기술공학부
5.5반복문repeat 문을이용한 shift-add 방식의승산기
module multiplier_8b(opa, opb, result);parameter SIZE = 8, LongSize = 2*SIZE;input [SIZE-1:0] opa, opb;
[ i 1 0] loutput [LongSize-1:0] result;reg [LongSize-1:0] result, shift_opa, shift_opb;
always @(opa or opb) begina ays @(opa o opb) begshift_opa = opa; // multiplicandshift_opb = opb; // multiplierresult = 0;
t(SIZE) b irepeat(SIZE) beginif(shift_opb[0])
result = result + shift_opa;shift opa = shift opa << 1;_ p _ p ;shift_opb = shift_opb >> 1;
endendd d l 코드 5 14
Ver1.0 (2008)35
endmodule 코드 5.14
한국기술교육대학교 정보기술공학부
5.5반복문
코드 5.14의시뮬레이션결과
Ver1.0 (2008)36한국기술교육대학교 정보기술공학부
5.5반복문
8비트입력 rega에포함된 1을계수하는회로
module cnt_one(rega, count);input [7:0] rega;output [3:0] count;preg [7:0] temp_reg;reg [3:0] count;
always @(rega) beginalways @(rega) begincount = 0;temp_reg = rega;while(temp_reg) begin_
if(temp_reg[0])count = count + 1;
temp_reg = temp_reg >> 1;endend
end
endmodule 코드 5.15
Ver1.0 (2008)37한국기술교육대학교 정보기술공학부
5.5반복문
코드 5.15의시뮬레이션결과
Ver1.0 (2008)38한국기술교육대학교 정보기술공학부
5.5반복문for 문을이용한 8비트우선순위인코더(priority encoder)
module enc_for(in, out);input [7:0] in;output [2:0] out;
입력 in[7:0] 출력 out[2:0]
0000_0001 000
0000 0010 001preg [2:0] out;integer i;
0000_0010 001
0000_0100 010
0000_1000 011
always @(in) begin : LOOPout=0;for(i = 7; i >= 0; i = i-1) begin
if(i [i]) b i
0001_0000 100
0010_0000 101
0100_0000 110if(in[i]) begin
out=i;disable LOOP;
end
1000_0000 111
8비트우선순위인코더
endend
endendmodule 코드 5.16
Ver1.0 (2008)39
endmodule 코드 5.16
한국기술교육대학교 정보기술공학부
5.5반복문
코드 5.16의시뮬레이션결과
Ver1.0 (2008)40한국기술교육대학교 정보기술공학부
5.5반복문module tb_dff ;
reg clk, d;forever 문을이용한주기신호생성
g
dff U1 (clk, d, q);
initial begininitial beginclk = 1'b0;forever #10 clk = ~clk;
end
initial begin d = 1'b0;forever beginforever begin
#15 d = 1'b1;#20 d = 1'b0;#30 d = 1'b1;#20 d = 1'b0;
endend
endmodule
Ver1.0 (2008)41
endmodule
한국기술교육대학교 정보기술공학부
5.6절차형할당의타이밍제어절차형할당의실행제어
지연제어 :지연제어 : delay operator : # 특정절차형할당문의실행순서가된시점과그문장이실제실행되는시점
사이의시간간격을지정 (문장의실행을지연시킴)지연값이 x 또는 z인경우에는지연이 0으로처리음수지연값이지정된경우에는 2의보수 unsigned정수로해석음수지연값이지정된경우에는 2의보수 unsigned 정수로해석
#10 rega = regb;#d rega = regb; // d is defined as a parameter
event 제어
# g g ; // p#((d+e)/2) rega = regb; // delay is average of d and e
event operator : @ 시뮬레이션 event가발생될때까지문장의실행을지연시킴net나변수의값변화가순차문의실행을트리거하기위한 event로사용가능
Ver1.0 (2008)42
net나변수의값변화가순차문의실행을트리거하기위한 event로사용가능
한국기술교육대학교 정보기술공학부
5.6절차형할당의타이밍제어에지천이검출
negedge:1에서 0, x, z로변화, 또는 x, z에서 0으로변화에서 event 발생g g
posedge:0에서 x, z, 1로변화, 또는 x, z에서 1로변화에서 event 발생event 발생수식의결과가 1비트이상인경우에는, 에지천이는결과의LSB에서검출LSB에서검출
표 5.1 posedge와 negedge event의발생
ToFrom 0 1 x z
표 5.1 posedge와 negedge event의발생
0 No edge posedge posedge posedge
1 negedge No edge negedge negedge
x negedge posedge No edge No edge
z negedge posedge No edge No edge
Ver1.0 (2008)43한국기술교육대학교 정보기술공학부
5.6절차형할당의타이밍제어상승에지로동작하는 D 플립플롭
module dff(clk, d, q);input clk, d;output q;reg q;reg q;
always @(posedge clk)q <= d;
코드 5 17endmodule 코드 5.17
Ver1.0 (2008)44한국기술교육대학교 정보기술공학부
5.6절차형할당의타이밍제어named event
event자료형으로선언된식별자event 자료형으로선언된식별자순차문의실행을제어하기위한 event 표현에사용
event가발생될때까지실행이지연됨
named event는데이터값을유지하지않음임의의특정한시간에발생될수있음
지속시간을갖지않음
event 제어구문을이용해서 event의발생을감지할수있음
event list_of_event_identifiers; // event 선언
> t id tifi // t t i-> event_identifier; // event trigger
Ver1.0 (2008)45한국기술교육대학교 정보기술공학부
5.6절차형할당의타이밍제어
module ff_event(clock, reset, din, q);input reset clock din;
named event를이용한 D 플립플롭
input reset, clock, din;output q;reg q;event upedge; // event 선언
always @(posedge clock) -> upedge;
always @(upedge or negedge reset)always @(upedge or negedge reset) begin
if(reset==0) q = 0;else q = din;
endendmodule 코드 5.18
Ver1.0 (2008)46한국기술교육대학교 정보기술공학부
5.6절차형할당의타이밍제어
코드 5.18의시뮬레이션결과
Ver1.0 (2008)47한국기술교육대학교 정보기술공학부
5.6절차형할당의타이밍제어event or 연산자
다수의 event들은키워드 or또는콤마( )로결합다수의 event들은키워드 or 또는콤마(,)로결합
always @(posedge clk_a or posedge clk_b or trig) rega = regb;always @(posedge clk_a, posedge clk_b, trig) rega = regb;
wait 문조건을평가하여참이면 wait 문에속하는절차형할당문이실행되며, 조건이거짓이면절차형할당문의실행이중지
wait(expression) statement_or_null;
b ibeginwait(!enable) #10 a = b;
#10 c = d;end
Ver1.0 (2008)48한국기술교육대학교 정보기술공학부
5.6절차형할당의타이밍제어intra-assignment 타이밍제어
지연과 event제어가순차할당문안에포함지연과 event 제어가순차할당문안에포함우변의수식에대한평가를먼저실행한후, 좌변의객체에새로운값이할당되는시점을지정된지연만큼지연시킴
a <= repeat(5) @(posedge clk) data;
Ver1.0 (2008)49한국기술교육대학교 정보기술공학부
5.6절차형할당의타이밍제어
d l i d l 1( lk d )module intra_delay1(clk, d, out);input clk, d;output out;reg out;reg out;always @(*)
out = repeat(3) @(posedge clk) d;endmodule
등가코드코드 5.19
module intra_delay1_eq(clk, d, out);input clk, d;output out;
t t
등가코드
reg out,temp;always @(*) begin
temp = d;@(posedge clk);@(p g );@(posedge clk);@(posedge clk) out = temp;
endd d l 코드 5 20
Ver1.0 (2008)50
endmodule 코드 5.20
한국기술교육대학교 정보기술공학부
5.6절차형할당의타이밍제어
코드 5 19의시뮬레이션결과코드 5.19의시뮬레이션결과
Ver1.0 (2008)51한국기술교육대학교 정보기술공학부
절차형할당의타이밍제어
Equivalent model of Intra-assignment timing control
With intra-assignment construct Without intra-assignment construct
a = #5 b;
begintemp = b;
a = #5 b;#5 a = temp;
end
begin
a = @(posedge clk) b;
gtemp = b;@(posedge clk) a = temp;
end
a = repeat(3) @(posedge clk) b;
begintemp = b;@(posedge clk);
a = repeat(3) @(posedge clk) b;@(posedge clk);@(posedge clk) a = temp;
end
Ver1.0 (2008)52한국기술교육대학교 정보기술공학부
5.7블록문블록문
두개이상의문장을그룹으로묶어구문적으로하나의문장처럼처리두개이상의문장을그룹으로묶어구문적으로하나의문장처럼처리
begin-end 절차형할당문블록문장이나열된순서에의해순차적으로실행
시작시간 : 첫번째문장이실행될때종료시간 : 마지막문장이실행될때각절차형할당문의실행은이전문장의지연시간에대해상대적으로결정됨각절차형할당문의실행은이전문장의지연시간에대해상대적으로결정됨
fork-join 병렬문블록문장의나열순서에무관하게동시에실행
시작시간 : 블록내의모든문장의시작시간이동일종료시간 : 각문장의지연이고려되어시간적으로마지막에실행되는문장의실행이완료된시점실행이완료된시점
각문장의지연은블록에들어가는시뮬레이션시간을기준으로결정됨
시뮬레이션파형생성에유용함
Ver1.0 (2008)53한국기술교육대학교 정보기술공학부
5.7블록문
parameter d = 50;parameter d = 50;reg [7:0] r;begin // a waveform controlled by sequential delay
#d r = 8'h35;#d r = 8'hE2;#d r = 8'h00;#d r = 8'hF7;#d -> end wave; //trigger an event called end wave#d -> end_wave; //trigger an event called end_wave
end
fork#50 r = 8'h35;#100 r = 8'hE2;
fork#250 -> end_wave;#200 r = 8'hF7;#100 r = 8'hE2;
#150 r = 8'h00;#200 r = 8'hF7;#250 -> end_wave;
#200 r = 8 hF7;#150 r = 8'h00;#100 r = 8'hE2;#50 r = 8'h35;
등가코드
Ver1.0 (2008)54
_join join
한국기술교육대학교 정보기술공학부
Verilog HDL을이용한디지털시스템설계및실습
6 구조적 모델링6. 구조적 모델링
Ver1.0 (2008)55한국기술교육대학교 정보기술공학부
6.1모듈
module module_name (port_list); 머리부
port 선언reg 선언
i 선언선언부
wire 선언parameter 선언
하위모듈인스턴스
게이트프리미티브
always 문, initial 문assign 문function, task 정의function, task 호출
몸체
endmodule
, 출
그림 6 1 Verilog모듈의구성
Ver1.0 (2008)56
그림 6.1 Verilog 모듈의구성
한국기술교육대학교 정보기술공학부
6.1.1모듈포트선언모듈포트선언
포트목록에나열된포트들은선언부에서포트선언을통해 input, output, p , p ,inout(양방향)으로선언signed와범위에대한정의를포함한포트에관한모든다른속성들이포트선언에포함될수있음
inout_declaration ::= inout [ net type ][ signed ][ range ] list of port identifiersinout [ net_type ][ signed ][ range ] list_of_port_identifiers
input_declaration ::=input [ net_type ][ signed ][ range ] list_of_port_identifiers
output declaration ::=p _output [ net_type ][ signed ][ range ] ist_of_port_identifiers
| output [ reg ][ signed ][ range ] list_of_port_identifiers| output reg [ signed ][ range ] list_of_variable_port_identifiers| output [ output_variable_type ] list_of_port_identifiers| output output_variable_type list_of_variable_port_identifierslist_of_port_identifiers ::= port identifier { port identifier }
Ver1.0 (2008)57
port_identifier { , port_identifier }
한국기술교육대학교 정보기술공학부
6.1.1모듈포트선언
input aport; // First declaration - okay.p p yinput aport; // Error - multiple port declarationoutput aport; // Error - multiple port declaration
module test(a, b, c, d, e, f, g, h);input [7:0] a, b; // no explicit declaration - net is unsignedinput signed [7:0] c, d; // no explicit net declaration - net is signedoutput [7:0] e, f; // no explicit declaration - net is unsignedoutput signed [7:0] g, h; // no explicit net declaration - net is signedwire signed [7:0] b; // port b inherits signed attribute from net decl.wire [7:0] c; // net c inherits signed attribute from portwire [7:0] c; // net c inherits signed attribute from portreg signed [7:0] f; // port f inherits signed attribute from reg decl.reg [7:0] g; // reg g inherits signed attribute from port
Ver1.0 (2008)58한국기술교육대학교 정보기술공학부
6.1.1모듈포트선언
module complex_ports({c,d}, .e(f)); // Nets {c d} receive the first port bits// Nets {c,d} receive the first port bits. // Name 'f' is declared inside the module.// Name 'e' is defined outside the module.// Can't use named port connections of first port.
module split_ports(a[7:4], a[3:0]); // First port is upper 4 bits of 'a'.
p p
// Second port is lower 4 bits of 'a'.// Can't use named port connections because of part-select port 'a'.
module same_port(.a(i), .b(i)); // Name 'i' is declared inside the module as a inout port. // Names 'a' and 'b' are defined for port connections.
Ver1.0 (2008)59한국기술교육대학교 정보기술공학부
6.1.1모듈포트선언
module renamed_concat(.a({b,c}), f, .g(h[1]));// Names 'b', 'c', 'f', 'h' are defined inside the module.// Names 'a', 'f', 'g' are defined for port connections. // Can use named port connections.
module same_input(a, a);input a; // This is legal. The inputs are ored together.
Ver1.0 (2008)60한국기술교육대학교 정보기술공학부
6.1.2모듈포트선언목록포트선언목록
포트선언목록에서포트를선언
포트선언목록으로선언된포트들은모듈의선언부에서재선언되지않음
module test( input [7:0] a,
input signed [7:0] b, c, d,
output [7:0] e,
output signed reg [7:0] f, g,
output signed [7:0] h ) ;
// ill l d l f h d l i h b d f h d l// illegal to redeclare any ports of the module in the body of the module.
Ver1.0 (2008)61한국기술교육대학교 정보기술공학부
6.2모듈인스턴스구조적모델링
다른모듈의인스턴스와포트매핑을통한모델링다른모듈의인스턴스와포트매핑을통한모델링
범위지정을통한인스턴스배열의생성가능
모듈인스턴스이름은생략할수없음
게이트프리미티브의인스턴스이름은생략가능
포트순서에의한포트매핑
모듈의포트목록에나열된포트순서와 1:1로대응되어연결포트에연결되는신호가없는경우에는해당위치를빈칸으로남겨둔다
포트이름에의한포트매핑포트이름에의한포트매핑
포트이름과그포트에연결되는신호이름을명시적으로지정
포트의비트선택 부분선택 결합등을사용할수없음포트의비트선택, 부분선택, 결합등을사용할수없음
.port_name([expression])
Ver1.0 (2008)62한국기술교육대학교 정보기술공학부
6.2모듈인스턴스
module modB(wa, wb, c, d);순서에의한포트매핑 ( , , , );inout wa, wb;input c, d;
tranif1 g1(wa wb cinvert);
module topmod;wire [4:0] v;wire c w;
순서에의한포트매핑
코드 6.3
tranif1 g1(wa, wb, cinvert);not #(2, 6) n1(cinvert, int);and #(6, 5) g2(int, c, d);
endmodule
wire c, w;
modB b1(v[0], v[3], w, v[4]);endmodule
이름에의한포트매핑
module topmod;wire [4:0] v;wire a,b,c,w;
modB b1(.wb(v[3]), .wa(v[0]), .d(v[4]), .c(w));endmodule 코드 6.4
Ver1.0 (2008)63한국기술교육대학교 정보기술공학부
6.2모듈인스턴스
module bus_driver(busin, bushigh, buslow, enh, enl);input [15:0] busin;input enh enl;input enh, enl;output [7:0] bushigh, buslow;
driver busar3(busin[15:12], bushigh[7:4], enh);2 11 8 3 0driver busar2(busin[11:8], bushigh[3:0], enh);
driver busar1(busin[7:4], buslow[7:4], enl);driver busar0(busin[3:0], buslow[3:0], enl);
endmodule 코드 6.2-(a)
driver busar[3:0] (.in(busin),t({b hi h b l })
모듈인스턴스의배열을이용
( )
.out({bushigh, buslow}),
.en({enh, enh, enl, enl}) );endmodule 코드 6.2-(b)
Ver1.0 (2008)64한국기술교육대학교 정보기술공학부
6.2모듈인스턴스
동일포트에대한다중연결오류
module test;;a U0(.i(a),
.i(b), // illegal connection of input port twice.
.o(c),
.o(d), // illegal connection of output port twice.
.e(e),
.e(f) // illegal connection of inout port twice.);
endmodule 코드 6.4
Ver1.0 (2008)65한국기술교육대학교 정보기술공학부
6.2모듈인스턴스
HalfAdder
ab sum
temp_sum
Half Adder
sum
coutcin temp_c2
temp_c1
module half_adder(a, b, sum, cout);input a b;
반가산기모듈input a, b;output sum, cout;wire cout_bar; //생략 가능 (1-bit wire)
xor U0 (sum, a, b);nand (cout_bar, a, b); // 인스턴스 이름 생략 가능 (gate primitive)not U1 (cout, cout_bar);
endmodule 코드 6.6-(a)
Ver1.0 (2008)66
( )
한국기술교육대학교 정보기술공학부
6.2모듈인스턴스
module full_adder(a, b, cin, sum, cout);i t b iinput a, b, cin;output sum, cout;wire temp_sum, temp_c1, temp_c2; //생략 가능
// half_adder 모듈의 instantiationhalf_adder u0(a, b, temp_sum, temp_c1); // 순서에 의한 포트 연결half_adder u1(.a(temp_sum),
b( i ).b(cin), .sum(sum), .cout(temp_c2) ); // 이름에 의한 포트 연결
or u2(cout, temp c1, temp c2); // 게이트 프리미티브 인스턴스( , p_ , p_ ); // 게이 리미티
endmodule 코드 6.6-(b)
Ver1.0 (2008)67한국기술교육대학교 정보기술공학부
6.2모듈인스턴스
// 1비트 full_adder 모듈의 시뮬레이션 testbenchmodule tb_full_adder ;
reg a, b, cin; // initial 블록에서 값을 받으므로 reg로 선언integer k;
// full_adder 모듈의 instantiationfull_adder U0(a, b, cin, sum, cout);_
// 시뮬레이션을 위한 파형 생성initial begin
forever for(k = 0; k < 8; k = k+1) begin
cin = k/4;b =(k%4)/2;a = k%2;;#10;
endend
endmodule 코드 6.7
Ver1.0 (2008)68
endmodule 코드 6.7
한국기술교육대학교 정보기술공학부
6.2모듈인스턴스
Ver1.0 (2008)69한국기술교육대학교 정보기술공학부
6.2모듈인스턴스실수형값의포트연결
real 자료형은직접포트에연결될수없음시스템함수인 $realtobit와 $bittoreal를통해 real 자료형을비트자료형으로변환한후모듈포트에적용
module driver(net_r);output net_r;real r;real r;wire [64:1] net_r = $realtobits(r);
endmodule 코드 6.8
module receiver(net r);module receiver(net_r);input net_r;wire [64:1] net_r;real r;
initial assign r = $bitstoreal(net_r);
endmodule 코드 6.9
Ver1.0 (2008)70한국기술교육대학교 정보기술공학부
6.3모듈 parameter모듈 parameter
variable 또는 net 범주에속하지않는상수모듈이인스턴스될때값을변경시킬수있음
구조적설계에서모듈인스턴스의개별화(customize)를위한유용한수단l l 으로선언된 t 는그값을변경할수없음localparam으로선언된 parameter는그값을변경할수없음
모듈 parameter 값의변경defparam문을이용하는방법defparam문을이용하는방법
모듈인스턴스를통해 parameter 값을변경하는방법위의두가지방법에의한 parameter 값변경이충돌되는경우,defparam문에의해설정된값이사용됨
Ver1.0 (2008)71한국기술교육대학교 정보기술공학부
6.3모듈 parameter모듈 parameter 값의변경
module foo(a, b);real r1, r2;parameter [2:0] A = 3'h2; //자료형과 범위가 지정된 parameter 선언parameter B = 3'h2; //자료형과 범위가 지정되지 않은 parameter 선언parameter B 3 h2; //자료형과 범위가 지정되지 않은 parameter 선언initial begin
r1 = A;r2 = B;$display("r1 is %f, r2 is %f",r1,r2);
endendmodule 코드 6.10-(a)
module bar; // parameter overriding using defparamwire a, b;defparam U0.A = 3.1415; // A는 3으로 변경됨
// 는 로 변경됨defparam U0.B = 3.1415; // B는 3.1415로 변경됨
foo U0(a, b); // module instantiationendmodule 코드 6.10-(b)
Ver1.0 (2008)72
endmodule 코드 6.10 (b)
한국기술교육대학교 정보기술공학부
6.3모듈 parameterdefparam문
parameter의계층적이름을사용하여전체설계에걸친모듈인스턴스의pparameter 값을변경
인스턴스배열의하부계층구조에있는 defparam문은계층구조밖의
t 값을변경시킬수없음parameter 값을변경시킬수없음모든 parameter 변경문들을함께묶어독립된모듈로정의할때유용
Ver1.0 (2008)73한국기술교육대학교 정보기술공학부
모듈 parameterdefparam문에의한 parameter 값의변경
module top;reg clk;reg [0:4] in1;reg [0:9] in2;
module vdff(out, in, clk);parameter size = 1, delay = 1;input [0:size-1] in;input clk;reg [0:9] in2;
wire [0:4] o1;wire [0:9] o2;
input clk;output [0:size-1] out;reg [0:size-1] out;
vdff m1(o1, in1, clk);vdff m2(o2, in2, clk);
endmodule
always @(posedge clk)# delay out = in;
endmodule
module annotate;defparam
top.m1.size = 5,top.m1.delay = 10,top.m1.delay 10,top.m2.size = 10,top.m2.delay = 20;
endmodule 코드 6.10
Ver1.0 (2008)74한국기술교육대학교 정보기술공학부
6.3모듈 parameter모듈인스턴스의 parameter 값변경순서화된 parameter 목록에의한방법(ordered parameter assignment)p ( _p _ g )
#(expression {, expression,} )
parameter 이름에의한방법 (named_parameter_assignment)
#(.parameter_name([expression]))
단일모듈인스턴스문에서이들두가지방법을혼용하여사용할수없음
기호 # : delay operator로도사용됨
Ver1.0 (2008)75한국기술교육대학교 정보기술공학부
6.3모듈 parameter
모듈 parameter 값의변경
module dffn(q, d, clk);parameter BITS = 1;input [BITS-1:0] d;input clk;output [BITS-1:0] q;
DFF dff_array [BITS-1:0] (q, d, clk); // instance array
module MxN_pipeline(in, out, clk);parameter M = 3, N = 4; // M=width,N=depthinp t [M 1 0] in
_endmodule
input [M-1:0] in;output [M-1:0] out;input clk;wire [M*(N-1):1] t;
// #(M)은 모듈 dffn의 Parameter BITS 값을 재설정dffn #(M) p [1:N] ({out, t}, {t, in}, clk);
endmodule 코드 6.12
Ver1.0 (2008)76한국기술교육대학교 정보기술공학부
6.3모듈 parameter
모듈 parameter 값의변경
Ver1.0 (2008)77한국기술교육대학교 정보기술공학부
6.3모듈 parameter
d l dff( t i lk)module vdff(out, in, clk);parameter size = 5, delay = 1;input [0:size-1] in;input clk;output [0:size-1] out;reg [0:size-1] out;
always @(posedge clk)은 임# delay out = in; // #은 delay operator 임
endmodule
module m;reg clk;
코드 6.13-(a)
reg clk;wire [0:4] out_c, in_c;wire [1:10] out_a, in_a;wire [1:5] out_b, in_b;
vdff #(10,15) mod_a(out_a, in_a, clk);vdff mod_b(out_b, in_b, clk); // default parameter valuesvdff #(.delay(12)) mod_c(out_c, in_c, clk);d d l 코드 6 13 (b)
Ver1.0 (2008)78
endmodule 코드 6.13-(b)
한국기술교육대학교 정보기술공학부
6.4생성문생성문 (Generate statement)
generate-endgenerate블록으로모델링g g반복생성문 (generate-for)조건생성문 (generate-if)case생성문 (generate case)case 생성문 (generate-case)
모듈, 사용자정의프리미티브(UDP), 게이트프리미티브, 연속할당문, initial 블록과 always 블록등의인스턴스를하나또는다수개생성net, reg, integer, real, time, realtime, event 등의자료형선언가능생성된인스턴스와자료형은고유의식별자를가지며계층적으로참조가능
순서또는이름에의한 t 값의변경또는 문에의한순서또는이름에의한 parameter 값의변경또는 defparam문에의한
parameter 재정의가능defparam문은생성범위내에서선언된 parameter의값에만영향을미침p p
생성문에서 parameter, local parameter, input, output, inout, specify block 등의선언은허용되지않음
Ver1.0 (2008)79한국기술교육대학교 정보기술공학부
6.4.1 genvar선언genvar 선언생성문내에서만사용될수있는인덱스변수의선언에사용
genvar로선언되는변수는정수형선언된변수를인덱스로갖는반복생성문내에서만사용되는지역변수
의값은 t 값이참조될수있는어떤문장에서도참조가능genvar의값은 parameter 값이참조될수있는어떤문장에서도참조가능시뮬레이터또는논리합성툴의 elaboration 과정동안에만정의되며, 시뮬레이션또는합성이진행되는동안에는존재하지않음
elaboration 과정 : 시뮬레이션이나합성을위해모듈을분석하는과정구문의오류검출 인스턴스된모듈의연결(link) parameter값의전달구문의오류검출, 인스턴스된모듈의연결(link), parameter 값의전달, 계층적인참조에대한분해등을수행하는과정
Ver1.0 (2008)80한국기술교육대학교 정보기술공학부
6.4.2반복생성문반복생성문 (generate-for문)
generate-endgenerate구문내부에 for 문을사용하여특정모듈또는g g
블록을반복적으로인스턴스
variable 선언, 모듈, UDP, 게이트프리미티브, 연속할당문, initial 블록, l 블록등을인스턴스할수있음always 블록등을인스턴스할수있음
생성문내부의 for-loop에서사용되는인덱스변수는 genvar로선언
for 문의 begin 뒤에생성문블록식별자 (:identifier)를붙여야함g ( )
Ver1.0 (2008)81한국기술교육대학교 정보기술공학부
6.4.2반복생성문
10진수 순환 2진부호 이진부호
표 6.2 순환 2진부호(gray code)와이진부호
0 0000 0000
1 0001 0001
2 0011 00102 0011 0010
3 0010 0011
4 0110 0100
5 0111 0101
6 0101 0110
7 0100 0111
8 1100 1000
9 1101 1001
Ver1.0 (2008)82
9 1101 1001
한국기술교육대학교 정보기술공학부
6.4.2반복생성문
module gray2bin1(bin, gray);parameter SIZE = 4; // this module is parameterizable
generate-for 문을이용한 gray-to-binary 변환기
parameter SIZE 4; // this module is parameterizableoutput [SIZE-1:0] bin;input [SIZE-1:0] gray;genvar i;
generatefor(i=0; i<SIZE; i=i+1) begin :bit
assign bin[i] = ^gray[SIZE-1:i];assign bin[i] gray[SIZE 1:i];end
endgenerateendmodule 코드 6.14
Ver1.0 (2008)83한국기술교육대학교 정보기술공학부
6.4.2반복생성문
generate-for 문을이용한 gray-to-binary 변환기
module gray2bin2(bin, gray);parameter SIZE = 4; output [SIZE-1:0] bin;output [SIZE 1:0] bin;input [SIZE-1:0] gray;reg [SIZE-1:0] bin;genvar i;
generatefor(i=0; i<SIZE; i=i+1) begin :bit
always @(gray[SIZE-1:i])always @(gray[SIZE 1:i]) bin[i] = ^gray[SIZE-1:i];
end endgenerate
코드 6 15endmodule 코드 6.15
Ver1.0 (2008)84한국기술교육대학교 정보기술공학부
6.4.2반복생성문
generate-for 문을이용한 gray-to-binary 변환기
Ver1.0 (2008)85한국기술교육대학교 정보기술공학부
6.4.2반복생성문
참고사항 : always 문을사용하는경우, error 발생
module gray2bin_error (bin, gray);parameter SIZE = 4; output [SIZE-1:0] bin;input [SIZE-1:0] gray;reg [SIZE-1:0] bin, tmp;integer i;integer i;
always @(gray) begintmp = gray;for (i=0; i<SIZE; i=i+1)
bin[i] = ^tmp[SIZE-1:i]; // i should be constantend
endmoduleendmodule
always 문을사용하는경우의올바른코드는 ?
Ver1.0 (2008)86한국기술교육대학교 정보기술공학부
6.4.2반복생성문
module adder gen1(co, sum, a, b, ci);
생성루프외부에 2차원 net 선언을갖는 ripple-carry 가산기
module adder_gen1(co, sum, a, b, ci); parameter SIZE = 4; output [SIZE-1:0] sum; output co; input [SIZE-1:0] a, b;input [SIZE 1:0] a, b; input ci; wire [SIZE :0] c; wire [SIZE-1:0] t [1:3]; // 2차원 net 선언genvar i;genvar i;
assign c[0] = ci; generatefor(i=0; i<SIZE; i=i+1) begin :bit( ; ; ) g :
xor g1( t[1][i], a[i], b[i]); xor g2( sum[i], t[1][i], c[i]); and g3( t[2][i], a[i], b[i]); and g4( t[3][i], t[1][i], c[i]); g ( [ ][ ], [ ][ ], [ ]);or g5( c[i+1], t[2][i], t[3][i]);
end endgenerateassign co = c[SIZE];
코드
Ver1.0 (2008)87
g [ ];endmodule 코드 6.16
한국기술교육대학교 정보기술공학부
6.4.2반복생성문
module adder gen2(co, sum, a, b, ci);
생성루프내부에 2차원 net 선언을갖는 ripple-carry 가산기
module adder_gen2(co, sum, a, b, ci); parameter SIZE = 4; output [SIZE-1:0] sum; output co; input [SIZE-1:0] a, b;input [SIZE 1:0] a, b; input ci; wire [SIZE :0] c; genvar i;
assign c[0] = ci;generatefor(i=0; i<SIZE; i=i+1) begin :bit
wire t1, t2, t3; // generated net declaration, , ; // gxor g1( t1, a[i], b[i]); xor g2( sum[i], t1, c[i]);and g3( t2, a[i], b[i]); and g4( t3, t1, c[i]); g ( , , [ ]);or g5( c[i+1], t2, t3);
end endgenerateassign co = c[SIZE];
Ver1.0 (2008)88
g [ ];endmodule 코드 6.17
한국기술교육대학교 정보기술공학부
6.4.2반복생성문
code 6.16, code 6.17의시뮬레이션결과
Ver1.0 (2008)89한국기술교육대학교 정보기술공학부
6.4.3조건생성문조건생성문 (generate-if 문)
generate-endgenerate블록내에 if-else-if의조건문을generate endgenerate블록내에 if else if의조건문을
사용하여조건에따라특정모듈또는블록을선택적으로인스턴스
모듈, UDP, 게이트프리미티브, 연속할당문, initial 블록, always 블록등을인스턴스할수있음
인스턴스가선택되는조건은 elaboration되는시점에서의값에의해결정
Ver1.0 (2008)90한국기술교육대학교 정보기술공학부
6.4.3조건생성문if 생성문을이용한파라미터화된곱셈기
module multiplier(a, b, product); parameter a_width = 8, b_width = 8; localparam product_width = a_width+b_width;
// b difi d di l i h d f// can not be modified directly with defparam or // module instance statement #
input [a_width-1:0] a; input [b width-1:0] b; put [b_ dt :0] b;output [product_width-1:0] product;
generateif(( idth 8) ||(b idth 8))if((a_width < 8) ||(b_width < 8))
CLA_mul #(a_width, b_width) u1(a, b, product); // instance a CLA multiplier
elseWALLACE_mul #(a_width, b_width) u1(a, b, product); // instance a Wallace-tree multiplier
endgenerated d l 코드 6 19
Ver1.0 (2008)91
endmodule 코드 6.19
한국기술교육대학교 정보기술공학부
6.4.4 case 생성문case 생성문 (generate-case문)
generate-endgenerate블록내에 case문을사용하여조건에따라generate endgenerate블록내에 case 문을사용하여조건에따라특정모듈또는블록을선택적으로인스턴스
모듈, UDP, 게이트프리미티브, 연속할당문, initial 블록, always 블록등을인스턴스할수있음
인스턴스가선택되는조건은 elaboration되는시점에서의값에의해결정
Ver1.0 (2008)92한국기술교육대학교 정보기술공학부
6.4.4 case 생성문
3이하의비트폭을처리하기위한 case생성문
generatecase(WIDTH)
3 이하의비트폭을처리하기위한 case 생성문
1: adder_1bit x1(co, sum, a, b, ci); // 1-bit adder2: adder_2bit x1(co, sum, a, b, ci); // 2-bit adderdefault: adder_cla #(WIDTH) x1(co, sum, a, b, ci);
// carry look-ahead adder endcase
endgenerate 코드 6.20
Ver1.0 (2008)93한국기술교육대학교 정보기술공학부
Verilog HDL을이용한디지털시스템설계및실습
7 task와 함수7. task와 함수
Ver1.0 (2008)94한국기술교육대학교 정보기술공학부
7.1 Task와함수Task와함수
반복되는행위수준모델링부분을독립된코드의 task나함수(function)로반복되는행위수준모델링부분을독립된코드의 task나함수(function)로정의하고, 이들을호출하여사용규모가큰행위수준모델링을작은부분들로분할하여 task 또는함수로표현함
장점
소스코드의가독성 (readability)과디버깅을용이하게함
종류
사용자정의 task, 함수시스템 task, 함수
Ver1.0 (2008)95한국기술교육대학교 정보기술공학부
7.1 Task와함수Function
적어도 개이상의 인수가필요
Task
•적어도 1개이상의 input 인수가필요• output, inout 인수를가질수없음•항상 1개의결과값을 return 함•함수명을통해값을 return
• 0개이상의 input, output, inout 인수포함•값을 return하지않을수있음• output, inout을통해다수개의값을 return
함수명을통해값을 return
zero delay를갖는조합회로구현
• delay, timing, event를갖고, multiple output을반환하는 source code에적용가능t k의 I/O에정의되지않은 d l 내
다른 function 호출가능 (task는불가)
y를갖 회 구
다른 task나 function 호출가능
• task의 I/O에정의되지않은module 내reg로선언된변수 access 가능
zero simulation delay
delay, event, timing control 문포함불가
non-zero simulation time 수행가능
delay, event, timing control 문포함가능
variable 자료형만가질수있으며, net 자료형은가질수없음assign 문, 게이트프리미티브와모듈인스턴스는사용할수없음initial 문과 always 문을포함할수없음b h i l문만포함가능함
Ver1.0 (2008)96
behavioral 문만포함가능함
한국기술교육대학교 정보기술공학부
7.1 Task와함수function과 task의정의및호출
module test (……..);……………
module test (……..);……………
t k t k // t k정의function [n-1:0] func_name; // 함수정의
input ……; // 인수순서중요………….begin
task task_name; // task 정의input ……; // 인수순서중요output ….;inout ……;
begin……….func_name = ……;…….
end
………….begin
……….…….dend
endfunction…….
= func name( ); //함수호출
end endtask…….
t k ( ) // t k호출….. func_name(…); // 함수호출…………endmodule
task_name(…); // task 호출…………endmodule
Ver1.0 (2008)97한국기술교육대학교 정보기술공학부
7.2 TaskTask의정의
task task_identifier(task_port_list);{block_item_declaration}statement;dt kendtask
task task_identifier;{task item declaration} // task의 입력 출력 인수를 선언{task_item_declaration} // task의 입력, 출력 인수를 선언
statement;endtask
Task의호출
인수의순서는 task 정의에서선언된인수목록의순서와일치되어야함
task_enable ::= task_identifier [(expression {, expression} )];
Ver1.0 (2008)98한국기술교육대학교 정보기술공학부
7.2 Task
task my_task;input a, b;inout c;
선언부에서인수를선언
output d, e;begin
. . . // task의 기능을 수행하는 문장들c = foo1; // 결과 값을 reg 변수에 할당하는 문장들c = foo1; // 결과 값을 reg 변수에 할당하는 문장들d = foo2;e = foo3;
endendtask
task my_task(input a, b, inout c, output d, e);begin
의 기능을 수행하는 문장들. . . // task의 기능을 수행하는 문장들
my_task(v, w, x, y, z); // 인수는 순서대로 매핑 task 호출문
Ver1.0 (2008)99한국기술교육대학교 정보기술공학부
7.2 Taskmodule bit_counter (data_word, bit_count);input [7:0] data_word;output [3:0] bit count;p _reg [3:0] bit_count;
always @(data_word)count ones(data word, bit count); // task 호출_ _ , _
task count_ones;input [7:0] reg_a; // 인수가 여러 개인 경우, 순서가 중요함.output [3:0] count;reg [3:0] count;reg [7:0] temp_reg;begincount=0;temp_reg=reg_a; while (temp_reg) begin
if (temp_reg[0]) count=count+ 1;
temp_reg = temp_reg >> 1;end
endendtask
코드
Ver1.0 (2008)100
endmodule 코드 7.1
한국기술교육대학교 정보기술공학부
7.2 Task
코드 7.1의시뮬레이션결과코드 7.1의시뮬레이션결과
Ver1.0 (2008)101한국기술교육대학교 정보기술공학부
7.2 Task
module traffic_lights;reg clock, red, amber, green;parameter on = 1, off = 0, red_tics = 350,
amber tics = 30 green tics = 200;amber_tics = 30, green_tics = 200;//initialize colors.
initial red = off;initial amber = off;initial green = off;
always begin // sequence to control the lights.red = on; // turn red light on and waitred = on; // turn red light on and wait.light(red, red_tics);green = on; // turn green light on and wait.light(green, green_tics); amber = on; // turn amber light on and wait.light(amber, amber_tics);
end코드 7 2
Ver1.0 (2008)102
코드 7.2
한국기술교육대학교 정보기술공학부
7.2 Task
// task to wait for 'tics' positive edge clocks before turning 'color' light off.
task light;output color;input [31:0] tics;
beginrepeat(tics) @(posedge clock);repeat(tics) @(posedge clock);color = off; // turn light off.
endendtask
always begin // waveform for the clock.#100 clock = 0;#100 clock = 1;#100 clock 1;
endendmodule 코드 7.2
Ver1.0 (2008)103한국기술교육대학교 정보기술공학부
7.3함수함수의정의
function [signed][range_type] function_identifier(function_port_list);{block_item_declaration}statement;
endfunction
function [signed][range_type] function_identifier ;{function_item_declaration}statement;
함수결과값의속성및범위지정 [ i d][ t ]
statement;endfunction
함수결과값의속성및범위지정 : [signed][range_type]별도의지정이없으면, default로 1비트 reg형이됨
함수가정의되면함수이름과동일한이름의변수가함수내부에선언됨수가정의되 수이 과동일 이 의 수가 수내부에
함수가정의되는영역에서함수이름과동일한이름의다른객체를선언하는
것이허용되지않음
Ver1.0 (2008)104한국기술교육대학교 정보기술공학부
7.3함수함수의호출
함수의규칙
ftn_call ::= hierarchical_ftn_identifier{attribute_inst}(expr {,expr})
함수의규칙
함수는적어도하나이상의입력인수를포함해야한다.함수는 output과 inout으로선언된어떠한인수도가질수없다.함수는시간제어문장을가질수없다.
함수내부의어떠한구문도타이밍제어(#, @ 또는 wait 등)를포함할수없다.
함수는 task를호출할수없다.함수는함수이름과동일한이름의내부변수에함수의결과값을할당하는
문장을포함한다문장을포함한다.함수는 nonblocking 할당을가질수없다.
Ver1.0 (2008)105한국기술교육대학교 정보기술공학부
7.3함수
function [7:0] getbyte;input [15:0] address;begin // code to extract low-order byte from addressed word
선언부에서인수를선언
. . .getbyte = result_expression;
endendfunction
function [7:0] getbyte(input [15:0] address);begin // code to extract low-order byte from addressed word
. . .getbyte = result_expression;
endendfunction
d t l ? { tb t ( b t ) tb t (l b t )} 0
함수호출
Ver1.0 (2008)106
word = control ? {getbyte(msbyte), getbyte(lsbyte)}:0;
한국기술교육대학교 정보기술공학부
7.3함수
module word_aligner (word_in, word_out);input [7:0] word_in;output [7:0] word out;p [ ] _ ;
function [7:0] word_align;input [7:0] word;b ibegin
word_align = word;if (word_align != 0)while (word align[7] == 0) word align=word align << 1;( _ g [ ] ) _ g _ g ;
endendfunction
i d t d li ( d i ) // 함수 호출assign word_out = word_align (word_in); // 함수 호출
endmodule 코드 7.3
Ver1.0 (2008)107한국기술교육대학교 정보기술공학부
7.3함수
코드 7.3의시뮬레이션결과코드 7.3의시뮬레이션결과
Ver1.0 (2008)108한국기술교육대학교 정보기술공학부
7.3함수module tryfact;// define the function
function automatic integer factorial;function automatic integer factorial;input [31:0] operand;integer i;if(operand >= 2)
factorial = factorial(operand - 1) * operand;else
factorial = 1;endfunctionendfunction
// test the functioninteger result;
0 factorial=11 factorial=12 factorial=2
integer n;initial begin
for(n = 0; n <= 7; n = n+1) beginresult = factorial(n);
2 factorial 23 factorial=64 factorial=245 factorial=120
result factorial(n);$display("%0d factorial=%0d", n, result);
endend
코드
6 factorial=7207 factorial=5040
Ver1.0 (2008)109
endmodule 코드 7.4
한국기술교육대학교 정보기술공학부
Verilog HDL을이용한디지털시스템설계및실습
8 컴파일러 지시어8. 컴파일러 지시어
Ver1.0 (2008)110한국기술교육대학교 정보기술공학부
컴파일러지시어
컴파일러지시어 (Compiler directive)Verilog소스코드의컴파일과정에영향을미치는명령어Verilog 소스코드의컴파일과정에영향을미치는명령어accent grave 문자( ` )로시작된위치에서부터다른컴파일러지시어에의해대체되거나또는컴파일이완료되기까지전체소스파일에영향을미침
단일인용부호( ' )와혼동하지않도록주의
표 8 1 Verilog컴파일러지시어
‘celldefine‘default nettype
‘ifndef‘include
표 8.1 Verilog 컴파일러지시어
_ yp‘define‘else‘elsif
‘line‘nounconnected_drive‘resetallelsif
‘endcelldefine‘endif‘ifdef
resetall‘timescale‘unconnected_drive‘undef
Ver1.0 (2008)111
ifdef undef
한국기술교육대학교 정보기술공학부
8.1 `define과 `undefine‘define
문자치환을위한문자매크로생성에사용문자치환을위한문자매크로생성에사용
C 프로그래밍언어의 #define과유사
문자매크로치환
자주사용되는문자또는상수를의미있는이름으로정의하고, 문자매크로치환을통해정의된값을사용
특정상수 (비트폭 지연등)가회로모델링전체에걸쳐반복적으로사용되는특정상수 (비트폭, 지연등)가회로모델링전체에걸쳐반복적으로사용되는경우에, 문자매크로정의를사용하면소스코드의수정및관리가용이‘macro_name을이용하여소스코드에사용
인수를갖는문자매크로를정의할수있으며, 매크로사용의개별화가가능
‘define wait_state 3'b010 // No semicolon
Ver1.0 (2008)112한국기술교육대학교 정보기술공학부
8.1 `define과 `undefine
text_macro_definition ::= 문자매크로정의‘define text_macro_name macro_text
text_macro_name ::=text_macro_identifier [ ( list_of_formal_arguments ) ]
list_of_formal_arguments ::=formal_argument_identifier { , formal_argument_identifier }
text_macro_identifier ::=simple identifiersimple_identifier
text_macro_usage ::=‘t t id tifi [ ( li t f t l t ) ]‘text_macro_identifier [ ( list_of_actual_arguments ) ]
list_of_actual_arguments ::=actual_argument { , actual_argument }
actual argument ::=actual_argument ::=expression 문자매크로사용
Ver1.0 (2008)113한국기술교육대학교 정보기술공학부
8.1 `define과 `undefine
‘define wordsize 8reg [1:‘wordsize] data;
//define a nand with variable delay‘define var_nand(dly) nand #dly
인수를갖는문자매크로
‘var_nand(2) g121(q21, n10, n11);‘var_nand(5) g122(q22, n10, n11);
Ver1.0 (2008)114한국기술교육대학교 정보기술공학부
8.1 `define과 `undefine‘undefine
이전에정의된문자매크로를해제이전에정의된문자매크로를해제
'define으로정의되지않은문자매크로에대해 ‘undef를정의하면컴파일
시경고메시지가출력
undefine_compiler_directive ::=d f id ifi‘undef text_macro_identifier
Ver1.0 (2008)115한국기술교육대학교 정보기술공학부
8.2 `ifdef, `else, `elsif 등‘ifdef, 'else, 'elsif, 'endif, 'ifndef
Verilog HDL소스코드의일부를조건적으로컴파일하기위해사용Verilog HDL 소스코드의일부를조건적으로컴파일하기위해사용소스의어느곳에서든사용될수있음
모듈에대한여러가지(행위적모델링, 구조적모델링, 스위치수준모델링등) 모델링중하나를선택하여컴파일하는경우
여러가지의타이밍정보나구조적정보(비트폭등) 중하나를선택하여컴파일하는경우컴파일하는경우
시뮬레이션을위해여러가지입력벡터들중하나를선택하는경우
‘ifdef
매크로이름이정의되어있으면, ‘ifdef 이후의소스코드가컴파일에포함매크로이름이정의되어있지않고 ‘else가있으면, ‘else이후의소스코드가컴파일에포함컴파일에포함
‘endif
조건적으로컴파일되는소스코드의경계를나타냄
Ver1.0 (2008)116한국기술교육대학교 정보기술공학부
8.2 `ifdef, `else, `elsif 등‘ifndef
매크로이름이정의되어있지않으면, ‘ifndef이후의코드가컴파일에포함매크로이름이정의되어있고 ‘else지시어가있으면, ‘else이후의코드가컴파일에포함
conditional_compilation_directive ::=ifdef_directive | ifndef_directive
ifdef_directive ::=‘ifdef text_macro_identifierifdef_group_of_lines{ ‘elsif text_macro_identifier elsif_group_of_lines }[ ‘else else group of lines ][ else else_group_of_lines ]‘endif
ifndef_directive ::=‘ifndef text_macro_identifierifndef_group_of_lines{ ‘elsif text_macro_identifier elsif_group_of_lines }[ ‘else else_group_of_lines ]‘endif
Ver1.0 (2008)117
endif
한국기술교육대학교 정보기술공학부
8.2 `ifdef, `else, `elsif 등
module and_op(a, b, c);output a;i t binput b, c;
‘ifdef behavioralwire a = b & c;;
‘elseand a1(a,b,c);
‘endifd d l 코드 8 1endmodule 코드 8.1
Ver1.0 (2008)118한국기술교육대학교 정보기술공학부
8.2 `ifdef, `else, `elsif 등module test(out);
output out;‘define wow‘d fi t‘define nest_one‘define second_nest‘define nest_two
‘ifdef wowinitial $display(“wow is defined”);‘ifdef nest_one
initial $display(“nest_one is defined”);‘ifdef nest_two
initial $display(“nest two is defined”);initial $display( nest_two is defined );‘else
initial $display(“nest_two is not defined”);‘endif‘else
initial $display(“nest one is not defined”);initial $display(“nest_one is not defined”);‘endif
‘elseinitial $display(“wow is not defined”);‘ifdef second_nest
initial $display(“nest_two is defined”);‘else
initial $display(“nest_two is not defined”);‘endif
‘endif코드 8 2
Ver1.0 (2008)119
endmodule 코드 8.2
한국기술교육대학교 정보기술공학부
8.3 `include‘include
파일삽입컴파일러지시어파일삽입컴파일러지시어
소스파일의내용전체를다른소스파일에포함시켜컴파일할때사용
자주사용되는정의나 task 등을별도의파일에만든후, 컴파일과정에서포함시킬때사용
Verilog 소스코드내의어느곳에서든지정의될수있음삽입되는파일은또다른 ‘include컴파일러지시어를포함할수있음삽입되는파일은또다른 include컴파일러지시어를포함할수있음
설계전체에대한구성관리를통합적으로처리할수있음
Verilog 소스코드의효율적인구성및관리가능
include_compiler_directive ::=‘include “filename”
‘include “parts/count.v”‘include “fileB” // including fileB
Ver1.0 (2008)120
// g
한국기술교육대학교 정보기술공학부
8.6 `timescale‘timescale
시간과지연값의측정단위와정밀도를지정시간과지연값의측정단위와정밀도를지정
다른 ‘timescale 지시어가 나타나기 전까지 효력을 유지
timescale_compiler_directive ::=‘timescale time_unit / time_precision
Character string Unit of measurement
d
표 8.2 시간정밀도단위
s seconds
ms milliseconds
us microseconds
ns nanoseconds
ps picoseconds
fs femtoseconds
Ver1.0 (2008)121
fs femtoseconds
한국기술교육대학교 정보기술공학부
8.6 `timescale
‘timescale 1 ns / 1 ps
‘timescale 10 us / 100 ns
‘timescale 10 ns / 1 nsmodule test;
reg set;reg set;parameter d = 1.55; //16ns의 지연으로 변환initial begin
#d set = 0; //16ns에서 set에 0이 할당#d set = 1; //32ns에서 set에 1이 할당
endendmodule 코드 8.3
Ver1.0 (2008)122한국기술교육대학교 정보기술공학부
8.6 `timescale
Timescale directive
(unit/precision)
Delayspecification
Simulatortime step
delay valueused in sim. Conversion
1 ns / ns #4 1 ns 4 ns 4 x 1
1 ns / 100 ps #4 100 ps 4.0 ns 4 x 1
10 / 100 #4 100 40 0 4 1010 ns / 100 ps #4 100 ps 40.0 ns 4 x 10
10 ns / ns #4 1 ns 40 ns 4 x 10
100 ns / ns #4 1 ns 400 ns 4 x 100100 ns / ns #4 1 ns 400 ns 4 x 100
10 ns / 100 ps #4.629 100 ps 46.3 ns round 46.29 to 46.3
10 ns / 1 ns #4.629 1 ns 46 ns round 46.29 to 46
10 ns / 10 ns #4.629 10 ns 50 ns round 46.29 to 50
Ver1.0 (2008)123한국기술교육대학교 정보기술공학부