안녕하세요,
이번 글에서는 Verilog HDL로 4x4 multiplier를 구현하고, 그 결과를 테스트 벤치(Test Bench)로 확인하겠습니다.
환경
- HDL : Verilog’ 2001 spec
- RTL Synthesis : Intel(Altera), Quartus prime 18.1
- Functional Simulation : Intel(Altera), ModelSim 10.5b
Quatus의 [File] → [New]에서 Verilog HDL File을 선택합니다.
4x4 multiplier를 구현했습니다.
module mult4x4 (
input [4:0] data_a ,
input [4:0] data_b ,
output [9:0] product
);
assign product = data_a * data_b;
endmodule
Verilog HDL Check point
- module과 endmodule로 module 시작 및 종료했습니다.
- 5 bit의 data_a, data_b를 곱한 9 bit의 product 값을 도출합니다.
- assign 구문을 이용해 product가 data_a와 data_b의 곱으로 설정합니다.
Test Bench를 작성했습니다.
`timescale 1 ns/1 ns
module mult4x4_tb();
reg [4:0] data_a ;
reg [4:0] data_b ;
wire [9:0] product ;
mult4x4 uMult4x4_0(
.data_a(data_a),
.data_b(data_b),
.product(product)
);
initial begin
data_a = 5'd3 ;
data_b = 5'd5 ;
forever
#4 data_a = data_a + 3;
end
endmodule
Test Bench Check point
- module과 endmodule로 module 시작 및 종료했습니다.
- `timescale 1 ns/1 ns에서 앞의 1ns는 기본 단위 설정이며, 뒤의 1ns이며 이것을 구현하는 해상도는 1ns라는 뜻입니다.
#4 data_a = data_a + 3 ; 구문에서 #4는 4 단위 시간 이후, data_a 값이 3 증가한다는 뜻입니다.
즉, 4ns 이후 data_a의 값이 3씩 증가합니다.
- 입력은 register인 reg로, 결과는 wire로 선언했습니다.
- mult4x4 uMult4x4_0은 instantation으로 Port name을 직접 Association 하는 방식을 사용했습니다.
즉, adder의 data_a 자리에 adder_tb의 data_a 값을 직접 mapping 했습니다.
다른 방식도 있으나 디버깅 효율을 높이기 위해 이 방법을 택했습니다. - data_a의 초기 값은 3, data_b의 초기 값은 5로 설정했습니다.
이제 ModelSim에서 시뮬레이션을 하기 위한 tcl파일을 만들겠습니다.
Quatus의 [File] → [New]에서 Tcl Script File을 선택합니다.
즉, 1번의 시뮬레이션을 위해서는 총 3개의 파일(Verilog HDL 기능 구현, TestBench, TCL)이 필요합니다.
vlib work
vlog mult4x4.v mult4x4_tb.v
vsim work.mult4x4_tb
add wave -radix dec /data_a
add wave -radix dec /data_b
add wave -radix dec /product
run 20 ns
TCL file Check point
- vlib work, vlog, vsim work은 필수 항목입니다.
vlog 다음엔 verilog HDL 파일과 test bench 파일 이름이 나와야 합니다.
vsim work 다음 test bench 파일이 나와야 합니다. - add wave는 파형 추가입니다. dec는 decimal인 10진법입니다.
- '/' 다음 결과를 보고자 하는 변수를 입력하면 됩니다.
- run 이후 시뮬레이션 시간을 입력하면 됩니다. 20ns 만큼 실행했습니다.
최종 결과