logic design unit을 module이라고 한다. unit에서 알 수 있듯이 HW의 기본단위를 module로 이해하면된다.
module의 경우 위와같은 형식으로 코딩해주면되며,
예시로 and gate를 한 번 시뮬레이션 설계해보고 시뮬레이션까지 돌려보자.
vivado에서 source file과 tb file을 위와같이 만든 후 simulation을 돌려보면,
다음과 같이 예상한대로 파형을 볼 수 있다.
이제 상세하게 한번 과정들을 알아보자.
1. Port
port는 module의 입/출력 신호이다.
port_direction / port_type / port_name_list 이순서대로 베릴로그 코딩을 하며,
위와같이 짜면 된다.
2. Data Types
0 : Zero
1 : one
x : don't care
z : high impedance (연결이 되지 않았거나 drive하는 source가 없는 경우)
3. Constants
Bit width' / Base/ Value
2'b10 (10), 4'd5 (0101) ...
4. Data Objects
Net : wire (연결)
Variable : reg (값 저장)
<Net> : 물리적 연결, Output of combinational Logic, assign의 왼쪽에 있는 부분은 무조건 wire로 선언
wire (Bit range)(Delay)(Wire name list)
wire [7:0] s1, s2;
default: wire (signal이 쓰이고 있는데 선언이 안된경우 wire로 쓰이고 있다.)
assign a = b+c; 여기서 a는 무조건 wire
<reg> : 값 저장, Output of combinational/ sequentail logic, always의 왼쪽에 있는 부분은 무조건 reg로 선언
reg (Bit range)(Register name list);
reg [7:0] s1, s2;
default: single bit
reg q; -> single bit임
always @(posedge clk)
q<=d;
여기서 q는 무조건 reg (clk에 영향 받음 -> sequential -> 당연하게 reg임)
이 개념들을 가지고 다시 위로 돌아가면,
and_gate라는 module의 port로 A, B, C를 사용한다고 해주고,
A, B, C가 각각 어떤 port인지 적어줬다.
그 후, combination logic이기때문에 assign문을 통해 코딩을 해주었다.
원래 대로라면 net declaration을 해야하기 때문에 wire C; 를 해주어야 했지만, default값이 wire이기 때문에 그냥 바로 assign C = A & B;를 사용한 모습이다.
이부분은 testbench 부분인데,
testbench란 하나의 module으로 입력신호를 생성하고 output확인하는 code (오실로스코프의 function generator생각하면 됨) 이다.
module 검증하기 위한 용도로 사용하기 때문에 입력신호는 값을 변경할수있게 reg로, 출력신호는 단순 모니터링 용도이기 때문에 wire로 사용했다.
testbench를 작성하는 방법은 추후에 따로 포스팅하나를 할당해서 설명할 예정이므로 일단 넘어가자.
'공부 > Verilog' 카테고리의 다른 글
6. Sequential Logic_ Counter (0) | 2025.01.18 |
---|---|
5. Binary multiplier (1) | 2025.01.14 |
4. Four bit ripple carry adder (0) | 2025.01.12 |
3. Design Full Adder (0) | 2025.01.11 |
1. Verilog_Preview (0) | 2025.01.10 |