한국기술교육대학교 장영조 - KOREATECH · 2016. 10. 31. · 설계의기본단위...
Transcript of 한국기술교육대학교 장영조 - KOREATECH · 2016. 10. 31. · 설계의기본단위...
-
한국기술교육대학교장영조
-
2한국기술교육대학교 전기전자통신공학부
-
1. Velilog HDL 개요2. Verilog 첫걸음3. Velilog 어휘규칙4. 모듈5. 데이터형6. 연산자7. 인스턴스8. 시스템 태스크와 함수9. 컴파일러 지시어
3한국기술교육대학교 전기전자통신공학부
-
설계의 기본단위
모듈구성
4한국기술교육대학교 전기전자통신공학부
module module_name (port_list);
port 선언reg 선언wire 선언parameter 선언
하위모듈 호출always, initial 문function, task 정의문assign 문function, task 호출문
endmodule
semicolon
no semicolon
모듈정의
모듈 items
-
한국기술교육대학교 전기전자통신공학부 5
// 암시적 내부 연결( implicit internal connection )
module module_name (port_name, port_name, ... );
module_items
endmodule
// 명시적 내부 연결 (explicit internal connection)
module module_name (.port_name (signal_name ),
.port_name (signal_name ), ... );
module_items
endmodule
-
code 1.4.1-1 ex1.v, 모듈 정의의 암시적 연결
// 등가 비교기
module ex1 ( a1, b1, out1);input [3:0] a1, b1;outputout1;
assign out1 = ( a1 >= b1 ); // continuous assignmentendmodule
한국기술교육대학교 전기전자통신공학부 6
code 1.4.1-2 ex2.v, 모듈 정의에 포트 선언 목록을 포함한 암시적 연결
// 2 input MUX with 2 bit widthsmodule ex2 ( input wire [1:0] i0, i1,
input wire sel,output wire [1:0] out2 );
wire t0, t1;assign out2 = {t1, t0}; // concatenationassign t1 = sel ? i1[1] : i0[1];assign t0 = sel ? i1[0] : i0[0];
endmodule
-
module items module_port_declarations data_type_declarations module_instances primitive_instances procedural_blocks continuous_assignments task_definitions function_definitions
모듈 item의 기술 순서는 무관 concurrent, parallel
한국기술교육대학교 전기전자통신공학부 7
-
포트선언 형식
포트 방향 input : 스칼라(scalar)나 벡터(vector)의 입력 포트 선언 output : 스칼라나 벡터의 출력 포트 선언 inout : 스칼라나 벡터의 양방향 포트 선언
data type : 선택적, 실수형 불가 signed : 선택적, 부호있는 수를 나타냄 port size : 선택적, 포트크기 범위 [msb:lsb]
한국기술교육대학교 전기전자통신공학부 8
port_direction data_type signed [port_size] port_name, port_name, .. ;
-
예제 1.4.2 포트 선언 예
input a1, a2, en; // 3개의 스칼라 1 비트 포트
input signed [7:0] a, b; // 2개의 8 비트 signed 값을 갖는 포트
output reg signed [16:0] res; // 데이터형과 signed 속성을 갖는 포트
output reg [11:0] cnt1; // little endian 표기 방식
inout [0:15] data_bus; // big endian 표기 방식
input [15:12] addr; // msb:lsb는 정수 값
parameter BW = 32;
input [BW-1:0] addr1; // 상수 표현식 사용 가능
parameter SIZE = 4096;
input [log2(SIZE)-1:0] addr2; // 상수 함수를 선언에서 호출 가능
한국기술교육대학교 전기전자통신공학부 9
-
1. Velilog HDL 개요2. Verilog 첫걸음3. Velilog 어휘규칙4. 모듈5. 데이터형6. 연산자7. 인스턴스8. 시스템 태스크와 함수9. 컴파일러 지시어
10한국기술교육대학교 전기전자통신공학부
-
net 설계 부분의 사이에서 물리적인 연결을 만들 때 사용하는 개념 net는 net의 구동자(driver)의 값과 strength level이나 혹은 net의
capacitance, 혹은 그 자신의 값을 가지지 않은 것을 그대로 반영 한 개의 net를 구동하는 여러 개의 구동자가 있을 경우에는 최종값을 결
정하는 resolution 함수 필요
variable type 프로그래밍 데이터의 임시적 저장소로 사용되므로 레지스터(register) 데
이터형이라고도 한다. initial 블록, always 블록, 태스크나 function과 같은 프로시듀어의 내부에
서만 값을 할당받을 수 있다. 논리값만 저장할 수 있으며 논리 strength는 저장할 수 없다. 변수는 시뮬레이션의 시작에는 비초기화(un-initialized)되고, 값이 할당
되기 전까지는 논리 X의 값을 유지한다.
한국기술교육대학교 전기전자통신공학부 11
-
선언 형식
delay : 선택사항, net 데이터형에서만 사용 size : [msb : lsb]로 나타내는 비트자리의 크기, 정수, 정수 파라미터, 정
수 상수로 나타나는 수식 사용 array_size : [first_address : last_address] 형태로 표현, strength : (strength1, strength0)이나 (strength0, strength1)의 형태 decay_time : trireg net의 구동자가 turn-off된 후 논리 X값으로 방전하
기 전에 charge를 저장할 수 있는 시간 값 규정. (rise_delay, fall_delay, decay_ time)의 형식으로 표현
12한국기술교육대학교 전기전자통신공학부
register_type [size] variable_name , variable_name , ...;
register_type [size] memory_name [array_size];
net_type [size] #(delay) net_name [array_size], ...;
net_type(drive_stren) [size] #(delay) net_name = cont_assignment;
trireg (cap_stren) [size] #(delay,decay_time) net_name, ...;
parameter const_name = value, const_name = value, ... ;
event event_name, event_name, ... ;
-
종류
사용 프로시듀어 블록내 절차형 할당에서 좌변 변수로 사용 할당과 할당 사이의 값을 유지 reg 변수가 하드웨어적인 저장장소를 의미하는 것은 아님
13한국기술교육대학교 전기전자통신공학부
키워드 기능
reg
integer
time
real
realtime
임의 비트 크기의 unsignedvariable
32비트 signedvariable
64비트 unsignedvariable
배정도 부동소수점 variable
배정도 부동소수점 variable
-
예제 1.5.1 레지스터 변수 선언 예
reg d, e, f; // 3개의 스칼라(1 비트) 변수
reg signed [12:0] a1, a2; // 2개의 13 비트 signed 변수
reg [7:0] A[0:3][0:15]; // 8비트의 2차원 배열 변수
integer i, j; // 2개의 signed 정수 변수
real r1, r2; // 2개의 배정도(double-precision) 실수 변수
reg clk = 0, rst = 1; // 초기값을 가지는 2개의 reg 변수
realtime rtime; // 실수값을 가지는 time 변수
time save_stime; // time 변수
initial
save_stime = $time; // $time은 현재 시뮬레이션 시간을 반환하는 시스템 함수
14한국기술교육대학교 전기전자통신공학부
-
code 1.5.1-1mydff.v, 저장장소가 합성되는
reg형
module mydff (clk, d, q);
input d, clk;
output q;
reg q;
always @(posedge clk)
q
-
종류
사용 어떤 소자의 출력에 의해 구동되는 신호 입력(input) 포트나 입출력 포트로 선언되는 신호 연속할당문의 좌변(LHS, Left Hand Side) 신호로 사용 연속할당문의 우변(RHS, Right Hand Side) 구동자가 연결되지 않으면,
default 값인 high-impedance(z) 값이 됨. default 자료형 : 1 비트의 wire default 초기값 : z, 단 trireg는 x
한국기술교육대학교 전기전자통신공학부 16
키워드 기능
wire, tri
wor, trior
wand, triand
tri0
tri1
supply0
supply1
trireg
단순 연결을 위한 와이어
wired outputs or together
wired outputs and together
저항성으로 3상일 때 풀 다운, 접지에 연결
저항성으로 3상일 때 풀 업, 전원에 연결
상수 논리값 0(supply strength), 회로접지에 사용
상수 논리값 1(supply strength), 전원에 연결되는 net
3상일 때 마지막 값 저장(capacitance strength),전하 모델링
-
각 구성 성분의 연결 데이터 형
17한국기술교육대학교 전기전자통신공학부
input outputinout
wire
wire,regwire
wire,reg
wire
alwaysbegin...end
initialbegin...endassign wire_a=c&d;
reg reg_a, reg_b,...integer int_i, ...
primitive instance
continuousassignment
module_instance1 module_instance2
declarations register variables
behavior1
behavior2
wire
wire,reg
wire
wire wire
wirewire
wire,regwire wire,reg
-
예제 1.5.2 net 데이터 선언 예
wire d, e, f; // 3개의 1 비트 스칼라 net
tri1 [7:0] dbus; // 3 상태일 때 pull-up인 8 비트 net
wire [1:0] sel = 2'b00; // 초기값을 가지는 와이어, 초기값은 시뮬레이션용
wire signed [1:11] res; // 12 비트 signed net
wire [7:0] A[0:15][0:256]; // 8 비트 와이어의 2차원 배열
wire #(2.4,1.8) ripple; // rise 및 fall delay를 가지는 net
wire [0:15] (strong1, pull0) sum = a + b;
// strength를 가진 16 비트 net 선언과 연속 할당으로 값을 전달
trireg (small) #(0,0,35) ram_bit; // smallcapacitance와 rise, falldelay,decay를가진net
wand t3; // wand 형의 스칼라 net
한국기술교육대학교 전기전자통신공학부 18
-
2개 net 신호 연결시의 진리표
19한국기술교육대학교 전기전자통신공학부
wire/tri 0 1 x z
0 0 x x 0
1 x 1 x 1
x x x x x
z 0 1 x z
wand/triand 0 1 x z
0 0 0 0 0
1 0 1 x 1
x 0 x x x
z 0 1 x z
wor/trior 0 1 x z
0 0 1 x 0
1 1 1 1 1
x x 1 x x
z 0 1 x z
tri0 0 1 x z
0 0 x x 0
1 x 1 x 1
x x x x x
z 0 1 x 0
tri1 0 1 x z
0 0 x x 0
1 x 1 x 1
x x x x x
z 0 1 x 1
-
키워드 기 능
parameter정수, 실수, time, 지연 시간, ASCII 스트링을 저장하는 실행 시간(run-time)
상수. 파라미터 값은 각 모듈에서 재 정의될 수 있다.
localparam 정수, 실수, time, 지연 시간, ASCII 스트링을 저장하는 지역(local) 상수
specparam 정수, 실수, time, 지연 시간, ASCII 스트링을 저장하는 특정 블록 상수
genvargenerate loop 내에서 사용되는 임시 변수로 그 외의 장소에서는 사용할
수 없으며 시뮬레이션에서도 읽혀지지 않는다.
event논리값이나 데이터 저장소를 가지지 않는 순간적인 flag로 한 모듈 내에
서 concurrent activities의 동기화를 위해 사용된다.
한국기술교육대학교 전기전자통신공학부 20
-
예제 1.5.3 그 외 데이터형 선언 예
parameter [2:0] s1 = 3'b001, // 3 개의 3 비트 상수 선언s2 = 3'b010,s3 = 3'b100;
parameter integer period = 50; // 정수 상수localparam signed val = -8; // unsized signed 상수, 초기값으로 크기 결정event hs_rdy, hs_sent; // 2개의 event 데이터형
한국기술교육대학교 전기전자통신공학부 21
예제 1.5.4 파라미터 선언 예
parameter msb = 15; // msb를 상수 15로 정의parameter a = 15, b = 180; // 2개의 상수 정의parameter r1 = 25.7; // 실수 파라미터 정의parameter size = 8, mask = size - 1;parameter p_delay = (r + f) / 2; // 상수 수식 정의parameter signed [3:0] sel = 0; // 벡터 상수 정의와 초기값 할당parameter real r2 = 3.41e8;parameter p1 = 16'h7a5;parameter [31:0] f_const = 1'b1; // 32 비트로 변환parameter s_const = 3'h4; // [2:0]의 암시적 사이즈
-
code 1.5.3-1 myxnor.v, 파라미터 정의
module myxnor (y_out, a, b);parameter size=8, delay=15;output [size-1:0] y_out;input [size-1:0] a, b;wire [size-1:0] #delay y_out = a ~^ b; // bit-wise xnor with delayendmodule
한국기술교육대학교 전기전자통신공학부 22
code 1.5.3-2 my_param.v, 파라미터 사용 예
module my_param;wire [7:0] y1_out;wire [3:0] y2_out;reg [7:0] b1, c1;reg [3:0] b2, c2;
myxnor G1 (y1_out, b1, c1); // use default parametersmyxnor #(4, 5) G2 (y2_out, b2, c2); // overrides default parameters
endmodule
-
net나 reg 형의 다중 비트 선언 선언 형식
한국기술교육대학교 전기전자통신공학부 23
data-type [MSB : LSB] signal-name
예제 1.5.5 벡터 사용 예
wire [7:0] bus;wire [31:0] busA, busB; // 32 비트 벡터, MSB=31reg [0:40] addr; // 41 비트 벡터, MSB=0busA[7]; // 벡터 부분 사용 예busB[2:0]; // 벡터 sliceaddr[0:1];
-
동일한 데이터의 1차원 혹은 2차원 정의 벡터는 단일 객체이나 배열은 다중객체(object) 배열로 선언될 수 있는 데이터 : reg, net, integer, time 선언형식
배열 전체 또는 일부분은 단일 할당문에 의해 값을 할당 받을 수 없으며또한 수식에 사용될 수 없다. 배열을 구성하는 요소에만 단일 할당문으로 값을 할당받을 수 있다.
한국기술교육대학교 전기전자통신공학부 24
data-type array_name [subscript]
-
한국기술교육대학교 전기전자통신공학부 25
배열 사용 예
reg [7:0] mema[0:255]; // 256개의 8비트 메모리 레지스터, memareg memb[7:0][0:255]; // 1비트 레지스터의 2차원 배열wire w_array[3:0][7:0]; // 1 비트 와이어의 2차원 배열integer id[1:64]; // 64개 정수의 1차원 배열time t_hist[1:1000]; // 1000개 time의 1차원 배열
mema = 0; // 오류 구문 - 전체 배열에 쓰기 불가memb[1] = 0; // 오류 구문 - 배열 다중요소, [1][0]..[1][255] 에 쓰기 불가memb[1][12:31] = 0; // 오류 구문 – 배열 다중요소, [1][12], [1][13], .. , [1][31]쓰기 불가mema[1] = 0; // mema의 두번째 원소에 8비트 값, 0 할당memb[1][0] = 0; // memb[1][0] 원소에 1비트 값, 0 할당id[4] = 33559; // 정수배열 원소에 10진수 할당t_hist[t_index] = $time; // 정수인덱스, t_index로 접근된 원소에 현재 시뮬레이션 시간 할당
예 : 배열요소에 의한 할당
-
1. Velilog HDL 개요2. Verilog 첫걸음3. Velilog 어휘규칙4. 모듈5. 데이터형6. 연산자7. 인스턴스8. 시스템 태스크와 함수9. 컴파일러 지시어
26한국기술교육대학교 전기전자통신공학부
-
27한국기술교육대학교 전기전자통신공학부
연산자 종류 연산자 기호 설명 오퍼랜드 개수
arithmetic
+-*/
%**
(+)부호, 덧셈(-)부호, 뺄셈곱셈나눗셈나머지(modulus)지수
1, 21, 22222
shift>>>>=
-
피연산자의 비트에 x 나 z 가 포함된 경우, 전체 결과 값은 x
나누기와 나머지 연산자에서 두 번째 피연산자가 0인 경우, 결과값은 x
나머지 연산자의 결과 값은 첫번째 피연산자의 부호를 따름
거듭제곱 연산자에서 다음의 경우에는 결과 값이 정의되지 않음
첫번째 피연산자가 0이고 두 번째 피연산자가 양수가 아닌 경우
첫번째 피연산자가 음수이고 두 번째 피연산자가 정수 값이 아닌 경우
한국기술교육대학교 전기전자통신공학부 28
기 호 기 능
+ 더하기
- 빼기
* 곱하기
/ 나누기(몫)
% 나머지(modulo)
** 거듭제곱(power)
오퍼랜드 자료형 해 석
unsigned net Unsigned
signed net Signed, 2’s complement
unsigned reg Unsigned
signed reg Signed, 2’s complement
integer Signed, 2’s complement
time Unsigned
real, realtime Signed, floating-point
-
산술연산자의 동작
+ m + n Add n to m
- m - n Subtract n from m
- -m Negate m (2의 보수)
* m * n Multiply m by n
/ m / n Divide m by n
% m % n Modulus of m / n, 나머지
** m ** n mn, 지수
한국기술교육대학교 전기전자통신공학부 29
예제 1.6.1 산술 연산자 사용 예
-d10 / 5 // (10의 2의 보수)/5 = (232-10)/5
5 / 0 // 5/0 = x
(-7) % (+4) = -3 // 나머지, 왼쪽 오퍼랜드의 부호를 따른다.
(+7) % (-2) = +1
// 정수, 레지스터 연산 예
integer intA;
reg [15:0] regA;
reg signed [15:0] regS;
intA = -4'd12;
regA = intA / 3; // -4, intA는 integer, regA는 65532
regA = -4'd12; // regA는 65524
intA = regA / 3; // 21841
intA = -4'd12 / 3; // 1431655761, -4d'12= 232-12
regA = -12 / 3; // -4, -12는 integer 자료형, regA는 65532
regS = -12 / 3; // -4, regS는 signed reg
regS = -4'sd12 / 3; // 1, -4'sd12는 4이므로 4/3=1
-
이동연산자의 동작
m >> n 논리, 우측 n 자리 이동, MSB 빈자리 0 fill
>> n 산술, 우측 n 자리 이동, MSB 빈자리 MSB로 fill
한국기술교육대학교 전기전자통신공학부 30
예제 1.6.2 이동 연산자 동작 예
// a a >> 2 a >>> 2 a
-
관계 연산자의 동작
< m < n m less than n? 결과는 1 비트 true(1)/false(0)
> m > n m greater than n? 결과는 1/0
= n m greater than or equal to n? 결과는 1/0
한국기술교육대학교 전기전자통신공학부 31
예제 1.6.3 관계 연산자 사용 예
// a = 8, b = 20
// x = 4'b1000, y = 5'b01000, z = 4'1xxx
a < b // true a > b // false a = b // false
x < y // 0 x >= z // x x >= y // 1 y-1 < x // 1
오퍼랜드의 비트가 x 혹은 z의 값을 포함하면 결과 값은 1 비트의 x 두 오퍼랜드의 비트 수가 다른 경우에는 비트 수가 작은 오퍼랜드의
MSB 쪽에 0이 채워져 비트 수가 큰 오퍼랜드에 맞추어 판단 오퍼랜드 중 하나가 실수형이면 다른 오퍼랜드도 실수형으로 변환된
후 비교
-
등가연산자의 동작
// 등가 연산자 - 논리값 0과 1을 비교
== m == n m is equal to n? 결과는 1 비트 true(1)/false(0)
!= m != n m is not equal to n? 결과는 1/0
// 동일(identity) 연산자 - 0, 1, x 및 z 값 비교
=== m === n m is identical to n? 결과는 1/0
!== m !== n m is not identical to n? 결과는 1/0
한국기술교육대학교 전기전자통신공학부 32
예제 1.6.4 등가 연산자 사용 예
// X=4'b1010, Y=4'b1101, Z=4'b1xxz, M=4'b1xxz
X == Y // 0 X == Z // x
M == Z // x M === Z // 1
code 1.6-1 TB_eq1.v, 테스트벤치
module TB_eq1;
wire [3:0] X, Y, Z, M;
assign X = 4'b1010;
assign Y = 4'b1101;
assign Z = 4'b1xxz;
assign M = 4'b1xxz;
initial
#4 $display (X==Y, X==Z, M===Z, M==Z); // 0x1x
endmodule
-
비트단위 연산자의 동작
~ ~m m의 각 비트를 반전, 단일오퍼랜드
& m & n m과 n의 각 자리에 대하여 and
| m | n m과 n의 각 자리에 대하여 or
^ m ^ n m과 n의 각 자리에 대하여 xor
~^ m ~^ n m과 n의 각 자리에 대하여 xnor
^~ m ^~ n m과 n의 각 자리에 대하여 xnor
한국기술교육대학교 전기전자통신공학부 33
예제 1.6.5 비트 단위 연산자 사용 예
// X = 4'b1110, Y = 4'b1000, Z = 4'b01xx
~ X // Negation, 결과는 4'b0001
X & Y // Bitwise and, 결과는 4'b1000
X | Y // Bitwise or, 결과는 4'b1110
X ^ Y // Bitwise xor, 결과는 4'b0110
X ^~ Y // Bitwise xnor, 결과는 4'b1001
Y | Z // Bitwise xor, 결과는 4'b11xx
// 비트 단위 연산자의 할당 예
wire [3:0] a, b, c;
assign c = a | b; // 4 비트 단위 연속할당
// 아래 4개의 각 비트 할당문과 동일
assign c[3] = a[3] | b[3];
assign c[2] = a[2] | b[2];
assign c[1] = a[1] | b[1];
assign c[0] = a[0]| b[0];
and, or, not, xor와 같은 논리적 연산을 비트단위별로 수행 오퍼랜드의 비트 수와 동일한 비트 수의 결과, 병렬합성 연산자를 구현하는 하드웨어는 기본적인 논리 게이트
-
단일 오퍼랜드에 동작, 벡터 입력에 대하여 1비트의 결과 입력수가 여러 개인 단일 게이트 합성
한국기술교육대학교 전기전자통신공학부 34
축소연산자의 동작
& &m m의 모든 비트를 and, 1 비트 결과
~& ~&m m의 모든 비트를 nand, 1 비트 결과
| |m m의 모든 비트를 or, 1 비트 결과
~| ~|m m의 모든 비트를 nor, 1 비트 결과
^ ^m m의 모든 비트를 xor, 1 비트 결과
~^ ~^m m의 모든 비트를 xnor, 1 비트 결과
^~ ^~m m의 모든 비트를 xnor, 1 비트 결과 예제 1.6.6 축소 연산자 사용 예
wire [3:0] a = 4'b0101;
wire x1, x2, y1, y2, y3 ;
// 다음 두 연산의 결과 x1과 x2는 동일
assign x1 = & a; // reduction, 0 & 1 & 0 & 1 = 0
assign x2 = a[3] & a[2] & a[1] & a[0]; // bitwise AND
assign y1 = | a; // 0 | 1 | 0 | 1 = 1
assign y2 = ^ a; // 0 ^ 1 ^ 0 ^ 1 = 0
assign y3 = ^~ a; // ~( 0 ^ 1 ^ 0 ^ 1) = 1
-
true(1) 혹은 false(0)의 1비트 평가 결과 if, case 문 등의 조건식 판단에 주로 사용
한국기술교육대학교 전기전자통신공학부 35
논리연산자의 동작
! !m m이 참이면 0 아니면 1, 1 비트 결과
&& m && n m과 m이 동시에 참이면 1, 1 비트 결과
|| m || n m과 m이 하나라도 참이면 1, 1 비트 결과
예제 1.6.7 논리 연산자 사용 예
A = 5; B = 0; C = 3'b101; D = 3'bx01
A && B // false(0)
(A == 5) && ( B == 0) // true(1)
!B // 1
C && D // x
A || C // 1
논리 및 비트 단위 연산자 비교
a b a&b a|b a&&b a||b
0 1 0 1 0 (false) 1 (true)
000 000 000 000 0 (false) 0 (false)
000 101 000 101 0 (false) 1 (true)
111 010 010 111 1 (true) 1 (true)
-
스칼라 혹은 벡터의 구성요소를 결합하여 보다 큰 벡터 생성
한국기술교육대학교 전기전자통신공학부 36
결합연산자의 동작
{ } {m,n} m과 n을 결합하여 보다 큰 벡터 생성, MSB는 m
{{ }} {n{m}} m을 n번 반복 결합
예제 1.6.9 결합 연산자 사용 예
// a = 1'b1 b =3'b101 c = 2'b01assign x1 = { b, c }; // 결과 x1은 5'b10101assign y1 = { a, b, 4'b0111 }; // 결과 y1은 8'b11010111assign z1 = { a, b[1:0], c[1] }; // 결과 z1은 4'b1010// 반복 연산자, { { } } 사용 예assign x2 = { 8{a} }; // 결과 x2는 8'b1111_1111assign y2 = { 2{a}, 2{b} }; // 결과 y2는 8'b1110_1101assign z2 = { 3{a}, b, 2{c} }; // 결과 z2는 10'b11_1101_0101assign byte = { 4{2'b10} }; // 8'b1010_1010 생성assign hword = { {8{byte[7]} }, byte }; // 16 비트생성, 부호확장
// 1111_1111_1010_1010
-
예제 1.6.10 결합연산자를 사용한 비트길이 조절
wire [7:0] a, b;wire [7:0] sum8;wire [8:0] sum9;assign sum8 = a + b; // 캐리 버림assign sum9 = a + b; // sum9[8]에 캐리 저장assign {cout, sum8} = a + b; // cout에 캐리 저장
한국기술교육대학교 전기전자통신공학부 37
예제 1.6.11 결합연산자를 사용한 비트 결합
wire a1, b1;wire [3:0] a4;wire [7:0] b8, c8, d8;assign b8 = {a4, a4};assign c8 = {a1, b1, a4, 2'b10};assign d8 = {b8[3:0], c8[7:4]};
예제 1.6.12 결합 연산자를 사용한 이동 연산 구현
wire [7:0] a;wire [7:0] rot, shl, sha1, sha2;assign rot = {a[2:0], a[7:3]}; // 3 비트 우 순환 이동assign shl = {3'b000, a[7:3]}; // 3 비트 우 이동, MSB는 0으로 채움assign sha1 ={a[7], a[7], a[7], a[7:3]); // 3 비트 우 이동,
// MSB는 부호 비트로 채움, 산술 이동assign sha2 ={4{a[7]), a[7:4]}; // 4 비트 우 이동, 부호 채움
-
3개의 오퍼랜드, RHS의 값을 평가하여 좌측변수에 전달
한국기술교육대학교 전기전자통신공학부 38
조건연산자의 동작
? : sel ? m : n sel이 참이면 m을 선택하고 아니면 n을 선택
예제 1.6.13 조건 연산자 사용 예
assign out1 = sel ? in1 : in0 ; // 2-to-1 MUX
assign out2 = ( a >= 3) ? (sel ? x : y) : (sel ? m : n); //nested
assign rco = (cnt == 7) ? 1'b1 : 1'b0; // counter ripple out
assign sum[11:0] = en ? ({{2{n[9]}}, n[9:0]} + res[11:0]) : 0 ;
assign eq = (~i1 & ~i0) ? 1'b1 : // 진리표 모델링
(~i1 & i0) ? 1'b0 :
(i1 & ~i0) ? 1'b0 :
1'b1;
assign max2 = (a>b) ? a : b; // a,b 중 최대값 반환
assign max3 = (a>b) ? ((a>c) ? a : c) : ((b>c) ? b : c ) ; // a,b,c 최대값
i1 i0 eq
0 00 11 01 1
1001
-
연산자의 평가 순위
39한국기술교육대학교 전기전자통신공학부
연산자 기호 우선순위
unary ! ~ + - (unary)높은 순위
낮은 순위
arithmetic
**
* / %
+ - (binary)
shift >> >> > 1 // a+b 연산한 결과에 대하여 >> 1 연산
a + (b >> 1) // b>>1 연산한 결과에 대하여 a와 덧셈
a - 1 < b // a-1 연산한 결과와 b 비교
a - (1 < b ) // a에 (1 < b)의 비교 결과를 뺄셈
!x != y && z + x | y // ((!x) != y) && ( (z + x) | y )
-
1. Velilog HDL 개요2. Verilog 첫걸음3. Velilog 어휘규칙4. 모듈5. 데이터형6. 연산자7. 인스턴스8. 시스템 태스크와 함수9. 컴파일러 지시어
40한국기술교육대학교 전기전자통신공학부
-
구조적 모델링에서 하위 모듈이나 프리미티브 게이트를 포함하는 연결과정
포트 순서에 의한 연결 : 모듈정의시 사용한 포트 목록의 순서와 동일하게 신호 연결 연결하지 않아도 되는 포트는 두 개의 콤마 , , 사용 포트 정의시 사용한 순서와 신호의 크기가 일치하도록 유의
포트 이름에 의한 연결 : 포트 이름과 신호 이름을 같이 표현, 순서에 무관 연결이 필요하지 않는 포트는 신호 이름을 빈칸 ( )으로 남겨둔다.
41한국기술교육대학교 전기전자통신공학부
모듈인스턴스구문
포트 순서 연결 (portorderconnections)
module_name instance_name[instance_array_range] (signal, signal, ... );
포트 이름 연결 (portname connections)
module_name instance_name[instance_array_range] (.port_name(signal), (.port_name(signal), ...);
명시적 파라미터 재정의(explicit parameter redefinition)
defparamheirarchy_path.parameter_name= value;
묵시적 파라미터 재정의(implicit parameter redefinition)
module_name#(value) instance_name(signals);
-
파라미터 (parameter)를 포함한 인스턴스 명시적 파라미터 재정의 파라미터의 계층적 이름(hierarchical name)을 가진 defparam 문을 사용
묵시적 파라미터 재정의 모듈 사례화 시 #(value)의 형태로 사용. 모듈 내에서 여러 개의 파라미터가 선언되었을 때는 파라미터의 선언 순서대
로 값 지정
한국기술교육대학교 전기전자통신공학부 42
-
예제 1.7.1 파라미터를 사용한 모듈 인스턴스 예
module dff1 (q, qb, data, clk);
outputq, qb;
input data, clk;
parameterdelay = 2; //default 지연 파라미터 선언
dff_udp #(delay) (q, data, clk); // 사용자 정의 프리미티브
not (qb, q); // 프리미티브 게이트 인스턴스
endmodule
module reg4 (q, d, clk);
output [3:0] q;
input [3:0] d;
input clk;
wire [3:0] q, d;
dff1 u1 (q[0], , d[0], clk); // 순서 연결, qb는 개방(open)
dff1 u2 (.clk(clk), .q(q[1]), .data(d[1])); // 이름 연결
dff1 u3 (q[2], ,d[2], clk);
defparamu3.delay = 3.2; // 명시적 파라미터 재정의
dff1 #(2) u4 (q[3], , d[3], clk); // 암시적 파라미터 재정의
endmodule
한국기술교육대학교 전기전자통신공학부 43
-
예제 1.7.2 인스턴스 배열 예
module tribuf8 (y, a, en);
output [7:0] y;
input [7:0] a;
input en;
wire [7:0] y, a;
bufif1 u[7:0] (y, a, en);
// Verilog 3상 프리미티브 버퍼의 배열, 배열 크기는 8
// 벡터의 각 비트는 서로 다른 프리미티브 인스턴스에 연결
endmodule
module tribuf32 (out, in, en);
output [31:0] out;
input [31:0] in;
input en;
wire [31:0] out, in;
tribuf8 i[3:0] (out, in, en); // 8 비트 3상 버퍼 배열, 배열 크기는 4
// 각 인스턴스는 32 비트 벡터의 8 비트 부분 크기로 연결됨
// 스칼라 en 신호는 모든 인스턴스에 동시 연결
endmodule한국기술교육대학교 전기전자통신공학부 44
-
Verilog에서 제공하는 프리미티브 게이트 사용
delay : 선택, 프리미티브를 통과할 때에 발생하는 전달지연 시간 지연 값은 정수 혹은 실수 사용. 미정의시 default 값은 0(zero delay)
프리미티브 인스턴스에서 인스턴스 이름(instance_name)은 선택사항 시뮬레이션에서 같은 프리미티브를 사용하였을 때 구분하기 위하여 인스턴스
이름을 사용할 수 있다.
인스턴스 배열 범위(instance_array_range)는 선택사항 다중 프리미티브를 인스턴스할 때 각 인스턴스가 벡터의 분리된 비트로 사례
화
45한국기술교육대학교 전기전자통신공학부
프리미티브 인스턴스 구문
gate_type(drive_strength)#(delay) instance_name[instance_array_range] (terminal, terminal, ... );
switch_type #(delay) instance_name [instance_array_range] (terminal, terminal, ... );
-
Verilog의 프리미티브 게이트
인스턴스에서 신호연결은 순서에 의한 연결만 가능
46한국기술교육대학교 전기전자통신공학부
게이트 종류 연결 순서
and
or
xor
nand
nor
xnor
(1_output, 1-or-more_inputs)
buf not (1-or-more_outputs, 1_input)
bufif0
bufif1
notif0
notif1(1_output, 1_input, 1_control)
pullup pulldown (1_output)
user-defined-primitives (1_output, 1-or-more_inputs)
-
프리미티브 게이트의 진리표
한국기술교육대학교 전기전자통신공학부 47
and 0 1 x z
0 0 0 0 0
1 0 1 x x
x 0 x x x
z 0 x x x
nor 0 1 x z
0 1 0 x x
1 0 0 0 0
x x 0 x x
z x 0 x x
xnor 0 1 x z
0 1 0 x x
1 0 1 x x
x x x x x
z x x x x
not
입력 출력
0 1
1 0
x x
z x
buf
입력 출력
0 0
1 1
x x
z x
xor 0 1 x z
0 0 1 x x
1 1 0 x x
x x x x x
z x x x x
-
4가지 프리미티브 3상 버퍼/not
한국기술교육대학교 전기전자통신공학부 48
data out
control
data out
control
bufif1control
0 1 x z
data
0 z 0 L L
1 z 1 H H
x z x x x
z z x x x
bufif0control
0 1 x z
data
0 0 z L L
1 1 z H H
x x z x x
z x z x x
data out
control
data out
control
notif1control
0 1 x z
data
0 z 1 H H
1 z 0 L L
x z x x x
z z x x x
notif0control
0 1 x z
data
0 1 z H H
1 0 z L L
x x z x x
z x z x x
-
지연시간 표현
한국기술교육대학교 전기전자통신공학부 49
프리미티브 지연 시간 구문
#delay or #(delay)
// 출력 천이에서의 단일 지연 시간
#(delay, delay)
// (rising, falling) 천이에 대한 지연 시간
#(delay, delay, delay)
// (rising, falling, turn_off) 천이 지연 시간
#(min_delay:typ_delay:max_delay)
// 출력 천이에 대한 지연 시간의 (최소:평균:최대) 지연 값
#(min_delay:typ_delay:max_delay, min_delay:typ_delay:max_delay)
// (rising, falling) 천이에 대한 (최소:평균:최대) 지연 값
#(min_delay:typ_delay:max_delay, min_delay:typ_delay:max_delay,
min_delay:typ_delay:max_delay)
// (rising, falling, turn-off) 천이에 대한 (최소:평균:최대) 지연 값
-
예제 1.7.3 프리미티브 인스턴스 예
and i1 (out1, in1, in2); // zero delay, 인스턴스 이름
and #5 (o1, i1, i2, i3, i4); // 단일 게이트 지연 시간
not #(2,3) u7(out2, in); // (상승,하강) 지연 시간
wire [3:0] ndy, nd1, nd2;
nand #5 u_nd[0:3](ndy, nd1, nd2) // nand 배열 : 배열 원소수=4
wire [31:0] y, a;
buf #2.7 b1[31:0] (y, a); // 버퍼 배열 : 배열 원소수= 32
한국기술교육대학교 전기전자통신공학부 50
-
프리미티브를 사용한 전가산기 모델링
한국기술교육대학교 전기전자통신공학부 51
code 1.7.2-1fa_s.v, 프리미티브를 사용한
전가산기 모델링 예
module fa_s(x, y, ci, s, co);
input x, y, ci;
output s, co;
wire w1, w2, w3;
and #10 (w2, x, y);
xor #(6, 8) (w1, x, y);
and U3 (w3, w1, ci);
xor #(6:7:8, 7:8:10) U4 (s, w1, ci);
or U5 (co, w2, w3);
endmodule
w1
xyci
s
w2 w3co