Uploaded by 권지수

MPW Chip 제작을 이용한 ASIC 설계 교육 1

advertisement
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
Download