[VerilogHDL] Verilog 이론 (Ch.1 ~ 4)VerilogHDL/이론2024. 5. 20. 01:42
Table of Contents
Ch.1 Verilog HDL 기본
- HDL(Harware Description Language) : 하드웨어 기술 언어111
특징
- 특정 소프트웨어에 종속되지 않음
- 회로 합성 및 검증
- RTL 모델링을 통한 디지털 시스템의 설계에 사용 → 게이트 수준 회로로 변환
HDL 기반 시스템 반도체 설계 과정
수 표현 : 2가지 형식
[형식 1]
- 0~9의 숫자를 사용한 일반적인 10진수 표현
- +, - 기호 사용 가능
[형식2]
- [size-constant]
- 상수 값의 비트 수를 나타내는 상수로서 이 아닌 unsigned 10진수 사용된다. 생략되면 비
트 수가 지정되지 않은 unsized 수가 되며 32비트로 표현된다. - base-format으로 지정된 밑수에 적합한 숫자로 구성되어야 한다.
- ex)
a = 3;
- 상수 값의 비트 수를 나타내는 상수로서 이 아닌 unsigned 10진수 사용된다. 생략되면 비
- 'base.format
- 밑수(base) 지정 문자로 2진수(b, B), 8진수 0), 10진수(d D), 16진수(h, H)를 지정하며, 대소
문자 구별이 없다 - signed를 나타내기 위해 부호 지정자 s 또는 S가 함께 사용될 수 있다.
- 인용부호(’)와 밑수 지정 문자는 붙여야 하며, 여백으로 분리될 수 없다
- ex)
a = 10’h3;
- 밑수(base) 지정 문자로 2진수(b, B), 8진수 0), 10진수(d D), 16진수(h, H)를 지정하며, 대소
- number.value
- unsigned 숫자를 사용하여 값을 표현한다.
- 밑수 지정자와 숫자 사이에 부호+ 또는 7를 사용할 수 없으며, 여백 없이 붙여야 한다.
- 16진수의 값을 나타내는 문자 a ~ f는 대소문자 구별이 없다.
- 첫 번째 숫자를 제외하고 중간에 밑줄을 사용할 수 있으며, 이는 가독성(readability)을 좋게 한다
기타 수의 표현
- 숫자 사이에 언더바(_) 사용 가능
- ex) 100_000_000
- 음수 표현
- 2의 보수 사용
- ex)
4’shf
: 2진수 1111을 2의 보수로 해석 → 10진수 -1
- X(unknow), Z(high-impedence)
12'hx
: 12비트의 X16'hz
: 16비트의 Z
문자열
module string_test;
reg [*184:1] string_var;
initial begin
string_var = "Hello world";
$display("%s is stored as %h", string_var, string_var);
string_var = {s t ring一var,"!!!"};
$displayC%s is stored as %h", string_var, string_var);
end
endmodule
<실행 결과>
Hello world is stored as 00000048656c6c6f20776f726c64
Hello world!!! is stored as 48656c6c6f20776f726c64212121
⇒ $display
: c언어의 printf
와 유사함
Verilog HDL 구문
컴파일러 지시어
- ``define wordsize 8`
- c언어의 #define
- 키보드 ‘~’에 있는 문자
Verilog HDL 구문
⇒ 회로 합성 지원 구문과 아닌 구문이 따로 있다.
Verilog HDL 모듈
예시) ← Gate primitive 이용한 반가산기 모듈
행위수준 모델링 : 조합회로
→ sensitivity lsit에 edge가 없을 때 : 조합회로
행위 수준 모델링 : 순차회로
→ sensitivity lsit에 edge가 없을 때 : 순차회로
구조적 모델링
: 모듈안의 모듈
- 이름에 의한 포트 연결과 순서에 의한 포트 연결이 있음
테스트벤치 모듈
- DUT : 시뮬레이션 대상 모듈
- stimulus : DUT 입력값
- DUT : module Mod_A
- Stimulus : 시뮬레이션 입력 값
Ch.2 자료형과 연산자
4가지 논리 값
0
: 논리 0 == false1
: 논리 1 == trueX
(unknon) : 논리 0, 1을 확정할 수 없는 상태Z
(high-impedence) : Floating
net 자료형
- 물리적 연결
- 값을 저장하지 않음
net 자료형 선언 예시
wire wl, w2; // wl, w2는 1 비트의 wire로 선언되었으며, 1비트의 wire는 Verilog HDL의 기본 자료형이므로 선언을 생략할 수 있다.
wire [7:0] bus; // bus는 8비트의 wire로 선언되었다.
wire enable=l'b0; // enable은 초기 값 0을 갖는 1비트의 wire로 선언되었다.
wand w3; // w3는 1비트의 wand로 선언되었다.
tri [15:0] busa; // b나sa는 16비트의 tri로 선언되었다.
wire 자료형 초기화 가능!
variable 자료형
→ 절차형 할당문(always 문
) 안에서 값 저장 가능
reg
: 1bitinteger
: 32bit, signedtime
: 64bit, unsignedreal
,realtime
: 시뮬레이션용
벡터와 배열
- 벡터 선언 예시
reg [7:0] rega // rega는 8비트 reg 자료형의 벡터이다.
wire [15:0] d_out // d_out은 16비트 wire 자료형의 벡터이다.
- 배열 선언 예시
reg [7:0] mem_A [0:255]; // reg mem_A는 8비트 레지스터 256개로 구성되는 메모리에 대한 선언
reg array_B [7:0][0:255]; // reg array_B는 1비트 레지스터가 8x256 크기로 구성된 2차원 배열의 선언
wire w_array [7:0][5:0]; // wire w_array는 8x6 크기의 1비트 wireOfl 대한 2차원 배열의 선언
integer int_A [1:64]; // 정수형 값 64개로 구성되는 1차원 배열의 선언
time chng_hist [1:1000]; // 시간값 1,000개로 구성되는 1차원 배열의 선언
→ 메모리 설계에 많이 사용된다.
parameter
- c언어의 define 같은 느낌(상수 값)
parameter msb = 7; // defines msb as a constant value 7
parameter e = 25, f = 9; // defines two constant numbers
parameter r = 5.7; // declares r as a real parameter
parameter byte_size = 8, byte_mask = byte_size - 1;
parameter average_delay =(r + f) / 2;
parameter pl = 13'h7e;
parameter [31:0] dec_const = l*bl; // value converted to 32 bits
parameter newconst = 3'h4; // implied range of [2:0]
parameter newconst = 4; // implied range of at least [31:0]
연산자
수식에서 정수형 수의 처리 방식
integer IntA, IntB, IntC, IntD;
IntA = -12 / 4; // 예 The result is -3.
IntB = -'dl2 / 4; // 예 The result is 1073741821.
IntC = -'sdl2 / 4; // 예 The result is -3.
IntD = -4'sdl2 / 4; // 예 4'sdl2 is the negative of 1100, which is -4.
// -(-4) = 4 The result is 1.
산술 연산자
- 피연산자의 비트 값이 X or Z 값이면 결과는 X
관계 연산자
// A = 9, B = 4
// D = 4'bl001, E = 4'bll00, F = 4'blxxx
A <= B // 예 : 결과 값은 거짓(0)
A>B // 예 : 결과 값은 참(1)
E >= D // 예 : 결과 값은 참(1)
E < F // 예 : 결과 값은 X
E < F → 결과 값은 X
등가 연산자
// A = 9, B = 4, D = 4'bl001, E = 4^1100
// F = 4'blxxz, G = 4'blxxz, H = 4'blxxx
A === B // 결과 값은 거짓(0)
D != E // 결과 값은 참⑴
D == F // 결과 값은 x
F === G // 결과 값은 참⑴
F === H // 결과 값은 거짓(0)
G !== H // 결과 값은 참⑴
축약 연산자
wire [3:0] cnt;
wire parity;
assign parity = ^cnt; // 축약 XOR 연산자
assign parity = cnt[3] ^ cnt[2] ^ cnt[l] ^ cnt[0]; // 비트 XOR 연산자
→ 각 비트끼리 연산
시프트 연산자
- 논리 시프트 연산자(<<, >>)
- 피연산자의 값만큼 왼쪽, 오른쪽으로 시프트(비어 있는 비트에 0 채움)
- 산술 시프트 연산자(<<<, >>>)
<<<
: 왼쪽으로 시프트(비어 있는 비트에 0 채움)>>>
: 오른쪽으로 시프트(비어 있는 비트에 좌측 피연산자의 MSB를 채움)- ex)
4’b0100 >>> 1 ⇒ 4’b0010
,4’b1000 >>> 1 ⇒ 4’b1100
조건 연산자(삼항 연산자)
(조건) ? 참 : 거짓
wire [15:0] busa, data;
assign busa = drive_busa ? data : 16'bz;
drive_busa가 참이면 busa = data, 거짓이면 busa = 16’bz
결합 및 반복 연산자
- 결합 연산자
wire [15:0] addr_bus;
wire [7:0] addr_h, addr_l;
assign addjbus = {addr_h, add_l};
wire [3:0] a, b, sum;
wire carry;
assign {carry, sum ) = a + b;
→ 비트 결합
- 반복 연산자
형태 : { { }}
Ch.3 게이트 수준 모델링
기본 primitive
- 게이트 primitive 인스턴스에서 #n으로 지연을 지정하지 않으면 default 지연 0 (simulation 한정)
3-state buffer
bufif1
과 같이 뒤 숫자 0, 1이 control 입력을 나타낸다.
→ control입력이 0으로 들어가면 출력 high-impedence
primitive 배열
Ch.4 할당문
연속할당 & 절차형 할당
- 연속 할당 : net형 자료형 신호에 값을 할당
assign
문- 기호
=
- 할당문의 순서가 시뮬레이션 영향 X
- 절차형 할당 : variable 자료형 변수에 값을 할당
- blocking 할당문 : 기호
=
- non-blocking 할당문 : 기호
<=
=
사용할 경우 할당문의 순서가 시뮬레이션 영향 O
- blocking 할당문 : 기호
reg inA, inB;
initial begin
# 0 inA = l'b0; inB = l'b0;
# 10 inA = l'bl;
# 20 inA = l'b0; inB = l'bl;
# 20 inB = l'b0;
# 10 inA = l'bl; inB = l'bl;
# 20 inA = l'b0;
# 30 inB = l'b0;
end
Made By Minseok KIM
'VerilogHDL > 이론' 카테고리의 다른 글
[VerilogHDL] Verilog 이론 (Ch.5 ~ 11) (0) | 2024.05.21 |
---|
@민바Minba :: Minba's blog
Let's Be Happy!
도움이 되었으면 좋겠어요 :)