Digital System Design(3)

Download Report

Transcript Digital System Design(3)

디지털 시스템 설계(3)
Module




Verilog HDL 프로그램의 기본 구조
대소문자 구별
Statement terminator로 semicolon을 사용
Timing specification은 시뮬레이션을 위해서 사용
Module의 구성요소
Port 선언
 포트 리스트
 모듈에 사용되는 포트 이름의 list
 예 : module mux_latch(y_out, sel_a, sel_b, data_a, data_b);
 포트 타입
 input : 입력 포트
 output : 출력 포트
 inout : 입•출력 포트
 포트 선언
 포트 리스트에 나열된 포트명의 타입을 결정하는 과정을 의미
 <port type> <port_name>;
예
 input sel_a, sel_b, data_a, data_b;
 output y_out;
 input [3:0] a;
 output [3:0] a, b;
Port 선언
 포트선언시의 일반적 표현방법
 i_[port_name]
 “i_” 현재 포트의 이름이 입력 포트임을 의미
 RHS(Right-Hand Side argument)로 사용
 o_[port_name]
 “o_” 현재 포트의 이름이 출력 포트임을 의미
 LHS(Left-Hand Side argument)로 사용
 LHS, RHS의 규칙을 따르지 않을경우 합성 이후 네트(net)가 연결되
