인프런 커뮤니티 질문&답변

roy00cho님의 프로필 이미지
roy00cho

작성한 질문수

디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기

[과제2] Port를 확장하여 High-speed를 위한 Dual-port + Two-port RAM 설계하기

dual port ram 설계 코드 질문

해결된 질문

작성

·

117

1

module dpsram #(
 parameter DEPTH=8,
 parameter WIDTH=32,
 parameter DEPTH_LOG=$clog2(DEPTH)
)(
 input clk,
 input [WIDTH-1:0] din_a,
 input [WIDTH-1:0] din_b,
 input [DEPTH_LOG-1:0] addr_a,
 input cs_a,
 input we_a,
 input [DEPTH_LOG-1:0] addr_b,
 input cs_b,
 input we_b,
 output reg [WIDTH-1:0] dout_a,
 output reg [WIDTH-1:0] dout_b
);

 reg [WIDTH-1:0] mem[DEPTH-1:0];
 
 initial begin
	for(int i=0;i<DEPTH;i++) mem[i]=0;
 end

 always@(posedge clk) begin                //write
	if(we_a && cs_a) mem[addr_a] <= din_a;
	if(we_b && cs_b) mem[addr_b] <= din_b; 
 end

  always@(posedge clk) begin               //read
	if(~we_a && cs_a) dout_a <= mem[addr_a];
	if(~we_b && cs_b) dout_b <= mem[addr_b];
 end
 
endmodule

위와같이 dpsram코드를 짰습니다. 예제 코드와는 다르게 저는 write와 read를 각각 나눠서 always block을 구성했는데 이렇게 짜면 다르게 동작하나요? RTL 뷰어로 보니 아래와 같이 복잡하게 나와서 질문드립니다.

image.png

답변 1

0

네 안녕하세요, 답변 남겨드립니다.

먼저 위와 같이 작성해도 돌아갈것 같긴 한데, 좋은 코드는 아닙니다. 왜냐하면 지금은 조건문에서 서로 겹치는것이 없어서 괜찮지만 혹시라도 if 조건문이 겹치게 되면 신호가 blocking 될 수도 있을듯 합니다.

한 번 시뮬레이션 테스트벤치를 똑같이 돌려보고 결과 비교해보시겠어요? 잘 돌아갈 것 같긴 합니다.

또한 합성 결과가 다른 이유는, Quartus는 메모리의 형태가 갖추어진 코드의 경우, 자체적으로 내장되어있는 메모리를 사용하게 됩니다. 따라서 저의 예시 코드는 일반적 메모리의 형태를 갖추고 있어서 해당 메모리를 사용하여 합성한 것이고, 질문주신 코드의 경우는 메모리의 형태는 아니고 커스텀된 코드이기 때문에 단지 그에 맞춰서 합성이 MUX로 된 것입니다.

또 진행하시면서 궁금한 점 있다면 질문 주세요!

roy00cho님의 프로필 이미지
roy00cho

작성한 질문수

질문하기