해결된 질문
작성
·
28
0
SRAM 기본 모델링 코드 작성후, RTL view통해서 확인시에 dout 값이 모두 xxxxxx로 처리가 되는데, TB 작성에도 문제가 없어보여 고쳐야할 부분이 있는지 문의드립니다.
답변 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
감사합니다. 말씀주신대로 수정을 하여도 동일하게 dout은 don't care처리가 발생하고 있습니다. 다시 한번 코드 점검을 했는데 빠진게 없는듯하여, 혹시 바쁘시겠지만 빠진 부분이 있는지 확인 한번 부탁드려도 될까요?
0
input [DEPTH-1:0] ad 여기가 잘못되어있는듯한데,
input [DEPTH_LOG-1:0] ad
이게 우리가 의도하는것이니 이걸로 해보시겠어요?
0
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 코드 모두 텍스트로 붙여넣어서 올려주실 수 있나요?
그대로 따라하셨겠지만, 혹시 잘못된 부분이 있나 확인해보고자 합니다.