HDL/Verilog

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

Torrance 2023. 10. 2. 07:00

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

asynchronous control을 구현했습니다.

module counter(
	
	input				clk		,
	input 				aclr_n	,
	output reg 		 	count_out
	
);
	always @ (posedge clk, negedge aclr_n) begin

		if (!aclr_n)
			count_out <= 0;
		else
			count_out <= count_out + 1;
	end
	
endmodule

Verilog HDL Check point

  • if else 구문은 always, initial block에 속해 있으므로 꼭 always, initial 구문 안에서 사용해야 합니다.
  • alcr_n 값이 0이면 count_out에는 0이 할당되고, 1이면 1씩 증가합니다.
    count_out은 1 bit이기 때문에 0과 1 값만 갖게 됩니다. 

 

Test Bench를 작성했습니다.

`timescale 1 ns/1 ns

module counter_tb();

	reg		clk		  ;
	reg		aclr_n	  ;
	wire	count_out ;
	

	counter uCounter_0(
	
		.clk(clk),
		.aclr_n(aclr_n),
		.count_out(count_out)
	);
	
	initial begin
	clk = 0 ;
	forever #1 clk = ~clk ;
	end
	
	initial begin
	aclr_n = 1'b0;
	#3 aclr_n = 1'b1;
	end

endmodule

Test Bench Check point

 

  • 입력은 register인 reg로, 결과는 wire로 선언했습니다.
  • `timescale 1 ns/1 ns에서 앞의 1ns는 기본 단위 설정이며, 뒤의 1ns이며 이것을 구현하는 해상도는 1ns라는 뜻입니다.
    https://semiconwide.tistory.com/64 를 보시면 더욱 이해가 잘 될 것입니다.
  • forever #1 clk = ~clk ; 구문에서 처음 clk 값은 0으로 할당되고, 1단위인 1ns 유지 후, ~clk인 1값이 됩니다. 다시 이것을 1ns 유지 후 0으로 바뀌고 이것을 계속 반복하는 clock을 생성합니다.
  • counter uCounterr_0은 instantation으로 Port name을 직접 Association 하는 방식을 사용했습니다.
    다른 방식도 있으나 디버깅 효율을 높이기 위해 이 방법을 택했습니다.

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

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

 

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

vlib work
vlog counter.v counter_tb.v
vsim work.counter_tb

add wave -radix binary /clk
add wave -radix binary /aclr_n
add wave -radix binary /count_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 이후 시뮬레이션 시간을 입력하면 됩니다.

 

최종 결과
클럭 주기의 2배가 되는 count_out 생성

aclr_n = 1 이면서 posedge일 때 count_out 값에 1씩 증가합니다. 반응 속도가 2배로 느려지게 됩니다. 그러므로 기존 2ns 주기의 클럭이 4ns 주기가 됐습니다.