Inflearn brand logo image

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

akims님의 프로필 이미지
akims

작성한 질문수

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

컴퓨터 구조의 메모리 계층 구조와 Verilog로 SRAM 모델링하기

SRAM 강의 TB 작성 후 waveform 확인시에 dout이 모두 don't care 처리 관련 질문드립니다.

해결된 질문

작성

·

28

0

SRAM 기본 모델링 코드 작성후, RTL view통해서 확인시에 dout 값이 모두 xxxxxx로 처리가 되는데, TB 작성에도 문제가 없어보여 고쳐야할 부분이 있는지 문의드립니다.

 

image.png

 

 

image.png

 

답변 5

0

  • @(negedge clk) 에서 입력 세팅 → posedge clk에서 안정적으로 Write/Read 반영.

  • initial dout = 0;sram_model에 넣어 첫 출력이 x가 아니라 0으로 시작.

  • 쓰기 후 읽기에서 dout이 제대로 메모리 값('h10 + i)을 출력하게 됨.

    아래 코드로 확인해보시겠어요?

    module tb_sram;

parameter DEPTH = 8;

parameter WIDTH = 32;

parameter DEPTH_LOG = $clog2(DEPTH);

reg clk;

reg cs, we;

reg [DEPTH_LOG-1:0] ad;

reg [WIDTH-1:0] din;

wire [WIDTH-1:0] dout;

// 클럭 생성

initial begin

clk = 0;

forever #5 clk = ~clk; // 10ns period

end

// Stimulus

initial begin

cs = 0; we = 0; ad = 0; din = 0;

// --- Write Phase ---

for (int i = 0; i < DEPTH; i++) begin

@(negedge clk); // 클럭 하강 에지에서 세팅

cs <= 1;

we <= 1;

ad <= i;

din <= 'h10 + i;

end

// --- Read Phase ---

for (int i = 0; i < DEPTH; i++) begin

@(negedge clk); // 마찬가지로 하강 에지에서 세팅

cs <= 1;

we <= 0;

ad <= i;

end

// 시뮬레이션 종료

repeat (3) @(posedge clk);

$finish;

end

// DUT 연결

sram_model #(DEPTH, WIDTH) u_sram (

.clk (clk),

.cs (cs),

.we (we),

.ad (ad),

.din (din),

.dout(dout)

);

endmodule

 

0

akims님의 프로필 이미지
akims
질문자

감사합니다. 말씀주신대로 수정을 하여도 동일하게 dout은 don't care처리가 발생하고 있습니다. 다시 한번 코드 점검을 했는데 빠진게 없는듯하여, 혹시 바쁘시겠지만 빠진 부분이 있는지 확인 한번 부탁드려도 될까요?

 

0

input [DEPTH-1:0] ad 여기가 잘못되어있는듯한데,

input [DEPTH_LOG-1:0] ad

이게 우리가 의도하는것이니 이걸로 해보시겠어요?

0

akims님의 프로필 이미지
akims
질문자

1) SRAM RTL Code

 

module sram_model #(

parameter DEPTH=8,

parameter WIDTH=32,

parameter DEPTH_log=$clog2(DEPTH)

)(

input clk,

input cs,we,

input [DEPTH-1:0] ad,

input [WIDTH-1:0] din,

output reg [WIDTH-1:0] dout

);

reg [WIDTH-1:0] mem[DEPTH-1:0];

initial begin /*초기화 시키기 위함*/

for( int i=0; i<DEPTH; i++) mem[i]=0;

end

always @(posedge clk)

if (cs&we) mem[ad] <=din;

else if (cs) dout<=mem[ad];

endmodule

 

 

2) tb_SRAM

module sram_model #(

parameter DEPTH=8,

parameter WIDTH=32,

parameter DEPTH_log=$clog2(DEPTH)

)(

input clk,

input cs,we,

input [DEPTH-1:0] ad,

input [WIDTH-1:0] din,

output reg [WIDTH-1:0] dout

);

reg [WIDTH-1:0] mem[DEPTH-1:0];

initial begin /*초기화 시키기 위함*/

for( int i=0; i<DEPTH; i++) mem[i]=0;

end

always @(posedge clk)

if (cs&we) mem[ad] <=din;

else if (cs) dout<=mem[ad];

endmodule

 

바쁘신와중에 확인해주셔서 감사드립니다.

 

0

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

SRAM RTL 코드와 testbench 코드 모두 텍스트로 붙여넣어서 올려주실 수 있나요?

그대로 따라하셨겠지만, 혹시 잘못된 부분이 있나 확인해보고자 합니다.

akims님의 프로필 이미지
akims

작성한 질문수

질문하기