어 있지 않는 플로팅(floating) 상태가 되고, 레이아웃(Layout)시
GND(Ground, 접지 전압, 0V 또는 VDD(동작 전압)로 강제로 할당
되므로 주의
 b_[port_name]
 “b_” 현재 포트의 이름이 입출력 양방향(bi-directional) 포트임을 의미
 RHS, LHS에 사용가능
 버스의 선언은 down-ward로 기술
 예:
[BIT_WIDTH-1:0]
데이터 형태
 물리적 데이터 형태
 논리값의 종류
 추상적 데이터 형태
 Integer, real, time 등
데이터 형태
 변수선언(데이터 형태 선언)
 종류
 reg : register (latch 또는 flip-flop)
•
•
•
•
일시적으로 데이터를 저장하는 변수를 의미
하드웨어 레지스터를 의미하지는 않는다
always, initial 문 등에서 사용
예 : reg alu_reg;
reg [7:0] alu_reg;
 wire : net (배선)
• 값 저장 불가능
• assign 문에서 사용
• 예 : wire adder_out;
wire [15:0] adder_out, mult_out;
 constant
 파라미터를 이용하여 변수 값을 사용할 때
데이터 형
 수 표현
 Sized 또는 unsized 형식의 수 표현 가능
 Sized 형식의 수 표현
 형식 : <size>’<base format><number>
 예 : 3’b010 //3의 prefix는 수의 size를 의미
 Unsized 형식의 수 표현
 Base format이 없는 경우는 default로 decimal을 의미
 Size가 없는 경우는 default로 32-bit의 수를 의미
 예 : 321 //32-bit을 갖는 decimal number 321을 의미
 Base format
 Decimal : ‘d 또는 ‘D
 Hexadecimal : ‘h 또는 ‘H
 Binary : ‘b 또는 ‘B
 Octal : ‘o 또는 ‘O
데이터 형
 수 표현
 음수의 표현
 <size> 앞에 – 부호를 위치하여 표현
 예 : -8’d3 //3의 2의 보수 형태로 저장된 8bit의 음수
 틀린 예 : 4’d-2
 수의 확장 법칙
 MSB가 0, X, 또는 Z 인 경우
• 각 각 MSB가 0, X, Z가 되도록 확장
• 예 : 3’b01 = 3’b001, 3’bx1 = 3’bxx1 , 3’bz = 3’bzzz
 MSB가 1인 경우
 MSB를 0으로 채우는 방향으로 확장
 예 : 3’b1 = 3’b001
데이터 형
 수 표현
연산자
 Binary 연산자의 종류
(예)
A = 4’b0011, B = 4’b0100, D = 6, E =4 일때
A * B = 4’b1100
D/E=1
//Truncates any fractional part
A + B = 4’b0111
B – A = 4’b0001
13 % 3 = 1
(예)
어떤 operand bit이 x값을 가지면 전체 연산
결과는 x 이다.
in1 = 4’b101x, in2 = 4’b1010 일 때
Sum = in1 + in 2;
//sum은 4’bx
-7 % 2 = -1
//첫 번째 operand의 부호
7 % -2 = 1
//첫 번째 operand의 부호
연산자
 관계 연산자
(예)
ain = 3’b010, bin = 3’b100, cin = 3’b111, din = 3’b01z, ein = 3’b01x일 때
ain > bin 은 false(1’b0) 의 결과
ain < bin 은 ture(1’b1)의 결과
ain >= bin 은 unknown(1’bx)의 결과
ain <= ein은 unknown(1’bx)의 결과
연산자
 논리 연산자
(예)
A = 3 ; B = 0;
A && B
A || B
!A
!B
A = 2’b0x ; B = 2’b10;
A && B
(a == 2) && (b == 3)
//Evaluates to
//Evaluates to
//Evaluates to
//Evaluates to
0.
1.
0.
1.
Equivalent
Equivalent
Equivalent
Equivalent
to
to
to
to
(logical 1 && logical 0)
(logical 1 && logical 0)
not(logical 1)
not(logical 0)
//Evaluates to x. Equivalent to (x && logical 1)
//Evaluates to 1 if both a == 2 and b==3 are true
연산자
 Bitwise 연산자
만일 두 operand의 길이가 다르면 짧은 길이의 operand가 0으로 left-extend
(예)
X = 4’b1010, Y = 4’b1101, Z = 4’b10x1일 때
~X
//Result is 4’b0101
X&Y
//Result is 4’b1000
X|Y
//Result is 4’b1111
X^Y
//Result is 4’b0111
X ^~ Y
//Result is 4’b1000
X&Z
//Result is 4’b10x0
연산자
 Unary Reduction 연산자
vector를 하나의 bit로 줄이는 연산을 수행한다. X 또는 Z는 연산자에 따라서
unknown일 수도 있고 known일 수도 있다.
(예)
ain = 5’b10101, bin = 4’b0011, cin = 3’bz00, din = 3’bx011일 때
&ain
//Result is 1’b0
~&ain
//Result is 1’b1
|cin
//Result is 1’bx
&din
//Result is 1’b0
연산자
 Equality 연산자
case equality와 case inequality를 제외하고 operand에 X 나 Z를 포함하면 결과는 unknown
(예)
A = 4, B = 3, X = 4’b1010, Y = 4’b1101, Z = 4’b1xxz, M = 4’b1xxz, N = 4’b1xxx일 때
A == B
//Result is logical 0
X != Y
//Result is logical 1
X == Z
//Result is x
Z == M
//Result is logical 1(all bits match, including x and z)
Z == N
//Result is logical 0(least significant bit does not match)
M != N
//Result is logical 1
연산자
 기타 연산자
Multi Bit 선언
 신호 선언 [MSB:LSB]
 Input [7:0] abus; reg [15:8] add;
 한 비트의 선택
 assign abc = abus[5] ; assign abus[5] = abc ;
 여러 신호를 하나의 신호로 할당
 assign abcd[15:0] = {abus[7:0],add[15:8]} ;
Array
 Register 형은 array로 선언 가능
 Reg [15:0] mem [0:255];
 mem은 16bit * 256word, 512 byte의 메모리
 resister 배열은 bit 선택과 부분 선택 불가
 반드시 word 단위의 액세스
 Bit 선택이나 부분 선택
 일시적인 net 신호를 이용
 Ex) wire [15:0] temp;
