강의

멘토링

커뮤니티

Inflearn コミュニティ Q&A

dkthddl128150 のプロフィール画像
dkthddl128150

投稿した質問数

デジタル回路設計実務:Computer ArchitectureとSoCプロトコルDigital IP設計

コンピュータ構造のメモリ階層構造とVerilogによるSRAMのモデリング

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

解決済みの質問

作成

·

86

0

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

 

image.png

 

 

image.png

 

컴퓨터-구조verilog-hdlfpga임베디드amba

回答 5

0

samcoach님의 프로필 이미지
samcoach
インストラクター

  • @(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

samcoach님의 프로필 이미지
samcoach
インストラクター

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

samcoach님의 프로필 이미지
samcoach
インストラクター

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

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

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

dkthddl128150 のプロフィール画像
dkthddl128150

投稿した質問数

質問する