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

[개인스터디] DPRAM 설계

rlaghrud1234 2023. 2. 19. 23:57

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

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

 

1. DPRAM 개념

DPAM에 대해 알기 위해서는 우선 SRAM에 대해서 알아야 된다.

우리가 메모리에 대해 배울 때 SRAM와 DRAM에 대해서 배우게 되는데, 

DPRAM의 개념은 SRAM 개념에서 나오게 됐다. SRAM과 DRAM의 차이는 인터넷에 검색해도 많이 나오니 생략하도록 하겠다.

 

우리가 SRAM을 생각하면 입/출력 단이 "한개인" SRAM을 많이 떠오른다. 즉 이러한 SRAM들은 Single Port SRAM이라고 하며 간단한 Block Diagram으로 나타내면 다음과 같다.

 

출처 : https://wikidocs.net/86999

 

회로 내에는 무수히 많은 Clock Signal이 존재하며, Clock 간의 주파수는 정말 다양하게 많다. 그렇게 되면 하나의 module에서 Clock을 다르게 하여 입/출력을 동기화 시키는 것은 매우매우매우 어렵다.

 

바로 이런 이유에서 Dual Port SRAM이라는 개념이 등장했다.

입/출력의 Clock 신호를 개별적으로 둠으로써 다른 clock들 간의 동기화가 따로 필요없기 때문에 동작 수행이 훨씬 수월해진다. 간단한 Block Diagram으로 나타내면 다음과 같다.

 

출처 : https://wikidocs.net/86999

 

2. DPRAM의 사용

"VHDL과 반도체 회로설계" 책에서 언급하길 2007년 기준 Memory DDR4는 233MHz로 동작을 했고 기타 User I/O들은 80~100MHz를 사용했다고 한다. 이 두개의 전자 부품 사이에는 "Bridge"라는 것이 사용 되는데, 이 때 사용되는 개념이 바로 앞서 언급한 Dual port SRAM이 된다. 이 Bridge의 종류는 PCI Bridge, USB Bridge 등이 있다.

SoC가 점점 발전이 돼감에 따라 Bridge들은 SoC 내부로 들어가기 시작했고, 이는 FIFO와 같은 회로를 탄생시킨다. FIFO에는 DPRAM 구조가 당연히 들어가게 된다. (없어진게 아니라, 이 기본 회로들은 어디든지 무조건 이용이 된다는 듯하다.)

 

3. DPRAM의 Verilog 표현

위 Block diagram하고는 signal 명명이 다르다. (위 사진들은 예시 사진으로 가져온 것이므로)

 

Module의 코드는 다음과 같이 작성했다.

module DPRAM(
    CLK_L,
    W_EN,
    Addr_L,
    Data_In,
    
    CLK_R,
    R_EN,
    Addr_R,
    Data_Out
    );

	 parameter AddressLine = 8;
    parameter BitWidth = 4;
	 
	 //Write
	 input CLK_L;
	 input W_EN;
	 input [AddressLine - 1:0] Addr_L;
	 input [BitWidth - 1:0] Data_In;
	 
	 //Read
	 input CLK_R;
	 input R_EN;
	 input [AddressLine - 1:0] Addr_R;
	 
	 output [BitWidth - 1:0] Data_Out;
    
    reg [BitWidth - 1 : 0] mem_reg [AddressLine - 1 : 0];
    reg [BitWidth - 1 : 0] temp_Data_Out;
    
    assign Data_Out = temp_Data_Out;
    
    genvar i;
    generate
        for(i = 0; i < AddressLine; i = i + 1)
        begin : mem_initialize
            initial
            begin
                mem_reg[i] <= 0;
            end
        end
    endgenerate
    
    always@(posedge CLK_L)//write sequence
    begin
        if(W_EN)
        begin
            mem_reg[Addr_L] <= Data_In;
        end
    end
    
    always@(posedge CLK_R)
    begin
        if(!R_EN)
        begin
            temp_Data_Out <= 4'bZ;
        end
        
        else
        begin
            temp_Data_Out <= mem_reg[Addr_R];
        end
    end
    
endmodule

 

이에 대한 Test Bench도 같이 작성했다.

module tb_DPRAM();
	
	parameter AddressLine = 8;
   parameter BitWidth = 4;
	
	reg CLK_L;
	reg W_EN;
	reg [AddressLine - 1:0] Addr_L;
	reg [BitWidth - 1:0] Data_In;
	
	reg CLK_R;
	reg R_EN;
	reg [AddressLine - 1:0] Addr_R;
	
	wire [BitWidth - 1:0] Data_Out;
	
	DPRAM test(
		.CLK_L(CLK_L),
		.W_EN(W_EN),
		.Addr_L(Addr_L),
		.Data_In(Data_In),
		.CLK_R(CLK_R),
		.R_EN(R_EN),
		.Addr_R(Addr_R),
		.Data_Out(Data_Out));
	
	always#(10)
	begin
		CLK_L = ~CLK_L;
	end
	
	always#(20)
	begin
		CLK_R = ~CLK_R;
	end
	
	initial
	begin
		CLK_R = 0;
		CLK_L = 0;
		W_EN = 0;
		R_EN = 0;
		
		#10; //10ps
		W_EN = 1;
		Addr_L = 6;
		Data_In = 4'b1010;
		
		#50; //60ps
		W_EN = 0;
		Addr_L = 5;
		Data_In = 4'b1110; //no input
		
		#50; //110ps
		W_EN = 1;
		Addr_L = 4;
		Data_In = 4'b0001;
		
		#10; //120ps
		W_EN = 0;
		
		#30; //150ps
		R_EN = 1;
		Addr_R = 6;
		
		#80; //230ps
		Addr_R = 4;
	end
	
endmodule

 

4. DPRAM의 Netlist Viewer

 

5. Simulation을 통한 검증

DPRAM 작동 동작을 만족하는 Simulation 결과가 나왔다.