•
assign temp = mem [100];
기술방법(Description)
 구조적 기술방법(Structural description)
 Explicit structural description
 Primitive 또는 라이브러리 셀의 instance 및 연결을 통한 기술
 Implicit structural description
 Continuous assignment를 통한 기술
 동작 기술 방법(Behavioral description)
 회로의 동작을 기술함으로 설계하는 방법
 대표적으로 initial, always behavior를 사용
 Procedural block 과 procedural statement로 구성
기술방법
 Explicit description
module 8bit_or_gate(y, a, b);
input [7:0]a, b;
output y;
module 8bit_or_gate(y, a, b);
input [7:0]a, b;
output y;
or G1(y, a, b);
endmodule
or8bit(y, a, b);
endmodule
Primitive를 이용한 기술
 Implicit description
module 8bit_or_gate(y, a, b);
input [7:0]a, b;
output y;
assign y = a | b;
endmodule
라이브러리를 이용한 기술
Primitives
 Predetermined Primitives
Module Instantiation
 Port connection의 2가지 방법
 Connecting by ordered list
 Connecting ports by name
 Connecting by ordered list
Module Instantiation
 Connecting ports by name
Assign
 Assign
 Wire에 값을 가하고 update 하기 위해 사용
 LHS (Left Hand Side)의 데이터 타입은 항상 net data type
이여야 한다
 Always active
 RHS (Right Hand Side)의 어느 한 operand라도 변화하
면, expression은 실행되고 LHS 값은 즉시 update 된다
 RHS의 데이터 타입은 net, register, function call등 어떤 것
이어도 상관 없다
Procedural Blocks
 Procedure의 정의
 sequential 하게 동작하는 코드 부분을 의미
 procedural statement
 procedure안에 존재하는 statement
 예를 들어, 2-to-1 MUX의 경우
Initial Block
 시뮬레이션을 위한 초기화, 모니터링, waveform의 기술
시에 주로 사용된다
 시뮬레이션 타임 0에서 시작하여 오직 1번만 실행된다
 하나의 initial block이 여러 개의 behavioral statement
를 가질 경우 begin ~ end로 group 되어야 한다
 독립적인 initial block은 서로 concurrent 하다
 Initial block 내부의 statement들은 sequential 하게 동
작한다
 initial block은 중첩될 수 없다
 synthesis 되지 않는다
Initial Block
module TestBench;
reg a, b, c, d
Initial a = 1’b0;
Initial
Begin
b = 1’b1;
#5 c = 1’b0;
#10 d = 1’b0;
End
Initial #20 $finish;
endmodule
Always Block(Level-Senssitive Circuit)
 논리조합회로(Level-Sensitive Circuit)와 논리순차회로(Edge
Sensitive Circuit) 에서 사용가능
 논리조합회로에는 Blocking Assignment(=)만을 사용
always @([Senstitivity_list])
begin
.
.
.
end
Always Block(Edge-Senssitive Circuit)
 논리순차회로에는 non-Blocking Assignment(<=)만을
사용
 Edge Contition
 posedge
 negedge
 Edge Condition 은 최소 1개 최대 3개까지 기술
always @ ( Edge condition [signal] or Edge condition [signal] or…)
begin
...
end
Always Block(Edge-Senssitive Circuit)
Always Block(Edge-Senssitive Circuit)
Always Block(Edge-Senssitive Circuit)
Blocking vs. Non-Blocking
Assignment
Blocking Assignment
Non-Block Assignment
Symbol
=
<=
Combination Logic Circuit
Sequential Logic Circuit(always
statement를 사용)
Blocking
Assignment
=
한 always 블록 내에서 ';'로 끝나는 각 구문이 연속적인(continuo
us) 할당이 발생하여 맨 마지막에 할당된 값을 가지게 된다. 또한
블로킹 할당은 신호의 중복 할당을 허용한다.
클럭 엣지에서 Unit Delay 존재하지 않는다.
Non-Blocking
Assignment
<=
한 always 블록 내에서 ';'로 끝나는 각 구문이 동시적인(concurr
ent) 할당이 발생된다. 또한 논블로킹 할당은 중복 할당을 허용하
지 않는다. 클럭 엣지에서 Unit Delay 존재한다.
Blocking vs. Non-Blocking
 Blocking
 Non-Blocking
