HDL/Verilog

Verilog HDL로 shifter 구문 작성과 테스트 벤치(Test Bench)로 결과 확인하기

Torrance 2023. 9. 30. 07:00

안녕하세요,
이번 글에서는 Verilog HDL로 4bit를 이동시키는 shifter 구현 및 그 결과를 테스트 벤치(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을 선택합니다.

shifter를 구현했습니다.

module shifter(

		input		[7:0]	inp			,
		input		[1:0]	shift_cntrl	,
		output reg 	[15:0]	shift_out	 
);

		always @ (*) begin
			
			if(shift_cntrl == 1)
				shift_out = inp << 4 ;
			
			else if(shift_cntrl == 2)
				shift_out = inp << 8 ;
			
			else
				shift_out = inp		;
		end
		
endmodule

Verilog HDL Check point

  • if else 구문은 always, initial block에 속해 있으므로 꼭 always, initial 구문 안에서 사용해야 합니다.
  • shift_cntrl  값이 1이면 4 bit를 이동하고 shift_cntrl 값이 2면 8 bit를 이동합니다. 

 

Test Bench를 작성했습니다.

`timescale 1 ns/1 ns

module shifter_tb();

	reg 	[7:0]	inp			;
	reg 	[1:0]	shift_cntrl	;
	wire 	[15:0] 	shift_out	;
	
	
	shifter uShifter_0(
		.inp		(inp)			,
	    .shift_cntrl(shift_cntrl)	,
	    .shift_out	(shift_out)
	);

	initial begin
	
		shift_cntrl = 4'd0 ;  	
		inp = 8'hF4;			
		
		#6 shift_cntrl = 4'd1 ;
		#6 shift_cntrl = 4'd2 ;
		
	end

endmodule

Test Bench Check point

  • `timescale 1 ns/1 ns에서 앞의 1ns는 기본 단위 설정이며, 뒤의 1ns이며 이것을 구현하는 해상도는 1ns라는 뜻입니다. 처음 시작하면 shift_cntrl에 0이 할당되고, #6 shift_cntrl = 4'd1 ; 구문에 의해 6 단위인 6ns 후 1(01)이 됩니다. 그리고 다시 6ns 후 2(10)가 됩니다.
6ns 후 shift_cntrl은 00 -> 01, 다시 6ns가 지난 12ns에서 01->10
  • module과 endmodule로 module 시작 및 종료했습니다.
  • 입력은 register인 reg로, 결과는 wire로 선언했습니다.
  • shifter uShifter_0은 instantation으로 Port name을 직접 Association 하는 방식을 사용했습니다.
    다른 방식도 있으나 디버깅 효율을 높이기 위해 이 방법을 택했습니다.
  • inp의 초기 값은 F4로 설정했습니다.

이제 ModelSim에서 시뮬레이션을 하기 위한 tcl파일을 만들겠습니다.

Quatus의 [File] → [New]에서 Tcl Script File을 선택합니다.

 

즉, 1번의 시뮬레이션을 위해서는 총 3개의 파일(Verilog HDL 기능 구현, TestBench, TCL)이 필요합니다.

vlib work
vlog shifter.v shifter_tb.v
vsim work.shifter_tb

add wave -radix hex /inp
add wave -radix binary /shift_cntrl
add wave -radix hex /shift_out

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 이후 시뮬레이션 시간을 입력하면 됩니다.

 

최종 결과
00f4 -> 0f40 -> f400