MPW Chip 제작을 위한 ASIC 설계 교육(1일차 교육) 1 2 3 4 5 Verilog Verilog Verilog Verilog Verilog HDL의 기본 문법(I) : DUT 기술 HDL의 기본 문법(II) : Test Bench 작성 HDL을 사용한 디지털 회로 기술 시뮬레이터 기본 HDL 실습 동의대학교 컴퓨터공학과 교수 최 병 윤 1 Semi-Custom Design Flow Design Flow 설계 사양 Front-End Design Back-End Design Verification 2 Semi-Custom Design Flow Front-End Design Flow HDL Description Functional Simulation Synthesis Hierarchy Flatten Pad 셀의 추가 Verilog 형식으로 저장 Gate-Level Simulation Verilog Netlist 최종 Netlist 3 Semi-Custom Design Flow Simulation & Verification Flow HDL Design Functional Simulation Synthesis Place & Route Gate Level Simulation Post Layout Simulation SDF FAB 4 MPW 칩 제작을 위한 Verilog HDL 기본 z Verilog HDL - IEEE 표준 ( IEEE Std 1364-1995) Verilog HDL의 언어 사양 Simulation용 논리 합성 initial, $display for, while assign, if~else always specify $width fork, join library 용 5 Verilog HDL 기본 : DUT 기술 Verilog HDL 구조 module 모듈명 (port_list); port 선언 reg 선언 wire 선언 parameter 선언 하위 모듈 호출 always, initial 문 function, task 정의문 assign 문 등 function, task 호출문 endmodule 6 Verilog HDL 기본 : DUT 기술 z Full Adder(FA) 설계 HA ain bin s temp-s sum a s HA a c b b cin c t2 carry temp_c sum ain bin cin FA carry 7 Verilog HDL 기본 : DUT 기술 <ha.v> module ha (a, b, c, s); input a, b; output c, s; wire c, s; assign c = a & b; assign s = a ^ b; endmodule 8 Verilog HDL 기본 : DUT 기술 <fa.v> module fa (ain, bin, cin, sum, carry); input ain, bin, cin; output sum, carry; wire temp_s, temp_c, t2; ha u0 (ain, bin, temp_c, temp_s); ha u1 (temp_s, cin, t2, sum); assign carry = t2 | temp_c; endmodule 9 Verilog HDL 기본 : DUT 기술 <fa_test_1.v> module fa_test_1 ; reg ax, bx, cx; wire sum_x, carry_x; parameter STEP =100; // DUT Instantiation fa u0 (ax, bx, cx, sum_x, carry_x); // Test vector initial begin ax=0; bx=0; cx=0; #STEP // #100 ax=0; bx=0; cx=1; 10 Verilog HDL 기본 : DUT 기술 #STEP // #100 ax=0; bx=1; cx=0; #STEP // #100 ax=0; bx=1; cx=1; #STEP // #100 ax=1; bx=0; cx=0; #STEP // #100 ax=1; bx=0; cx=1; #STEP // #100 ax=1; bx=1; cx=0; #STEP // #100 ax=1; bx=1; cx=1; #STEP // #100 ax=1; bx=1; cx=1; #STEP $stop; #STEP $finish; end 11 Verilog HDL 기본 : DUT 기술 // result check initial begin $monitor ($time, "ain=%b, bin = %b, cin = %b : sum_x = %b, carry = %b ", ax, bx, cx, sum_x, carry_x); end endmodule 12 Verilog HDL 기본 : DUT 기술 module 구성 - 사용 가능 식별자 : 영문, 숫자, underscore(_) - C언어와 같이 대 소 문자 구별 <module 구조> module module명 (port-list); port 선언 net 선언 reg 선언 parameter 선언 assign문 function문 task문 initial 문 always문 function호출문 task 호출문 하위 모듈문 endmodule (예) port 선언 예 input ck, res; // 입력 input [7:0] bus1, bus2; // 입력 버스 신호 output busy; // 출력 신호 inout [15:0] dbus; (예) net 선언 예 wire enbl; wire [7:0] bus; (예) register 선언 예 reg ff1, ff2; reg [3:0] cnt4; reg [7:0] mem[0:255]; (예) parameter 선언 예 parameter STEP=1000; parameter HALT=2’b00, INT=2’b01, ACTION=2’b10; // state parameter MEMSIZE=1024; reg [7:0] mem[0:MEMSIZE-1]; // parameter 사용 예 13 Verilog HDL 기본 : DUT 기술 module item과 statement - module은 module_item 으로 구성 - statement문은 initial, always, function (module_item)문 내에 사용 < module_item> <statement> Gate 호출 하위 모듈 호출 initial문 always문 assign문 function문 task 문 function 호출 task 호출 if 문 case문 for문 while문 repeat문 begin-end block fork-join block 등 14 Verilog HDL 기본 : DUT 기술 논리값과 수치 표현 z Verilog-HDL에서 사용하는 논리 값 - 0, 1, x(unknown), z(high-impedance) - 신호의 strength(supply, strong, pull, large, weak, medium, small, high-z) (default strength =strong) (예) strong0, strong1 - 신호의 strength는 simulation 에만 사용하고, 합성 시에는 제외 z 상수의 표현 형식 : <bit width>´<base><value> 여기서 bit width : bit 폭을 나타내는 10진수(default = 32-bit) base : b,B : binary, o, O : octal, d, D : decimal, h, H : hexadecimal (default = decimal) value : 기수에 대응하는 상수 값 (예: base가 octal인 경우 : 0 ~7, x, z) ㈜ 구분을 위해 underscore(_)사용 15 Verilog HDL 기본 : DUT 기술 상수 표현 예 수치상수 10 1´b1 8´haa 4´bz 8´b0000_11xx ´hff 4´d5 비트 폭 32 1 8 4 8 32 4 기수(base,radix) 10 2 16 2 2 16 10 2진수 표현 00…01010 1 10101010 zzzz 000011xx 00…011111111 0101 16 Verilog HDL 기본 : DUT 기술 데이터 타입(data type) z 신호(변수)의 선언 - 프로그램안에 사용되는 신호(변수)는 모두 형을 선언해야 함 1). Register 형(reg로 선언) : latch나 F/F(값을 보존 ) - 개념상 일반 프로그래밍 언어의 변수 개념 2). Net 형 (wire로 선언한 것) : 실제적인 연결관계를 나타내는 배선 z 신호(변수) 사용상 제약 사항 - 모든 형의 참조 시에는 제약이 없음 - 모든 형은 식의 우변에 사용하거나 function의 인수로 사용 가능 - 단, 대입(식의 왼편에 놓이는 경우)시에 제약 사항 [제약 1] reg형의 신호로의 대입은 always, initial, task, function문에서만 사용 [제약 2] wire형으로의 대입은 assign문에서만 사용 z type(형) 선언의 생략 - port 신호의 경우 net형인 경우 일반적으로 생략 가능 - 1-bit wire는 생략 가능(default = 1-bit wire) - multi-bit wire는 생략 불가능 ㈜ assign 문에 의해 할당되는 wire의 경우, 형 선언 생략 불가능 17 Verilog HDL 기본 : DUT 기술 z 데이터 형 예 module DEF(CK, D, Q); input CK, D; output Q; wire CK, D; // 생략 가능 reg Q; always @(posedge CK) Q = D; endmodule module RSFF(SB, RB, Q); input SB, RB; output Q; wire temp; // 생략 가능 nand na1 (Q, SB, temp); nand na2 (temp, Q, RB); endmodule 18 Verilog HDL 기본 : DUT 기술 z Event 선언과 event의 기동 Verilog HDL에서 사용하는 데이터 형 1 물리 데이터 형 : 회로 표현에 사용 - register 형 - net 형 2 추상 데이터 형 : 시뮬레이션 프로그램안에서 사용 - integer : 정수형 32 비트 부호화 정수 - time : 동기형 64 비트 무부호 정수 - real : 실수형 - event : 이벤트 형( 값을 갖지 않는 특수한 변수로 타이밍 제어에 사용) event 형 변수 선언 event outflag; 호출측에서 event 구동 형식 -> outflag; // -> event 변수 event 발생을 기다리는 문 @(outflag) …………….. 19 Verilog HDL 기본 : DUT 기술 z 다 bit 신호 - 신호 선언 시에 [MSB:LSB] 형식으로 비트 폭과 범위 지정 - 다 비트 신호는 ⎡무부호 정수⎦로 취급됨 (예) inout [3:0] a, b; // 4 비트 입력 a, b wire [7:0] dbus ; // 8 비트의 net 신호 reg [7:0] addr_hi; // 8 비트의 register 신호 z 다 bit 신호의 bit 선택 (예) 다 비트 신호를 1 비트 단위로 access할 경우 assign MSB = dbus[7]; assign LSB = dbus[0]; assign dbus[4] = half_carry; z다 비트 신호의 부분 선택 (예) wire [3:0] Hi_digit; assign Hi_digit=addr_hi[15:12]; (예) wire [3:0] Lo_digit; assign dbus[3:0] =Lo_digit; 20 Verilog HDL 기본 : DUT 기술 register 배열(memory) z register 형으로 선언된 배열 (예) reg [7:0] mem[0:255]; // 256 words * 8-bit memory ㈜ register 배열은 bit 선택과 부분 선택 불가 - word 단위의 access만 허용 - bit 선택과 부분 선택이 필요할 경우, 2단계 처리 필요 - programming 언어와 같은 다차원 배열은 불가 z 워드 단위의 access 예 (예) mem[0] z 비트 선택이나 부분 선택 예 - 임시 net를 사용한 2단계 처리 필요 (예) wire [7:0] temp; assign temp = mem[100]; // 단계 1: word 단위 access …………….. temp[7] // mem[100]의 최상위 비트 : bit 단위 access temp[3:0] // mem[100]의 하위 4 비트 : 부분 선택 21 Verilog HDL 기본 : DUT 기술 연산자 연산자 기능 연산자 산술연산 + * / % 가산, plus 부호 감산, minus 부호 승산 제산 잉여 Bit 연산 ~ & | ^ ~^ NOT AND OR XOR XNOR reduction 연산 & ~& | ~| ^ ~^ AND NAND OR NOR XOR XNOR 기능 == != === !== 논리연산 논리 부정 논리 AND 논리 OR 논리연산 equal not equal equal(x,z도 비교) not equal(x, z도 비교) < <= > >= 관계연산 Less than less than or equal to larger than larger than or equal to ! && || << >> ?: {} Shift 연산 left shift right shift 기타 연산 조건 연산 concatenation 22 Verilog HDL 기본 : DUT 기술 z Equality operator 1). Logical equality(==) 2). Logical inequality(!=) 3). Case equality(===) 4). Case inequality(!==) 식 표현 동작 설명 반환 결과 a ==b Operand에 x, 또는 z가 있는 경우 결과 x 0, 1, x a !=b Operand에 x, 또는 z가 있는 경우 결과 x 0, 1, x a ===b Operand에 있는 x, 또는 z, 0, 1의 모든 일치 비교 0, 1 a !==b Operand에 있는 x, 또는 z, 0, 1의 모든 불일치 비교 0, 1 23 Verilog HDL 기본 : DUT 기술 연산자의 우선 순위 *, /, % highest +, <<, >> <, <=, >, >= ==, !=, ===, !== & ^, ^~ | && 24 Verilog HDL 기본 : DUT 기술 연접 연산(concatenation operator) z 연접 연산자를 대입문의 우변에 사용 wire [15:0] addr_bus; assign addr_bus = {addr_hi, addr_lo}; // addr_hi, addr_lo는 8 비트 신호 z 연접 연산을 대입문의 우변에 사용 wire [3:0] a, b, sum; wire carry; assign {carry, sum} = a + b; // 4 비트 데이터의 덧셈은 5 비트 결과 ㈜ verilog HDL에서는 비트 폭이 일치하지 않는 변수의 연산이나 대입이 허용됨 1 좌변이 5 비트 이므로, 좌변의 a+b는 MSB에 0을 붙인 5 비트로 연산 됨 2 대입의 좌변이 우변 보다 비트 폭이 작을 경우, MSB는 누락되어 저장 25 Verilog HDL 기본 : DUT 기술 z 연접 연산을 활용한 반복 연산 - 연접 연산자를 쌍으로 사용 (예) {4{2’b01}} // 8’b01010101 (예) wire [15:0] word; wire [31:0] double; assign double = { {16{word[15]}}, word}; 26 Verilog HDL 기본 : DUT 기술 Reduction 연산 - 항 머리에 연산자를 붙이는 단항 연산자 - 사용 연산자 : &, ~, ^, | - 비트 폭을 가진 신호내의 모든 비트에 작용하며, 연산 결과는 1 비트 값 (예) reg [7:0] cnt; assign all_one = &cnt; assign parity = ^cnt; assign all_one = cnt[7] & cnt[6] & cnt[5] & cnt[4] & cnt[3] & cnt[2] & cnt[1] & cnt[0] ; assign parity = cnt[7] ^ cnt[6] ^ cnt[5] ^ cnt[4] ^ cnt[3] ^ cnt[2] ^ cnt[1] ^ cnt[0] ; 27 Verilog HDL 기본 : DUT 기술 Verilog HDL이 갖는 primitive function - port내 위치가 output이 가장 앞에 위치하고, 그 뒤에 input이 나옴 - single output 형태 Gate and nand nor or xor xnor buf not bufif0 bufif1 notif0 notif1 pullup pulldown MOS switches and Bidirectional Transistors nmos pmos cmos rnmos rpmos rcmos tran tranif0 tranif1 rtran rtranif0 rtranif1 Net wire wand wor tri triand trior supply0 tri1 supply1 tri0 형식 1 : primitive_gate명 (output, input1, input2, ….); 형식 2: // bufif0, bufif1, notif0, notif1 primitive_gate명 (output, input, control); 28 Verilog HDL 기본 : DUT 기술 Port 선언과 연결 규칙 z Port 선언 Verilog keyword Port의 형 input 입력 port output 출력 port inout 양방향 port -모든 port는 default로 wire로 인식됨 - port가 wire인 경우는 input, output, inout 선언 만으로 충분 - 단, output port의 경우 그 값이 hold되어야 하는 경우 (initial, always문 내 우변 변수) Î 추가적으로 reg 선언이 필요 - input과 inout port는 reg 선언 불가능 29 Verilog HDL 기본 : DUT 기술 z Port 연결 규칙 - port는 2개의 unit측면으로 시각화 가능 1). module 내부 측면 2). module 외부 측면 net net net or reg input net inout output net net or reg 1). input - 내부적 측면 : 항상 net로 선언 - 외부적 측면 : reg 또는 net 형의 변수 연결 2). output - 내부적 측면 : reg 또는 net 형의 변수 연결 - 외부적 측면 : net에 연결 (reg 연결 불가) 3). inout - 내부적 측면 : 항상 net로 선언 - 외부적 측면 : 항상 net에 연결 30 Verilog HDL 기본 : DUT 기술 initial 문과 always 문 비교 initial always 시각=0 반복 실행 1회만 실행 31 Verilog HDL 기본 : DUT 기술 Procedural Statement module test; ………… initial begin ……… ………. end always begin ………. ………. end <순차처리 블록> begin – end 내부 문장은 순차 처리 : label 첨가 가능 개별적인 initial, always문은 병렬 동작 (always만 합성 가능 ) always begin ………. ………. end endmodule 32 Verilog HDL 기본 : DUT 기술 z Clock 정의 기법 CLK STEP/2 STEP/2 1 clock정의 : initial과 always 문 사용 2 clock정의 : always 문 사용 // single-phase clock reg clk; // 1 주기 = 100 unit parameter STEP =100; always #(STEP/2) clk = ~clk; // single-phase clock reg clk; // 1 주기 = 100 unit parameter STEP =100; always begin clk =1; #(STEP/2) clk = 0; #(STEP/2); end initial clk =1; 33 Verilog HDL 기본 : DUT 기술 timing 제어 - #< 정수식> : 정수 값에 따라 지정된 시간 만큼 처리가 지연됨 - @<event식> : <EVENT식>에 의해 지정된 EVENT가 발생할 때까지 처리를 지연 시킴 <EVENT식>에 포함되는 접두어 * posedge : 상승 edge * negedge : 하강 edge (접두어가 생략될 경우, 상 • 하강 edge에서 event 발생 ) (예) always 문에서 사용 예 // always문에서 사용 예 always #(STEP/2) CLK = ~CLK; always @(posedge CLK) begin …….. end 34 Verilog HDL 기본 : DUT 기술 Register 변수형에 대한 대입문의 2가지 형태 1). blocking 대입 : 형식 : reg 변수 = 식; 2). non-blocking 대입 - blocking 문이 사용되는 위치에 모두 사용 가능 형식 : reg 변수 <= 식; 35 Verilog HDL 기본 : DUT 기술 Blocking 문과 nonblocking 문 동작 비교 z Blocking 대입(초기 a=5, b=4, c=7 가정) z non-blocking 대입(초기 a=5, b=4, c=7가정) ……………... always @(posedge clk) begin ……… always @(posedge clk) begin a =b; // b=a=4 c =a; // c=b=a=4 a <=b; // b=a =4 c <=a; // c=a_old=5 end …….. end …….. 합성 시 1개의 F/F 생성 a b D b c a D Q D Q Q c clk clk clk 36 Verilog HDL 기본 : DUT 기술 z if 문 형식 - always, initial, function 문 내에 존재 < 형식 1> < 형식 2> ……………….. always @(…..) begin …………………. ……………….. always @(…..) begin …………………. if (조건 1) statement 1; else if (조건 2) statement 2; ………………. else if (조건 n) statement n; else statement (n+1); ………………… end if (조건) statement; ………………… end 37 Verilog HDL 기본 : DUT 기술 Case 문 형식 module decoder (in, out); input [1:0] in; output [3:0] out; reg [3:0] out; always @(in) begin case (in) 2´b00 : out = 4´b0001; 2´b01 : out = 4´b0010; 2´b10 : out = 4´b0100; 2´b11 : out = 4´b1000; default : out = 4’b0000; endcase end endmodule 38 Verilog HDL 기본 : DUT 기술 for문 while 문 - C 언어의 for문과 유사한 동작 수행 (예) // for문 예 ……………………. integer i; parameter STEP =1000; initial begin for (i=0; i=256; i=i+1) begin #STEP din =mem[i]; end end ……………………… - C 언어의 while문과 유사한 동작 수행 (예) // while 문 예 ……………………. parameter STEP =1000; initial begin ………………… while (BUSY) #100; …………………. end ……………………… ㈜ #STEP이 없으면simulation time이 진행되지 않아, BUSY=0이 되는 것이 불가능해지는 무한 루프에 들어감 39 Verilog HDL 기본 : DUT 기술 tasks와 function tasks와 function 비교 function Function은 0 simulation time 가짐 ( no delay) 어떠한 delay문, event, 또는 timing control 문 포함 불가 적어도 하나의 input 존재 필요 (다수 입력 가능 ) 항상 하나의 값을 return - 인수로 output과 inout을 가질 수 없음 - return시 함수 명을 통해 반환 Tasks Non-zero simulation time 수행 가능 delay문, event, 또는 timing control 문 포함 가능 0개 또는 다수개의 input, output, inout문 포함 가능 값을 return하지 않으며, output과 inout argument를 통해 다수개의 결과를 pass 가능 zero delay를 갖는 Combinational logic 구현 -Delay, timing, event을 갖고, Multiple output을 반환하는 Verilog code에 적용 가능 input port input, inout, output port 40 Verilog HDL 기본 : DUT 기술 z function과 task의 일반적인 구조 module test (……..); …………… module test (……..); …………… function [n-1:0] func_name; // 함수 정의 input ……; // 인수 순서 중요 …………. begin ………. func_name = ……; ……. end endfunction ……. task task_name; // 함수 정의 input ……; // 인수 순서 중요 output ….; inout ……; …………. begin ………. ……. end endtask ……. ….. = func_name(…); // 함수 호출 ………… endmodule task_name(…); // task 호출 ………… endmodule 41 Verilog HDL 기본 : DUT 기술 parity 계산을 수행하는 function module parity; …………. reg [31:0] addr; wire parity; function cal_parity; input [31:0] address; begin cal_parity = ^address; // 함수 명으로 address의 bitwise xor값을 반환 end endfunction ………………... assign parity = calc_parity(addr); // cal_parity 함수 호출 ………. …….. endmodule 42 Verilog HDL 기본 : DUT 기술 module에 정의된 reg변수를 사용하는 task의 사용 예 - task의 output 인수로 정의되어 있지 않은 외부 module의 reg 변수 조작 module sequence; ………. reg clock; ………. task init_sequence; begin clock = 1’b0; end endtask task asymmetric_sequence; begin #12 clock=1’b0; #5 clock =1’b1; ……….. end endtask …………… initial init_sequence; // init_sequence task를 호출 ………….. always begin asymmetric_sequence ; end …………….. endmodule 43 Verilog HDL 기본 : DUT 기술 `include directive 기능 - 기존의 verilog HDL 코드(library)를 현재 verilog HDL 코드에 포함시킴 (C언어의 #include 기능) - 모듈의 내외 어느 쪽도 배치 가능 (예) `include “header.v” …………… module test; ……….. endmodule 44 Verilog HDL 기본 : DUT 기술 `define 문 - Text 치환 용도로 사용하는 compiler 지시어 (예) `define A lzc_top.izc_addr No semicolon ………………….. initial $monitor(“dicptr=%h”, `A.dicptr); 45 Verilog HDL 기본 : DUT 기술 time scale command 형식 : `timescale <reference_time_unt> / <time_precision> 여기서 reference time : time과 delay 측정 단위 time_precision : round-off precision (예) `timescale 100ns / 1ns module dumm1; reg toggle; initial toggle = 1’b0; always #5 begin toggle = ~toggle; end endmodule ㈜ 5 time unit= 5 * 100 = 500ns 46 Verilog HDL 기본 : Test Bench Program 작성 기본 z 검증용 top module의 HDL 프로그램 구조 module test_bench; reg 선언 // 입력 신호 wire 선언 // 출력 신호 local 변수 선언 검증 대상(DUT) 호출 Simulation model 호출 Task 정의 Test 입력 program : initial 문 사용하여 검증 시작 및 task 호출 등 표시 : 동작 관측 endmodule 47 Verilog HDL 기본 : Test Bench Program 작성 기본 Test Bench 프로그램 -검증 대상 회로(DUT)를 제외한 프로그램 대입문과 상대 지연을 통한 순차 입력 [단계 1] 검증 대상 회로의 입력에 연결된 변수를 reg 변수로 선언 [단계 2] 검증 대상 회로의 출력에 연결된 변수를 wire 형으로 선언 [단계 3] initial 문에서 reg 변수에 대한 순차적인 대입을 통해 test pattern 구현 (형식 : #delay값 ) (예) module test_fix; reg A, B, C; circuit c1 (A, B, C); 150 200 A 50 initial begin A=0; B=1; C=0; #50 A=1; #50 A=0; C=1; #50 C=0; #50 $finish; end endmodule 100 50 50 50 50 B C 48 Verilog HDL 기본 : Test Bench Program 작성 기본 clock edge에 대한 상대적인 지연을 이용하는 방식 initial begin …………. @(posedge CLK) #10 DATA = din; #10 WEB = 0; #10 WEB=1; @(posedge CLK) …………… end initial 문 내에 사용 (@(posedge CLK) 는 clock의 edge 감지 ) 49 Verilog HDL 기본 : Test Bench Program 작성 기본 File값으로 memory 초기화 형식 : $readmemb(“<file_name>”, <memory_name>, <start_addr>, <finish_addr>); $readmemh(“<file_name>”, <memory_name>, <start_addr>, <finish_addr>); $writememb(“<file_name>”, <memory_name>, <start_addr>,<finish_addr> ); $writememh(“<file_name>”, <memory_name>, <start_addr>, <finish_addr>); (예) module test; reg [7:0] memory[0:7]; // 8-byte memory 선언 integer i; initial begin $readmemb(“init.dat”, memory); for (i=0; i <8; i = i+1) $display(“Memory [%0d] = %b”, i, memory[i]); end endmodule <init.dat 파일> @002 11111111 01010101 00000000 00000000 @6 1111zzzz 00001111 읽기/쓰기의 시작주소 읽기/쓰기의 종료주소 주소 값(16진수) 50 Verilog HDL 기본 : Test Bench Program 작성 기본 z 테스트 입력을 파일에서 읽어 들이는 방법 - ‘1’과 ‘0’으로 구성된 “패턴 파일’을 작성하여 저장한 후, 이것을 읽어 들여 test stimulus로 사용하는 방식 Test Pattern File < 입력 파일 : patfile.txt> 100001010 100001010 000001010 110110110 010110110 101001100 WEB WEN DIN[7:0] DUT DIN(8-bit) 51 Verilog HDL 기본 : Test Bench Program 작성 기본 z Verilog HDL에서 file access - file 내용을 register file에 저장한 후 사용 ……………… reg WEB; reg [7:0] DIN; reg [8:0] pat, pattern[0:9999]; integer i; initial begin $readmemb(“patfile.txt”, pattern); WEB =1; DIN=8´b0; for (i=0; i <100; i=i+1) begin pat = pattern[i]; #STEP WEB = pat[8]; DIN = pat[7:0]; end $finish; end …………….. 52 Verilog HDL 기본 : Test Bench Program 작성 기본 z Task(procedure)를 사용한 테스트 패턴 입력 - 대규모 시스템 검증에 효율적 - 입력 신호를 인수로 하여 신호의 패턴(순서)를 정의하여, 이를 재활용하는 기법 memory에 대한 write bus sequence 형태 A[1:0] DIN[7:0] WEB 53 Verilog HDL 기본 : Test Bench Program 작성 기본 Task를 사용한 Test Pattern 입력 예 ……………………….. reg [1:0] A; reg [7:0] DIN; reg WEB; // register 쓰기 task 정의 task write_reg; input [1:0] addr; input [7:0] data; begin #25 A = addr; #25 DIN = data; #25 WEB = 0; #200 WEB =1; #25 ; end endtask parameter CMD_REG =2´b00, DATA_REG=2´b01; // register 쓰기 task 호출 initial begin write_reg(CMD_REG, 8´h03); write_reg(DATA_REG, 8´h03); end …………… endmodule 54 Verilog HDL 기본 : Test Bench Program 작성 기본 Simulation의 실행을 제어하는 system task z $stop - simulation을 중단하고, 대화모드(interactive mode)가 됨 z $finish - simulation의 완전한 종료 (예) initial begin ………. // 특정 조건으로 simulation 중단 if ( ….) $stop; ……….. #STEP ……. #STEP $stop; #STEP …….. #STEP $finish; end 55 Verilog HDL 기본 : Test Bench Program 작성 기본 Simulation의 출력 프로그램 z $monitor와 $display의 차이점 1). $monitor - 한번 호출되면 계속해서 실행된다. - 표시해야 할 신호에 변화가 있을 때만 출력 ( initial문중에 1회 정의로 충분) 2). $display - 호출될 때만 실행됨 - 신호의 변화가 없더라도 출력 ( initial문에서 반복 호출 필요 ) 56 Verilog HDL 기본 : Test Bench Program 작성 기본 (예) $monitor의 사용 예 initial $monitor($time, “addr=%h data =%h”, addr, data); (예) $display 의 사용 예 initial begin #STEP $display($time, “addr=%h data =%h”, addr, data); #STEP $display($time, “addr=%h data =%h”, addr, data); ……………. end (예) $display의 사용 예 always @r begin $display (“r=%d at time %d”, r, $time); end 57 Verilog HDL 기본 : Test Bench Program 작성 기본 출력 format 특수 문자 \n 줄바꿈 \t tab \\ Backspace(\) \” “ %% % 각종 format (대문자도 가능) %h 16진수 %d 10진수 %o 8진수 %b 2진수 %c 문자 %s 문자열 ㈜ %0d : 상위측의 0이나 공백 제거 표시 58 Verilog HDL 기본 : Test Bench Program 작성 기본 계층 access - dot(.)로 계층 구조 내 신호를 access함 (예) 모듈 Top내에 속한 모듈 BLK_A내의 신호 A를 access하는 경우 TOP.BLK_A.A 모듈 이름이 아닌 instance 이름 형식 Instance명 • Instance명• 신호명 59 Verilog HDL 기본 : Test Bench Program 작성 기본 File값으로 memory 초기화 형식 : $readmemb(“<file_name>”, <memory_name>, <start_addr>, <finish_addr>); $readmemh(“<file_name>”, <memory_name>, <start_addr>, <finish_addr>); $writememb(“<file_name>”, <memory_name>, <start_addr>,<finish_addr> ); $writememh(“<file_name>”, <memory_name>, <start_addr>, <finish_addr>); (예) module test; reg [7:0] memory[0:7]; // 8-byte memory 선언 integer i; initial begin $readmemb(“init.dat”, memory); for (i=0; i <8; i = i+1) $display(“Memory [%0d] = %b”, i, memory[i]); end endmodule <init.dat 파일> @002 11111111 01010101 00000000 00000000 @6 1111zzzz 00001111 읽기/쓰기의 시작주소 읽기/쓰기의 종료주소 주소 값(16진수) 60 Verilog HDL 기본 : Test Bench Program 작성 기본 File 접근 System Task - 결과값을 Text File로 저장 integer descriptor; // integer 형으로 file descriptor 선언 ………………….. descriptor = $fopen(“file_name”); $fdisplay (descriptor, “….. %b, ….., %h”, a, b); $fmonitor (descriptor, “…..%b, ….., %h”, a, b); fclose(descriptor); 61 Verilog HDL 기본 : Test Bench Program 작성 기본 File 접근 시스템 Task 사용 예 module FPU_test (); …… integer result; ……….. initial result =$fopen(“FPU.dat”); always begin forever @(posedge clk) #20 $fdisplay(result, “at time = %0d \n”, $time, “ a = %b, b=%b”, a, b); end ….. endmodule MPW 제작 시 설계된 회로의 3가지 조건 (Normal, Worst, Best) 의 Post-Timing Simulation시 모든 Pin 신호를 Clock Edge에 맞추어, sampling하여 File에 저장하여, UNIX의 diff command로 3가지 조건이 동일한 결과를 갖는지 비교 62 Verilog HDL을 사용한 디지털 회로 기술 논리 합성 모듈(회로 프로그램)에 가장 널리 사용되는 5가지 유형 z assign문에 의한 조합 회로: 단순한 조합 회로 z always문에 의한 조합 회로 : 복잡한 조합 회로 z function문에 의한 조합 회로 : 복잡한 조합 회로 z always문에 의한 순서 회로 : Latch, F/F 소자 포함 z 하위 모듈 호출 63 Verilog HDL을 사용한 디지털 회로 기술 논리식을 사용한 gate 회로 - assign 문을 사용한 gate 회로 구현 (예) assign 문 사용 예 module gate_exp (in0, in1, in2, out_not, out_and2, out_and3, out_and_or); input in0, in1, in2; output out_not, out_and2, out_and3, out_and_or; // 1 입력 assign out_not = ~in0; // 2 입력 assign out_and2 = in0 & in1; // 3 입력 assign out_and3 = in0 & in1 & in2; // and_or 구현 assign out_and_or = in0 & in1 | in2; endmodule 64 Verilog HDL을 사용한 디지털 회로 기술 Primitive gate를 사용한 gate 회로 - Verilog HDL이 제공하는 기본 gate primitive 사용 (예) primitive gate 사용 예 module gate_prm (in0, in1, in2, out_not, out_and2, out_and3); input in0, in1, in2; output out_not, out_and2, out_and3; // 1 입력 not n1 (out_not, in0); // 2 입력 and an2 (out_and2, in0, in1); // 3 입력 and an3 (out_and3, in0, in1, in2); endmodule 65 Verilog HDL을 사용한 디지털 회로 기술 MUX 회로 구현 - 여러 가지 구현 방안 가능 2 2 in0 sel in0[0] out[0] out in1 sel in1[0] in0[1] out[1] in1[1] z 조건 연산자를 사용한 2-to-1 mux z AND-OR gate를 사용한 2-to-1 mux module sel2to1_cond (in0, in1, sel, out); input [1:0] in0, in1; input sel; output [1:0] out; module sel2to1_andor (in0, in1, sel, out); input [1:0] in0, in1; input sel; output [1:0] out; assign out = (sel==1) ? in1 : in0; assign out[0] = (~sel & in0[0]) | (sel & in1[0]); assign out[1] = (~sel & in0[1]) | (sel & in1[1]); endmodule endmodule 66 Verilog HDL을 사용한 디지털 회로 기술 z if 문을 사용한 2 to 1 mux z case 문을 사용한 2 to 1 mux module sel2to1_if (in0, in1, sel, out); input [1:0] in0, in1; input sel; output [1:0] out; module sel2to1_case (in0, in1, sel, out); input [1:0] in0, in1; input sel; output [1:0] out; function [1:0] select; // 함수 정의 (no port-list) input [1:0] in0, in1; // 호출 시 순서 중요 input sel; function [1:0] select; // 함수 정의 (no port-list) input [1:0] in0, in1; // 호출 시 순서 중요 input sel; if (sel ==0) select = in0; else select = in1; endfunction case (sel) 0 : select = in0; 1 : select = in1; endcase endfunction assign out =select(in0, in1, sel) ; // 함수 호출 assign out =select(in0, in1, sel) ; // 함수 호출 endmodule endmodule 67 Verilog HDL을 사용한 디지털 회로 기술 4-to-1 mux 구현 z if 문과 function문을 사용한 4-to-1 mux in[0] in[1] out in[2] in[3] sel 2 z 조건 연산자를 사용한 4-to-1 mux module sel4to1_cond (in, sel, out); input [3:0] in; input [1:0] sel; output out; assign out = (sel ==2´h0) ? in[0]: (sel ==2´h1) ? in[1]: (sel ==2´h2) ? in[2]: in[3]; endmodule module sel4to1_if (in, sel, out); input [3:0] in; input [1:0] sel; output out; function select; input [3:0] in; input [1:0] sel; if (sel ==2´h0) select = in[0]; else if (sel ==2´h1) select = in[1]; else if (sel ==2´h2) select = in[2]; else select = in[3]; endfunction assign out = select(in, sel); endmodule 68 Verilog HDL을 사용한 디지털 회로 기술 <참고 > casex (sel) 2´b00 : select =in[0]; 2´b01 : select =in[1]; 2´b1? : select =in[2]; endcase <3 종류 case문의 특성> case : x, z까지를 포함해서 일치 비교 casez : z는 don’t care 간주 casex : x, z는 don’t care 간주 z case x 문을 사용한 3-to-1 mux module sel3to1_casex (in, sel, out); input [2:0] in; input [1:0] sel; output out; function select; input [2:0] in; input [1:0] sel; casex (sel) 2´b00 : select =in[0]; 2´b01 : select =in[1]; 2´b1x : select =in[2]; endcase endfunction assign out = select(in, sel); endmodule 69 Verilog HDL을 사용한 디지털 회로 기술 z always 문에 의한 한 조합 회로 - 복잡한 조합회로는 always문으로 프로그래밍함 (예) module mux_4_3 (Y, D, S); input [0:3] D ; input [0:1] S; output Y; reg Y; always @(S or D) begin case(S) 0 : Y = D[0]; 1 : Y = D[1]; 2 : Y = D[2]; 3 : Y = D[3]; endcase end endmodule 입력 변수 모두 기술 필요 70 Verilog HDL을 사용한 디지털 회로 기술 2-to-4 Decoder 구현 z case 문과 function문을 사용한 decoder in[0] out[0] out[1] out[2] out[3] in[1] z 등호 연산을 사용한 decoder module decoder_equal (in, out); input [1:0] in; output [3:0] out; assign out[0] = (in==2´b00); assign out[1] = (in==2´b01); assign out[2] = (in==2´b10); assign out[3] = (in==2´b11); module decoder_case (in, out); input [1:0] in; output [3:0] out; function [3:0] dec; input [1:0] in; case (in) 2´b00 : dec = 4´b0001; 2´b01 : dec = 4´b0010; 2´b10 : dec = 4´b0100; 2´b11 : dec = 4´b1000; endcase endfunction assign out = dec(in); endmodule endmodule 71 Verilog HDL을 사용한 디지털 회로 기술 z case 문과 always문을 사용한 decoder module decoder_case (in, out); input [1:0] in; output [3:0] out; reg [3:0] out; always @(in) begin case (in) 2´b00 : out = 4´b0001; 2´b01 : out = 4´b0010; 2´b10 : out = 4´b0100; 2´b11 : out = 4´b1000; endcase end endmodule 72 Verilog HDL을 사용한 디지털 회로 기술 encoder 구현 z casex문을 사용한 encoder out[0] module encoder_case (in, out); input [3:0] in; output [1:0] out; out[1] function [1:0] enc; input [3:0] in; in[0] in[1] in[2] in[3] if (in[3]) enc = 2´b11; else if (in[2]) enc = 2´b10; else if (in[1]) enc =2´b01; else enc = 2´b00; casex (in) 4´b1xxx : enc = 2´b11; 4´b01xx : enc = 2´b10; 4´b001x : enc = 2´b01; 4´b000x : enc = 2´b00; endcase endfunction assign out = enc(in); endmodule 73 Verilog HDL을 사용한 디지털 회로 기술 z case 문을 사용한 ALU ALU 구현 A[7:0] B[7:0] ALU Zero _det zero module alu (alu_out, zero, opcode, a, b); input [7:0] a, b; input [1:0] opcode; output [7:0] alu_out; output zero; reg [7:0] alu_out; reg zero; alu_out[7:0] Opcode[1:0] always @(opcode or a or b) case (opcode) 2´b00 : alu_out = a & b; 2´b01 : alu_out = a | b; 2´b10 : alu_out = a ^ b ; 2´b11 : alu_out = a; endcase always @(alu_out) begin if (!alu_out) zero =1; else zero =0; end endmodule 74 Verilog HDL을 사용한 디지털 회로 기술 ROM 구현(합성 가능 ROM) 8 4 addr data // 조합회로로 만든 ROM module rom(addr, data); input [3:0] addr; output [7:0] data; function [7:0] romout; input [3:0] addr; case(addr) 0 : romout=0; 1 : romout=1; 2 : romout=4; …….. 15 : romout =255; endcase endfunction assign data=romout(addr); // function 호출 endmodule 75 Verilog HDL을 사용한 디지털 회로 기술 3-state 신호의 프로그래밍 z 3-state 신호의 일반적인 구조 enable enable 8 Dout 8 8 bus bus 8 DIO 8 enable1 8 8 8 8 8 8 din dbus bus1 enable2 8 Dout bus2 enable3 bus3 76 Verilog HDL을 사용한 디지털 회로 기술 3-state 출력에 대한 HDL module tri_out(DOUT, ….); output [7:0] DOUT; …….. wire [7:0] bus; assign DOUT =(enable) ? ~bus : 8´hz; ……….. endmodule 3-state bus에 대한 HDL Bidirectional pin에 대한 HDL module tri_out(DIO, ….); inout [7:0] DIO; …….. wire [7:0] bus; wire [7:0] din; …….. assign din = ~DIO; assign DIO =(enable) ? ~bus : 8´hz; ……….. endmodule module tri_out( ….); …….. wire [7:0] dbus; wire [7:0] dout; …….. assign dbus =(enable1) ? ~bus1 : 8´hz; assign dbus =(enable2) ? ~bus2 : 8´hz; assign dbus =(enable3) ? ~bus3 : 8´hz; ……….. assign dout = ~dbus; endmodule 77 Verilog HDL을 사용한 디지털 회로 기술 D-Latch - transparent 특성( sensitivity list : D, G 포함) D module DLATCH (G, D, Q); input G, D; output Q; reg Q; Q 감지 list에 G, D 포함 G always @(G or D) if (G) Q = D; // Q <= D; endmodule D-F/F - edge-trigger 특성( sensitivity list : CLK만 ) D module DFF (CLK, D, Q); input CLK, D; output Q; reg Q; Q CLK 감지 list에 CLK만 포함 always @(posedge CLK) Q = D; // Q <= D; endmodule 78 Verilog HDL을 사용한 디지털 회로 기술 비동기 set/reset 기능을 갖는 D F/F - reset과 set 신호는 비동기 active low 동작 합성 시 2개의 F/F을 생성하는 비효율적 설계 SB D Q CLK QB RB …………………… reg Q, QB; always @(posedge CLK or negedge RB or negedge SB) begin if (RB==0) Q <= 0; else if (SB==0) Q<=1; else begin Q <= D; // Q <= D; QB <= ~D end end module DFF_SR (CLK, D, Q, QB, RB, SB); 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; else Q <= D; // Q <= D; end assign QB = ~Q; // correct design 기법 endmodule 79 Verilog HDL을 사용한 디지털 회로 기술 동기 set/reset 기능을 갖는 D F/F - reset과 set 신호는 동기 active low 동작 - LD 신호 추가 (LD=0Î 이전 값 유지, LD=1 Î 새로운 D 입력 받음) D LD SB Q CLK QB module DFF_SR_sync (CLK, D,LD, Q, QB, RB, SB); input CLK, D, LD, RB, SB; output Q, QB; reg Q; RB 감지 리스트에 클록 만 포함됨 always @(posedge CLK) begin if (RB==0) Q <= 0; else if (SB==0) Q<=1; else if (LD) Q <= D; // Q <= D; end assign QB = ~Q; 우선 순위 : RB > SB> LD endmodule 80 Verilog HDL을 사용한 디지털 회로 기술 Binary counter 4 Res CLK Q // 덧셈 연산자를 사용한 counter module counter (clk, res, Q) input clk, res; output [3:0] Q; reg [3:0] Q; always @(posedge clk) // synchronous reset begin if (res) Q <= 4´h0; else Q <= Q + 4´h1; end endmodule always @(posedge clk or posedge res) // asynchronous reset 81 State Machine Mealy Machine X/Y : 0/00 출력 input x : input, y : output S0 조합회로 1/11 Present state S1 Next state S2 State register clk reset Moore Machine 0 reset clk x : S0 -----00 출력 input 조합회로 1 Next state State register decoder S1 ----11 x : input, State --------output S2 ----00 Present state 82 Finite State Machine Moore Machine의 설계 - 2개의 always 문 사용 방식 - 3개의 always 문 사용 방식 <상태도> Reset=1 S0 --------000 1 0 0 S1 --------001 1 1 S2 --------011 0 S3 --------111 1 0 <회로도> clk Y[2:0] x Moore_2P reset 83 2개의 always 문을 사용한 Moore FSM module moore_fsm_2a (clk, reset, x, z); input clk, reset, x; output [2:0] z; reg [2:0] z; // state reg [2:0] state; parameter [1:0] s0=0, s1=1, s2=2, s3=3; // state transition : P1 always @(posedge clk or posedge reset) begin if (reset) state <= s0; else case (state) s0 : if (x==1’b1) state <= s1; else state <=s0; s1 : if (x == 1’b0) state <= s2; else state <=s1; s2 : if (x == 1’b1) state <= s3; else state <= s2; s3 : if (x == 1’b0) state <= s0; else state <= s3; endcase end // output description : P3 always @(state) begin case ( state) s0 : z <=3’b000; s1 : z <=3’b001; s2 : z <= 3’b011; s3 : z <= 3’b111; endcase end endmodule clk P1 input 출력 조합회로 Next state State register Decoder (P3) Present state reset 84 1개의 always 문과 1개의 assign 문을 사용한 Moore FSM module moore_fsm_2a (clk, reset, x, z); input clk, reset, x; output [2:0] z; wire [2:0] z; // state reg [2:0] state; parameter [1:0] s0=0, s1=1, s2=2, s3=3; // state transition : P1 always @(posedge clk or posedge reset) begin if (reset) state <= s0; else case (state) s0 : if (x==1’b1) state <= s1; else state <=s0; s1 : if (x == 1’b0) state <= s2; else state <=s1; s2 : if (x == 1’b1) state <= s3; else state <= s2; s3 : if (x == 1’b0) state <= s0; else state <= s3; endcase end // output description : P3 assign z[2] = (state == s3); assign z[1] = (state ==s2) | (state == s3); assign z[0] = (state == s1) | (state == s2) | (state == s3); endmodule clk P1 input 출력 조합회로 Next state State register Decoder (P3) Present state reset 85 3개의 always 문을 사용한 Moore FSM clk module moore_fsm_3a (clk, reset, x, z); input clk, reset, x; output [2:0] z; reg [2:0] z; // state reg [2:0] present_state, next_state; parameter [1:0] s0=0, s1=1, s2=2, s3=3; // next state logic : P1 always @(present_state or x) begin case (present_state) s0 : if (x==1’b1) next_state <= s1; else next_state <=s0; s1 : if (x == 1’b0) next_state <= s2; else next_state <=s1; s2 : if (x == 1’b1) next_state <= s3; else next_state <= s2; s3 : if (x == 1’b0) next_state <= s0; else next_state <= s3; endcase end Input (x) 조합회로 (P1) Next state Present state State register (P2) 출력 (z) Decoder (P3) reset // state register : P2 always @(posedge clk or posedge reset) begin if ( reset) present_state <= s0; else present_state <= next_state; end // output logic : P3 always @(present_state) begin case ( present_state) s0 : z <=3’b000; s1 : z <=3’b001; s2 : z <= 3’b011; s3 : z <= 3’b111; endcase end endmodule 86 Moore Machine에 대한 검증 : Test Bench Program < 검증 조건 > 초기에 Reset 신호를 가하여 FSM을 초기화한 후 입력 값으로 1 > 1 > 0 > 0 > 1 인가하여 FSM의 출력과 상태 변화를 확인하는 테스트 벤치 프로그램을 작성하고, 동작 검증 (비 동기 Reset 사용) CLK reset 1 1 1 0 x 0 ? z[2:0] state[1:0] ? 87 Moore Machine에 대한 검증 : Test Bench Program Moore Machine 검증 프로그램 module moore_fsm_test; // input signal reg clk, reset, xin; // output wire [2:0] zout; parameter STEP = 100; // DUT instantiation moore_fsm_2a moore_2a (clk, reset, xin, zout) ; // moore_fsm_3a moore_3a (clk, reset, xin, zout) ; // Test stimulus generation always #(STEP/2) clk = ~clk; initial begin clk=0; reset =1; x=0; #STEP reset =0; x=1; #STEP x=1; #STEP x=0; #STEP x=0; #STEP x=1; #(STEP *3) $stop; #STEP $finish; end NC_Verilog 용도 (Modelsim 불필요) // result check initial begin $shm_open(“moore_fsm.shm"); $shm_probe("AC"); #(10 * STEP); $shm_close(); end endmodule 88 Moore Machine에 대한 검증 : Test Bench Program NC-Verilog 검증 파형 89 Finite State Machine Mealy Machine의 설계 - 2개의 always 문 사용 방식 - 3개의 always 문 사용 방식 <상태도> Reset=1 1/000 S0 0/001 S1 1/011 S2 0/111 S3 0/001 1/011 1/000 0/111 <회로도> clk Y[2:0] x Mealy_2P reset 90 2개의 always 문을 사용한 Mealy Machine : (p1: 상태 정의, p2: 출력 정의) module mealy_fsm_2a (clk, reset, x, z); input clk, reset, x; output [2:0] z; reg [2:0] z; // state reg [2:0] state; parameter [1:0] s0=0, s1=1, s2=2, s3=3; // state transition : P1 always @(posedge clk or posedge reset) begin if (reset) state <= s0; else case (state) s0 : if (x==1’b1) state <= s1; else state <=s0; s1 : if (x == 1’b0) state <= s2; else state <=s1; s2 : if (x == 1’b1) state <= s3; else state <= s2; s3 : if (x == 1’b0) state <= s0; else state <= s3; endcase end // output description : P3 always @(state or x) begin case ( state) s0 : if (x == 1’b1) z <=3’b000; else z <= 3’b111; s1 : if (x==1’b1) z <=3’b000; else z <= 3’b001; s2 : if (x == 1’b1) z <= 3’b011; else z <= 3’b001; s3 : if (x == 1’b1) z <= 3’b011; else z <= 3’b111; endcase end Decoder (P3) Input (x) 출력 (z) 조합회로 Present state P1 State register clk reset endmodule 91 1 개의 always 문과 1개의 assign 문을 사용한 Mealy Machine : (p1: 상태 정의, p2: 출력 정의) module mealy_fsm_2a (clk, reset, x, z); input clk, reset, x; output [2:0] z; wire [2:0] z; // state reg [2:0] state; parameter [1:0] s0=0, s1=1, s2=2, s3=3; // state transition : P1 always @(posedge clk or posedge reset) begin if (reset) state <= s0; else case (state) s0 : if (x==1’b1) state <= s1; else state <=s0; s1 : if (x == 1’b0) state <= s2; else state <=s1; s2 : if (x == 1’b1) state <= s3; else state <= s2; s3 : if (x == 1’b0) state <= s0; else state <= s3; endcase end // output description : P3 assign z[2]=(state ==s0) & (x==1’b1) | (state == s3) & (x==1’b0); assign z[1] =(state ==s0) & (x==1’b0) | (state == s2) & (x==1’b1) | (state == s3); assign z[0] =(state ==s0) & (x==1’b0) | (state ==s1) & (x ==1’b0) | (state == s2) | (state ==s3); endmodule Decoder (P3) Input (x) 출력 (z) 조합회로 Present state P1 State register clk reset 92 3개의 always 문을 사용한 Mealy Machine : (p1: 상태 정의, p2: 출력 정의) module mealy_fsm_3a (clk, reset, x, z); input clk, reset, x; output [2:0] z; reg [2:0] z; // state reg [2:0] present_state, next_state; parameter [1:0] s0=0, s1=1, s2=2, s3=3; // next state logic : P1 always @(present_state or x) begin case (present_state) s0 : if (x==1’b1) next_state <= s1; else next_state <=s0; s1 : if (x == 1’b0) next_state <= s2; else next_state <=s1; s2 : if (x == 1’b1) next_state <= s3; else next_state <= s2; s3 : if (x == 1’b0) next_state <= s0; else next_state <= s3; endcase end // state register : P2 always @(posedge clk or posedge reset) begin if ( reset) present_state <= s0; else present_state <= next_state; end Decoder (P3) input 조합회로(P1) 출력 Next state State register (P2) Present state clk reset // output logic : P3 always @(present_state or x) begin case ( present_state) s0 : if (x == 1’b1) z <=3’b000; else z <= 3’b111; s1 : if (x==1’b1) z <=3’b000; else z <= 3’b001; s2 : if (x == 1’b1) z <= 3’b011; else z <= 3’b001; s3 : if (x == 1’b1) z <= 3’b011; else z <= 3’b111; endcase end endmodule 93 Mealy Machine에 대한 검증 : Test Bench Program < 검증 조건 > 초기에 Reset 신호를 가하여 FSM을 초기화한 후 입력 값으로 1 > 1 > 0 > 0 > 1 인가하여 FSM의 출력과 상태 변화를 확인하는 테스트 벤치 프로그램을 작성하고, 동작 검증 (비 동기 Reset 사용) CLK reset 1 1 1 0 x 0 ? z[2:0] state[1:0] ? 94 Mealy Machine에 대한 검증 : Test Bench Program Mealy Machine 검증 프로그램 module mealy_fsm_test; // input signal reg clk, reset, xin; // output wire [2:0] zout; parameter STEP = 100; // DUT instantiation mealy_fsm_2a mealy_2a (clk, reset, xin, zout) ; // mealy_fsm_3a mealy_3a (clk, reset, xin, zout) ; // Test stimulus generation always #(STEP/2) clk = ~clk; initial begin clk=0; reset =1; x=0; #STEP reset =0; x=1; #STEP x=1; #STEP x=0; #STEP x=0; #STEP x=1; #(STEP *3) $stop; #STEP $finish; end // result check NC_Verilog 용도 (Modelsim 불필요) initial begin $shm_open(“mealy_fsm.shm"); $shm_probe("AC"); #(10 * STEP); $shm_close(); end endmodule 95 Mealy Machine에 대한 검증 : Test Bench Program NC-Verilog 검증 파형 96 Verilog Simulator 기본 사용법 Test Fixture Test Stimulus & Result Verification DUT (Device Under Test) 97 Verilog Simulator 기본 사용법 다수개의 파일로 된 경우 Verilog-XL로 검증 방안 fa_test (예) ha.v fa.v fa_test.v 인 경우 1 단순하게 모든 파일을 명시하는 방안 fa ha ha % verilog ha.v fa.v fa_test.v 2 Test Bench Program에 DUT를 include하는 방식 ( fa_test.v 파일 내에 `include 지시어로 ha.v와 fa.v가 포함지시 된 경우) % verilog fa_test.v 3 하나의 파일로 만드는 방안 (일반적으로 DUT 파일만 통합) % cat *.v > Test_all.v % verilog Test_all.v <cmdfile> 4 파일명을 포함하는 하나의 파일(예: cmdfile) 생성 % vi cmdfile % verilog –f cmdfile fa_test.v fa.v ha.v -q 98 Verilog HDL 설계 실습 4-bit counter < DUT 파일> // counter.v module counter(clk,reset, q ); input clk,reset; output [3:0] q; reg [3:0] q; always @(posedge clk or posedge reset) begin if(reset) q = 4'h0; else q = q + 4'h1; end endmodule q[4:0] 4-bit counter CLK reset 99 Verilog HDL 설계 실습 <Test Bench 파일> // counter_tv.v // `include "counter.v“ module counter_tv; reg clk,reset; wire [3:0] q; parameter step =100; counter counter(clk,reset,q); always #(step/2) clk = ~clk; initial begin clk = 1'b0; reset = 1'b0; #step reset = 1'b1; #step reset = 1'b0; #(step *18) $stop; $finish; end initial begin $shm_open("counter.shm"); $shm_probe(“as"); #(step * 19); $shm_close(); end endmodule 파형 저장 폴더 100 Verilog HDL 설계 실습 Verilog-XL 실행 화면 % verilog counter.v counter_tv.v Error시 라인 정보와 모듈 알려줌 >· $stop에 의해 정지된 작업 계속 101 Verilog HDL 설계 실습 simvision 실행 % simvision Simvision 실행 화면 102 Verilog HDL 설계 실습 결과 DB 정보 읽음 - *. trn 파일 1 File -> Open Database 2 counter.shm 선택 후 open 버튼 누름 103 Verilog HDL 설계 실습 3 counter.trn 파일 선택 104 Verilog HDL 설계 실습 counter.trn을 선택하여 open한 경우 화면 105 Verilog HDL 설계 실습 Top-level scope와 하위 child scope을 선택한 후, waveform window로 보냄 top-level scope 선택 후, drag top-level scope를 click한 후, pop-up menu에서 “select deep” 선택 2 Send selected object(s) to target waveform windows 1 106 Verilog HDL 설계 실습 Waveform Window - 결과 파형 107 Verilog HDL 설계 실습 선택된 신호를 Register Window에 표시 - clock edge 에서 신호 값의 분석에 용이 Send selected object(s) to target register windows 108 Verilog HDL 설계 실습 register window 화면 109 Verilog HDL 설계 실습 clock edge에서 counter 동작 분석 1 primary cursor 선택 Drop_down list에서 TimeA 선택 110 Verilog HDL 설계 실습 2 waveform window에서 primary cursor를 이동시킴에 따라 Register Window의 신호 변환 분석 Register Window Primary Cursor 111 Verilog HDL 설계 실습 clock edge에서의 신호 값 분석 1 clk 선택 3 click함에 따라 primary cursor가 clock의 상·하강 edge에 맞추어 이동 2 primary cursor를 적절한 위치로 설정 112 실습 과제 1 : ALU 설계 DUT 기술 : 8-bit ALU ALU_c[2:0] OP 000 A+B 001 A-B 010 B 011 -B 100 A and B 101 A or B 110 A xor B 111 Not(A) Left-side 폭을 고려한 9-bit inversion 방지 module alu (a, b, sum, cout, alu_c); input [7:0] a, b; input [2:0] alu_c; output [7:0] sum; output cout; reg [7:0] sum; reg cout; always @(alu_c or a or b) case (alu_c) 3´b000 : {cout, sum} = a + b ; 3´b001 : {cout, sum} = a +( (~b) & 8’hff)+ 1’b1; 3´b010 : {cout, sum} = {1’b0, b} ; 3´b011 : {cout, sum} = ((~b) & 8’hff) + 1’b1; 3´b100 : {cout, sum}= {1’b0, a & b}; 3´b101 : {cout, sum}= {1’b0, a | b}; 3´b110 : {cout, sum} = {1’b0, a ^ b} ; 3´b111 : {cout, sum} = {1’b0, ~a}; endcase endmodule 113 실습 과제 1 : ALU 설계 Test Bench Program (I) DUT를 include함 `include “alu.v” module alu_test; reg [7:0] a, b; reg [2:0] alu_c; reg clk; wire[7:0] sum; wire cout; parameter T = 100; // --- ALU --alu u0 (a, b, sum, cout, alu_c); // clock generator always #(T/2) clk= ~clk ; initial clk = 1’b0; 114 실습 과제 1 : ALU 설계 // Test Vector generation initial begin a = 8’b10101010; // a= 0xaa b = 8’b11110000; // b = 0xf0; alu_c = 3’b000; // ADD #T alu_c = 3’b001; // Sub #T alu_c = 3’b010; // B #T alu_c = 3’b011; // -B #T alu_c = 3’b100; // A and B #T alu_c = 3’b101; // A or B #T alu_c = 3’b110; // A xor B #T alu_c = 3’b111; // not(A) #(3 *T) $stop; #T $finish; end 115 실습 과제 1 : ALU 설계 initial begin $shm_open(“alu.shm"); $shm_probe(“as"); #2500 ; Wave File 생성 폴더 모듈의 모든 Signal 관측 관측시간 $shm_close(); end endmodule 116 실습 과제 1 : ALU 설계 Simvision 결과 파형 117 실습 과제 2 : pipelined 4-bit adder(I) z 회로도 4 bin 4 Reg Reg ain ain_r cin 1 clk Reg bin_r cin_r t_carry + t_sum 1 Reg clk 4 Reg 4 carryout sumout 118 실습 과제 2 : pipelined 4-bit adder(II) z DUT에 대한 Verilog HDL Code module adder4 (ain, bin, cin, clk, sumout, carryout); input [3:0] ain, bin; input cin; input clk; output [3:0] sumout; output carryout; reg carryout, cin_r; reg [3:0] ain_r, bin_r, sumout; wire [3:0] t_sum; wire t_carry; always @(posedge clk) begin carryout <= t_carry; sumout <= t_sum; cin_r <= cin; ain_r <= ain; bin_r <= bin; end assign {t_carry, t_sum} = ain_r + bin_r + cin_r; endmodule 119 실습 과제 2 : pipelined 4-bit adder(III) z 4-bit adder에 대한 Test Bench 프로그램(adder4_test.v) module test_adder4; reg [3:0] ain,bin; // input signals reg cin, clk; wire [3:0] sumout; // output signals wire carryout; parameter STEP =100; // DUT instantiation adder4 u0 (ain, bin, cin, clk, sumout, carryout); // clock definition always #(STEP/2) clk = ~clk; // Test Stimulus initial begin clk=1'b0; ain = 4'h0; bin = 4'h0; cin=1'b0; #STEP ain = 4'h4; bin = 4'h4; cin=1'b1; #STEP ain = 4'hc; bin = 4'hd; cin=1'b0; #STEP ain = 4'hf; bin = 4'hd; cin=1'b0; #STEP ain = 4'hf; bin = 4'hf; cin=1'b1; #STEP $stop; #STEP $finish; end 120 실습 과제 2 : pipelined 4-bit adder(III) initial begin $shm_open(“pipeadd_new.shm”); $shm_probe(“AS”); #2500; $shm_close(); end endmodule 121 실습 과제 2 : pipelined 4-bit adder(III) Simvision 결과 파형 122 실습 과제 3 : Binary-to-Gray Converter <실습 과제> Binary-to-Gray Code Converter 회로를 설계하고, Verilog HDL로 표현한 후, 이를 Simulation하여 그 결과를 PC 화면에 출력 B[3:0] B[3] B[2] G[3:0] Bin-to-Gray Converter G[3] G[2] B[1] G[1] B[0] G[0] 10진 값 0 1 2 3 4 Binary Code 0000 0001 0010 0011 0100 GRAY Code 0000 0001 0011 0010 0110 5 6 7 8 9 10 11 12 13 14 15 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000 Gray Code : 인접한 수 사이에 1 비트만 다른 특징 123 실습 과제 4 : ½ Divider 설계 설계 사양: 1/ 2-divider(분주기) 회로를 설계하고, Verilog HDL로 표현한 후, 이를 Verilog-XL로 검증 (단, Reset은 비동기 reset 임) CLK_OUT CLK_IN Divider_1_by_2 D Q CLK_IN CLK_OUT Q’ CD reset Reset < 동작 설명 파형> CLK_IN Reset CLK_OUT 124 실습 과제 5 : ROM을 사용한 Unsigned Multiplier 설계 설계 사양: 2-bit unsigned Multiplier 회로를 설계하고, Verilog HDL로 표현한 후, 이를 Verilog-XL로 검증 < 기능 표 > A[1:0] B[1:0] UMUL (×) 4 MUL_OUT[3:0] A[1:0] 00 ….. 11 B[1:0] 00 …. 11 MUL_OUT[3:0] 0000 …. 1001 A * B 한 결과 Address = {A, B} 125 실습 과제 6 : Mealy Machine의 HDL Modeling <설계 사양> 다음과 같은 Mealy 유한 상태 기계(Finite State Machine : FSM)을 설계하고, 초기에 Reset 신호를 가하여 FSM을 초기화한 후 입력 값으로 1 > 1 > 0 > 0 > 1 인가하여 FSM의 출력과 상태 변화를 확인하는 테스트 벤치 프로그램을 작성하고, 이를 시뮬레이션을 수행 하여 올바른 동작을 혹인 (비 동기 Reset 사용) < FSM> 입력 / 출력 = x / z 0/0 reset < Test 파형 예 > S0 1/1 1/0 CLK 0/0 0/1 S1 S3 reset 1 0/1 1/0 1 1 0 x S2 0 ? z 1/0 126 실습 과제 7 : LFSR 의 HDL Modeling <설계 사양>. 암호 와 디지털 통신 분야에 널리 사용되는 LFSR (Linear Feedback Shift Register) 회로를 설계하고, Verilog HDL로 표현한 후 올바른 동작 확인 (단, 비동기 reset 신호에 의해 3개의 D-F/F이 초기에 모두 1로 초기화된다) Reset CLK SD D Q SD D Q SD D Q Out + < Test 파형 예 > CLK reset 127 실습 과제 8 : Moore FSM의 HDL Modeling < 설계 사양> 다음과 같은 Moore 유한 상태 기계(Finite State Machine : FSM)을 설계하고, 초기에 Reset 신호를 가하여 FSM을 초기화한 후 입력 값으로 1 > 1 > 0 > 0 > 1 인가하여 FSM의 출력과 상태 변화를 확인하는 테스트 벤치 프로그램을 작성하고, 이를 시뮬레이션하여 올바른 동작 확인 (비 동기 Reset 사용) < FSM> 입력 = x 0 reset State output S0 0 < Test 파형 예 > 1 CLK 0 S1 1 0 1 reset 1 1 1 0 x S2 0 0 ? z 1 128