한국기술교육대학교 장영조
한국기술교육대학교전기전자통신공학부 2
1. 구조적모델링 1. 모듈인스턴스와포트사양 2. 프리미티브게이트 3. 게이트지연시간 4. 파라미터 5. 인스턴스배열 6. generate 블록 2. 데이터플로우모델링 1. 연속할당문 2. 할당지연 3. 동작적모델링 1. 절차형블록 2. 절차형할당문 3. if~else문 4. case 문 5. 반복문 6. 태스크와함수 한국기술교육대학교전기전자통신공학부 3
구조적모델링 다른모듈의인스턴스와포트매핑을통한모델링 범위지정을통한인스턴스배열의생성가능 모듈인스턴스이름은생략할수없음 게이트프리미티브의인스턴스이름은생략가능 포트 (port) - 모듈인스턴스의내부적인신호와외부적인신호를연결하는통신수단 포트순서에의한포트매핑 모듈의포트목록에나열된포트순서와 1:1로대응되어연결 포트에연결되는신호가없는경우에는해당위치를빈칸으로둔다 (,,) 포트이름에의한포트매핑 포트이름과그포트에연결되는신호이름을명시적지정 포트의비트선택, 부분선택, 결합등을사용할수없음.port_name([expression]) 한국기술교육대학교전기전자통신공학부 4
포트목록에나열된포트들은선언부에서포트선언을통해 input, output, inout( 양방향 ) 으로선언 signed와범위에대한정의를포함한포트에관한모든다른속성들이포트선언에포함될수있음 inout_declaration ::= inout [ net_type ][ signed ][ range ] list_of_port_identifiers input_declaration ::= input [ net_type ][ signed ][ range ] list_of_port_identifiers output_declaration ::= 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_identifiers list_of_port_identifiers ::= port_identifier {, port_identifier } 한국기술교육대학교전기전자통신공학부 5
module test(a, b, c, d, e, f, g, h); input [7:0] a, b; // no explicit declaration - net is unsigned input signed [7:0] c, d; // no explicit net declaration - net is signed output [7:0] e, f; // no explicit declaration - net is unsigned output signed [7:0] g, h; // no explicit net declaration - net is signed wire signed [7:0] b; // port b inherits signed attribute from net decl. wire [7:0] c; // net c inherits signed attribute from port reg signed [7:0] f; // port f inherits signed attribute from reg decl. reg [7:0] g; // reg g inherits signed attribute from port 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. 한국기술교육대학교전기전자통신공학부 6
input 및 inout 포트 레지스터형으로선언불가 연속할당문에서 RHS에서사용 인스턴스된모듈이나게이트의입력사용각포트연결은신호소스 (source) 와신호싱크 (sink) 의연속적인할당 output net, 레지스터, 게이트출력, 인스턴스된모듈의출력에연결 연속적인할당의 LHS에사용 input 게이트입력, 인스턴스된모듈의입력, 인스턴스된모듈의입력연결 연속할당문및절차형할당문의 RHS에사용 inout 내부적으로게이트입력이나출력에연결 외부적으로 net 가모듈의출력에연결가능 reg or net inout input net module net net output reg or net net 한국기술교육대학교전기전자통신공학부 7
포트순서에의한포트매핑 모듈의포트목록에나열된포트순서와 1:1로대응되어연결 연결되는신호가없으면해당위치를빈칸으로남겨둔다 포트이름에의한포트매핑 포트이름과그포트에연결되는신호이름을명시적으로지정 포트의비트선택, 부분선택, 결합등을사용할수없음 module tcon (a, b, c, d); inout a, b; input c, d; tranif1 g1(a, b, cont); not #(2, 6) n1(cont nout); and #(6, 5) g2(nout, c, d); module topmod; 순서에의한포트매핑 wire [4:0] v; wire w; tcon U1 (v[0], v[3], w, v[4]); module topmod; 이름에의한포트매핑 wire [4:0] v; wire w; tcon U1 (.b(v[3]),.a(v[0]),.d(v[4]),.c(w)); 한국기술교육대학교전기전자통신공학부 8
code 2.1.1-2 module FA1 (x, y, z, c, s); input x, y, z; output c, s; wire w1, w2, w3; xor (w1, x, y); xor (s, w1, z); and(w2, x, y); and(w3, w1, z); or (c, w2, w3); FA1.v, 프리미티브게이트를사용한전가산기 1 비트전가산기 FA1 의합성회로도 `timescale 1 ns / 1 ns module tbb_fa1 ; reg a, b, cin; integer k; FA1 U0 (a, b, cin, cout, sum); // DUT 모듈인스턴스 initial begin // 시뮬레이션파형생성 forever for(k = 0; k < 8; k = k+1) begin cin = k/4; b =(k%4)/2; a = k%2; #10; 한국기술교육대학교전기전자통신공학부 9
code 2.1.1-3 FA4.v, 4 비트가산기의구조적모델링 module FA4 (x, y, ci, co, s); input [3:0] x, y; input ci; output co; output [3:0] s; wire [3:0] s; wire [3:1] tc; FA1 U0 (x[0], y[0], ci, tc[1], s[0]); FA1 U1 (x[1], y[1], tc[1], tc[2], s[1]); FA1 U2 (x[2], y[2], tc[2], tc[3], s[2]); FA1 U3 (.x(x[3]),.y(y[3]),.z(tc[3]),.c(co),.s(s[3])); // 순서에의한연결 // 이름에의한연결 4 비트전가산기 FA4 의합성블록도 한국기술교육대학교전기전자통신공학부 10
계층적구조 (Hierarchical structure) 인스턴스이름으로계층 (hierarchy) 신호참조 TB (root level) 예제 2.1.1-1 계층이름참조예 U1 (FA4) a,b,ci, sum,co TB TB.a TB.ci TB.U1.U0 TB.U1.U1 TB.U1.U2 TB.sum TB.U1.U3 U0 (FA1) U1 (FA1) U2 (FA1) U3 (FA1) x,y,ci, co,s TB.co TB.U1 TB.U1.U2.x TB.U1.U2.y TB.U1.x TB.U1.U2.s xor_w1 xor_s and_w2 and_w3 or_c x,y,z, c,s, w1,w2,w3 TB.U1.ci TB.U1.co TB.U1.U2.w1 TB.U1.U2.w2 한국기술교육대학교전기전자통신공학부 11
부울식의모델링 ex : gate1.v 의회로도를그리시오. 프리미티브게이트인스턴스 인스턴스이름사용은선택적 순서에의한연결만가능 code 2.1.2-1 gate1.v, 부울식의구조적모델링 module gate1 (x,y,z,f,g); input x, y, z; output f, g; wire w1, w2, w3, w4, w5, w6; not g1 (w1, z); and g2 (w2, x, w1); not g3 (w3, w2); and g4 (w4, x, y, z); and g5 (w5, x, y); nor g6 (w6, y, z); or #(4, 6) g7 (f, w2, w4); or #(5) g8 (g, w3, w5, w6); 한국기술교육대학교전기전자통신공학부 12
3-to-8 디코더 code 2.1.2-3 dec3t8_g.v, 인에이블입력을가진 3-to-8 디코더 ex : dec3t8_g 의회로도를그리시오. module dec3t8_g (en, x, y); input en; input [2:0] x; output [7:0]y; wire w0,w1,w2; not n0 (w0, x[0]); not n1 (w1, x[1]); not n2 (w2, x[2]); and a0 (y[0], en, w0, w1, w2); and a1 (y[1], en, x[0], w1, w2); and a2 (y[2], en, w0, x[1], w2); and a3 (y[3], en, x[0], x[1], w2); and a4 (y[4], en, w0, w1, x[2]); and a5 (y[5], en, x[0], w1, x[2]); and a6 (y[6], en, w0, x[1], x[2]); and a7 (y[7], en, x[0], x[1], x[2]); 한국기술교육대학교전기전자통신공학부 13
JK 플립플롭 Jk_g.v, JK 플립플롭의 code 2.1.2-4 구조적모델링 J clk K g0 g1 g2 g3 Q Qb module jk_g (clk, j, k, q, qb); input clk, j, k; output q, qb; wire w1, w2; wire q, qb; nand g0 (w1, clk, j, qb); nand g1 (w2, clk, k, q); nand g2 (q, w1, qb); nand g3 (qb, w2, q); Ex : jk_g 에대한테스트벤치를작성하고시뮬레이션으로동작을확인하시오. 한국기술교육대학교전기전자통신공학부 14
dlatch_g.v, 3상버퍼를가 code 2.1.2-5 진1 비트D 래치 module dlatch_g (clk, en, d, q, qb); input clk, en, d; output q, qb; wire dn, w1, w2; wire qi, qbi; not n1 (dn, d); nand g1 (w1, clk, d); nand g2 (w2, clk, dn); nand g3 (qi, w1, qbi); nand g4 (qbi, w2, qi); bufif0 g5 (q, qi, en); bufif0 g6 (qb, qbi, en); code 2.1.2-6 TB_dlt.v, dlatch에대한테스트벤치 `timescale 1ns /1 ns module TB_dlt; reg clk=1, en, d; wire q, qb; dlatch_g U1 (clk, en, d, q, qb); // DUT 인스턴스 always #50 clk = ~clk; // 클록발생, T=100 initial begin en = 0; d=1; // time=0, 출력활성화 #210 en = 0; d=0; // time=210 #100 en = 0; d=1; // time=310 #100 en = 1; d=1; // time=410, 출력비활성화 #100 en = 1; d=0; // time=510 #100 en = 1; d=0; // time=610 #100 en = 1; d=1; // time=710 #100 en = 1; d=1; // time=810 한국기술교육대학교전기전자통신공학부 15
지연시간 - 입력평가가완료된후주어진지연시간후에출력이전달되는하드웨어의타이밍동작모델실제하드웨어에서지연시간은필수적으로발생하기때문에시뮬레이션에서이를반영하여동작을확인각게이트가가지는지연시간값을가장실제값에근사하게규정하여나타낼때보다더정확한동작예측 지연시간표현 단일지연시간 - (avg_delay) 2개지연시간 - (rise_delay, fall_delay) 3개지연시간 - (rise_delay, fall_delay, turn-off_delay) 각지연시간은 (min:typ:max) 으로표현할수도있다. - (rise_dly_min: rise_dly_typ: rise_dly_max, fall_dly_min: fall_dly_typ: fall_dly_max) 한국기술교육대학교전기전자통신공학부 16
From value To value 2 개지연값 (d1,d2) 사용 3 개지연값 (d1,d2,d3) 사용 0 1 d1 d1 0 x min(d1, d2) min(d1, d2, d3) 0 z min(d1, d2) d3 1 0 d2 d2 1 x min(d1, d2) min(d1, d2, d3) 1 z min(d1, d2) d3 x 0 d2 d2 x 1 d1 d1 x z min(d1, d2) d3 z 0 d2 d2 z 1 d1 d1 z x min(d1, d2) min(d1, d2, d3) 한국기술교육대학교전기전자통신공학부 17
gate_delay.v, 게이트지연시 code 2.1.3-1 간산정에대한테스트벤치 `timescale 1ns /1ns module gate_delay; rega,b,c,d; wire y1, y2, y3; and #20 (y1, a, b); or #(20,40) (y2, a, b); notif1 #(20,40,60) (y3, c, d); initial begin a = 1; b = 1; c = 1; d = 1; #100 a = 0; b = 0; c = 0; d = 1; #100 a = 0; b = 1; c = 1; d = 0; #100 a = 1; b = 0; c = 0; d = 0; #100 a = 1'bx; b = 1'bx; c = 1'bx; d = 1; 한국기술교육대학교전기전자통신공학부 18
모듈에서사용될상수나표현식에대한이름정의 모듈인스턴스에서재정의가능 code 2.1.4-1 xor8.v 8개의 xor 게이트 module xor8 (output wire [1:8] y, input [1:8] in1, in2); xor (y[8], in1[8], in2[8]), (y[7], in1[7], in2[7]), (y[6], in1[6], in2[6]), (y[5], in1[5], in2[5]), (y[4], in1[4], in2[4]), (y[3], in1[3], in2[3]), (y[2], in1[2], in2[2]), (y[1], in1[1], in2[1]); code 2.1.4-2 xorp.v, 파라미터를사용한 xor 게이트 module xorp # (parameter width = 4, delay = 10) (output wire [1:width] y, input [1:width] in1, in2); assign #(delay) y = in1 ^ in2; // bitwise xor code 2.1.4-3 overp.v, 파라미터를인스턴스할때변경 module overp (output [3:0] y1, y2); reg[3:0] a1, b1, a2, b2; xorp #(.width(4),.delay(0)) u1 (y1, a1, b1); // 이름에의한파라미터 override xorp u2 (y2, a2, b2); // width=4, delay =10, default 한국기술교육대학교전기전자통신공학부 19
계층적이름을사용한파라미터값변경 code 2.1.4-4 Pchange.v, defparam 에의한파라미터변경 module Pchange; defparam // 파라미터재정의시작 overp.u1.delay = 20, //, 로계속됨 overp.u1.width = 12, overp.u2.delay = 10, overp.u2.width = 8; // ; 로끝남 한국기술교육대학교전기전자통신공학부 20
8 비트레지스터의 2 가지구조적모델링비교 code 2.1.5-2 dreg_a.v, 인스턴스배열을사용한 8 비트 D 레지스터 module dreg_a #(parameter size = 8) (output wire [size-1:0] q, input [size-1:0] d, input clk, clr); // 인스턴스배열 dff1 u[size-1:0] (clk, clr, d, q); code 2.1.5-3 dreg8.v, 8 비트 D 레지스터 module dreg8 (output wire [7:0] q, input [7:0] d, input clk, clr); dff1 u7 (clk, clr, d[7], q[7]); dff1 u6 (clk, clr, d[6], q[6]); dff1 u5 (clk, clr, d[5], q[5]); dff1 u4 (clk, clr, d[4], q[4]); dff1 u3 (clk, clr, d[3], q[3]); dff1 u2 (clk, clr, d[2], q[2]); dff1 u1 (clk, clr, d[1], q[1]); dff1 u0 (clk, clr, d[0], q[0]); 한국기술교육대학교전기전자통신공학부 21
모듈인스턴스의생성 모듈, 프리미티브게이트, 연속할당문, initial/always 블록등의인스턴스를하나또는다수개생성 net, reg, integer, real, time, realtime 및 event 등의자료형을생성영역내에서선언가능 생성된인스턴스는고유의식별자를가지며계층적이름으로참조가능생성문의종류 반복생성문 (generate~for) 조건생성문 (generate~if) case 생성문 (generate~ case) genvar 선언 생성문의내부에서만사용되는인덱스변수의선언 생성문의외부혹은내부에서 genvar로선언된변수는정수형으로인덱스를갖는반복생성문내에서사용되는지역 (local) 변수 시뮬레이터또는논리합성툴의 elaboration 과정동안에만정의되며, 시뮬레이션또는합성이진행되는동안에는존재하지않음 elaboration : 시뮬레이션이나합성을위해모듈을분석하는과정 구문의오류검출, 인스턴스된모듈의연결 (link), parameter 값의전달, 계층적인참조에대한분해등을수행하는과정 한국기술교육대학교전기전자통신공학부 22
반복생성문 (generate-for 문 ) generate-generate 구문내부에 for 문을사용하여특정모듈또는블록을반복적으로인스턴스 variable 선언, 모듈, UDP, 게이트프리미티브, 연속할당문, initial 블록, always 블록등을인스턴스할수있음 생성문내부의 for-loop에서사용되는인덱스변수는 genvar로선언 for 문의 begin 뒤에생성문블록식별자 (:identifier) 를붙여야함 한국기술교육대학교전기전자통신공학부 23
generate ~ for 예 code 2.1.6-1 xor_for.v, 반복생성문 module xor_for #(parameter width = 4, delay =10) (output wire [1:width] y, input [1:width] in1, in2); generate genvar i; // 반복인덱스변수선언 for (i = 1; i <= width; i=i+1) begin: xi assign #delay y[i] = in1[i] ^ in2[i]; generate 프리미티브게이트사용 generate genvar i; for (i = 1; i <= width; i=i+1) begin: xi xor #delay u (y[i], in1[i], in2[i]); generate 4 개의할당문과동일 assign #delay y[1] = in1[1] ^ in2[1]; assign #delay y[2] = in1[2] ^ in2[2]; assign #delay y[3] = in1[3] ^ in2[3]; assign #delay y[4] = in1[4] ^ in2[4]; always 블록인스턴스 output reg [1:width] y;... generate genvar i; for (i = 1; i <= width; i=i+1) begin: xi always @(*) y[i] = in1[i] ^ in2[i]; generate 한국기술교육대학교전기전자통신공학부 24
Gray-to-Bin 변환기 - always 인스턴스사용 module gray2bin2(bin, gray); parameter SIZE = 4; output [SIZE-1:0] bin; input [SIZE-1:0] gray; reg [SIZE-1:0] bin; genvar i; generate for(i=0; i<size; i=i+1) begin : gb1 always @ (gray[size-1:i]) bin[i] = ^gray[size-1:i]; generate 한국기술교육대학교전기전자통신공학부 25
리플캐리가산기 code 2.1.6-3 rca_for.v, 반복생성문에의한리플캐리가산기 module rca_for (a, b, ci, co, sum ); parameter size = 4; input [size-1:0] a, b; input ci; output co; output wire [size-1:0] sum; wire [size:0] c; genvar i; assign c[0] = ci; generate for(i=0; i<size; i=i+1) begin : ra wire t1, t2, t3; // 생성되는로칼 net 선언 xor 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]); or g5 (c[i+1], t2, t3); generate assign co = c[size]; 한국기술교육대학교전기전자통신공학부 26
if~ 생성문 - 모듈인스턴스, 연속할당문, UDP, 프리미티브, initial, always 블록등을인스턴스 code 2.1.6-4 mult_if.v, if 조건생성문을사용한승산기 module mult_if (x, y, prod); parameter x_wid = 8, y_wid = 8; localparam prod_wid = x_wid + y_wid; // localparam으로선언된파라미터는 defparam나모듈인스턴스 # 에서변경불가 input [x_wid-1:0] x ; input [y_wid-1:0] y; output wire [prod_wid-1:0] prod; generate if( (x_wid < 8) (y_wid < 8) ) CLA_mult #(x_wid, y_wid) u1 (x, y, prod); // CLA 승산기인스턴스 else WALLACE_mult #(x_wid, y_wid) u2 (x, y, prod); // Wallace-tree 승산기인스턴스 generate 한국기술교육대학교전기전자통신공학부 27
generate 블록내에 case 조건에따라특정모듈혹은블록을선택적으로인스턴스 code 2.1.6-5 rca_case.v, case 생성문을사용한리플캐리가산기 module rca_case #(parameter size = 4) ( input [size-1:0] a, b, input cin, output reg [size-1:0] sum, output reg co, neg, ov ); reg [size-1:0] c; generate genvar i; for (i = 0; i< size; i=i+1) begin: stage case(i) 0: begin always @(*) begin sum[i] = a[i] ^ b[i] ^ cin; c[i] = a[i] & b[i] b[i] & cin a[i] & cin; size-1: begin always @(*) begin sum[i] = a[i] ^ b[i] ^ c[i-1]; co = a[i] & b[i] b[i] & c[i-1] a[i] & c[i-1]; neg = sum[i]; // 부호 ov = co ^ c[i-1]; // overflow default: begin always @(*) begin sum[i] = a[i] ^ b[i] ^ c[i-1]; c[i] = a[i] & b[i] b[i] & c[i-1] a[i] & c[i-1]; case generate 한국기술교육대학교전기전자통신공학부 28