Blocking vs. Non-Blocking
 Blocking
 Non-Blocking
Initial vs Always
Procedural Statement
 if-else statement
 어떤 조건을 근거로 하여 statement를 실행 할 것인지를 결정하
는데 사용
 TOP에서 BOTTOM으로 조건 평가 실시
 모든 조건이 false이면 else에 관계되는 statement를 실행
if(<condition1>)
sequence of statement(s)
else if(<condition2>)
sequence of statement(s)
……
else
sequence of statements(s)
E.g. 4-to-1 mux
module mux4_1(out, in, sel);
output out;
input [3:0] in;
input [1:0] sel;
reg out;
wire [3:0] in;
wire [1:0] sel;
always @(in or sel)
if (sel == 0)
out = in[0];
else if (sel == 1)
out = in[1];
else if (sel == 2)
out = in[2];
else
out = in[3];
endmodule
Procedural Statement
 case statement





if else와 같이 조건 평가에 의한 statement의 실행
모든 가능한 조건이 고려되어야 함
default : 기술되지 않은 모든 가능한 조건에 해당
중첩 될 수 있다
expression의 결과와 condition의 bit 수가 같지 않을 때는
MSB부터 0 fill 한다
E.g. 4-to-1 mux
case (expression)
<condition1>:
sequence of statement(s)
<condition2>:
sequence of statement(s)
…
default :
sequence of statement(s)
endcase
module mux4_1(out, in, sel);
output out;
input [3:0] in;
input [1:0] sel;
reg out;
wire [3:0] in;
wire [1:0] sel;
always @(in or sel)
case (sel)
0: out = in[0];
1: out = in[1];
2: out = in[2];
3: out = in[3];
endcase
endmodule
Procedural Statement
 For
 loop의 시작에서 일단 한번 statement를 실행하고
expression이 참일때만 계속 loop를 실행
module count(Y, start);
output [3:0] Y;
input start;
reg [3:0] Y;
wire start;
integer i;
initial
Y = 0;
always @(posedge start)
for (i = 0; i < 3; i = i + 1)
#10 Y = Y + 1;
endmodule
Verilog HDL
 Module 구조 예
Module Add_half_1(sum, c_out, a, b);
input a, b;
output sum, c_out;
wire c_out_bar;
xor(sum, a, b);
nand(c_out_bar, a, b);
not(c_out, c_out_bar);
endmodule
모듈 선언
포트 선언
데이터 타입 선언
회로 동작기술
Predefined primitive 를 사용하여 instantiation
Verilog HDL
Module Add_half_2(sum, c_out, a, b);
input a, b;
output sum, c_out;
wire c_out_bar;
assign {c_out, sum} = a + b;
endmodule
회로 동작기술
Continuous assignment 구문사용
Verilog HDL
Module Add_full(sum, c_out, a, b);
input a, b, c_in;
output sum, c_out;
wire w1, w2, w3;
add_half_1 M1 (w1, s2, a, b);
add_half_2 M2 (sum, w3, s1, c_in);
or(c_out, w2, s3);
endmodule
 기존에 설계한 half_adder를 이용한
Structural description
 module instantiation 사용
(parent module / child module)
 module instantiation시 반드시
module instance name이 들어가야 함
(primitive instantiation시는 optional)
Verilog HDL
Module full_adder(sum, carry_out, in1, in2, carry_in);
input in1, in2, carry_in;
output sum, carry_out;
reg sum, carryout;
always @(in1 or in2)begin
{carry_out, sum} = in1+in2+carryin;
end
endmodule
sumHA = a ^ b
c_outHA = ab
sumFA = (a + b) ^ c_in
c_outFA = (a + b) c_in + abc_in
Half_adder의 결과를
sum을 연산자 +,
c_out를 연산자 &로
치환하면
sumFA = (a + b) + c_in
c_outFA = a&b | a&b&c_in