호경

[개인스터디] Loadable Counter and Test Bench 본문

디지털회로설계/SoC,ASIC 설계

[개인스터디] Loadable Counter and Test Bench

rlaghrud1234 2023. 1. 8. 02:56

※시작에 앞서, 해당 내용은 서적 "VHDL과 반도체 회로설계"의 내용을 토대로 작성됐다.

※나는 Verilog HDL 코드로 작성해서 스터디를 진행했다.


1. Loadable Counter

A. Loadable Counter

가장 먼저 하나의 반도체 내부의 회로 구조에 대해서 살펴보면 다음과 같이

1) Controller : CPU, GPU 등

2) Interface : 외부 IO 혹은 외부 통신 제품과의 연결 파트

3) Memory Controller : 내부와 외부의 메모리를 컨트롤 해주는 파트

특히 Memory Controller와 Interface Part에는 Counter 회로가 필수적으로 속한다. Clock이라는 입력이 들어가면서 Time 별로 데이터의 입출력을 담당해야 되기 때문이다. 교본을 참고하였을 때 Counter 회로에 대한 완벽한 이해를 하고 구조를 짤 줄 안다면 반도체 회로 설계의 70% 이상 작업을 마쳤다고 할 수 있다고 언급돼 있다.

 

이번 포스팅에서 설계해 볼 회로는 Counter 회로 중에서 제일 많이 활용되고 있는 Loadable Counter를 설계해 보고자 한다.

 

[Loadable Counter 입출력 정의]

입력 신호로는

CLK : 모든 Counter 회로에 들어가는 주파수 신호

RST : CLK가 들어가는 모든 Sequential 회로에 들어가는 초기화 신호

ENB, LOADB : Control 역할을 맡을 신호

D1 : 입력 데이터 신호

 

출력 신호로는

D0 : 출력 데이터 신호

 

[동작 스펙]

RST CLK ENB LOADB D0
0 #40ns CLK X X 초기화
1 0 X 값 유지
1 1 0 D1 값 불러오기
1 1 1 카운트 올리기

 

[Verilog HDL 코드]

module Loadable_Counter(CLK, RST, ENB, LOADB, D1, D0);
	
	input CLK, RST, ENB, LOADB;
	input[3:0] D1;
	
	output[3:0] D0;
	reg[3:0] T_D0;
	
	assign D0 = T_D0;
	
	always@(posedge CLK or negedge RST)
	begin
		if(!RST)
		begin
			T_D0 <= 4'b0000;
		end
		
		else
		begin
			if(ENB == 1)
			begin
				if(LOADB == 1)
				begin
					T_D0 <= T_D0 + 1;
				end
				
				else
				begin
					T_D0 <= D1;
				end
			end
		end
	end
	
endmodule

[Netlist Viewer]

 

2. Test Bench

[언어 간의 동작 과정 검증에 대한 호환 및 통일화]

Test Bench는 시뮬레이션을 하기 위한 코드로, 각 종 언어를 통해 회로를 설계했을 때, 검증을 언어 별로 진행하게 되면 굉장히 번거롭기 때문에 이를 통일화 하고 호환할 수 있는 방법으로 테스트 벤치가 생기게 됐다.

 

내가 작성하는 테스트벤치 코드는 Unit under test인 UUT를 사용하여 진행을 했다.

 

테스트 벤치는 위 Loadable Counter에 대한 검증 코드로 작성했다.

 

[Test Bench Verilog HDL 코드]

module tb_Loadable_Counter();
	
	reg CLK, RST, ENB, LOADB;
	reg[3:0] D1;
	
	wire[3:0] D0;
	
	Loadable_Counter uut(
		.CLK(CLK),
		.RST(RST),
		.ENB(ENB),
		.LOADB(LOADB),
		.D1(D1),
		.D0(D0));
		
	always#(20)
	begin
		CLK = ~CLK;
	end
	
	initial
	begin
		RST = 0;
		CLK = 0;
		ENB = 1;
		LOADB = 1;
		D1 = 4'b1001;
		
		#40;
		RST = 1;
		
		#260;
		ENB = 0; //at 300ns
		
		#140;
		LOADB = 0; //at 500ns
		
		#200;
		ENB = 1; //at 700ns
		
		#200;
		LOADB = 1; //at 900ns
		
		#200;
		RST = 0; //at 1100ns
		D1 = 4'b0011;
		
		#200;
		RST = 1; //at 1200ns
	end
	
endmodule

[Simulation 결과]

정확한 동작 과정이 나왔다.

 

Comments