비동기 FIFO 버퍼를 작성했지만 실행하면 출력 포트에 XXX가 표시됩니다. 나는 리셋 신호가 작동하도록해야한다고 말한 SO에 관한 우려되는 질문을 언급했다. 그러나 리셋 신호가 작동하더라도 여전히 동일한 문제에 직면하고있다.XXX 출력 포트에
도움이 될 것입니다. 감사 여기서
module fifo
#(parameter width =8,
addr_width = 4,
depth = (1 << addr_width)
)
(// Read port
output [width - 1:0] dout,
output reg empty_out,
input wire rd_en,
input wire rclk,
//write port
input wire [width-1:0] din,
output reg full,
input wire wr_en,
input wire wclk,
input wire rst
);
(* ram_style = "bram" *)
reg [width-1:0] memory_s[depth-1:0];
reg [31:0] push_ptr;
reg [31:0] pop_ptr;
assign dout = memory_s[pop_ptr]; // assign cannot assign values to registers
always @(posedge wclk)
begin
if (rst == 1)
push_ptr <= 0;
else if(wr_en == 1)
begin
memory_s\[push_ptr\] <= din;
//$display("w: %d", push_ptr);
if (push_ptr == (depth -1))
push_ptr <= 0;
else
push_ptr <= push_ptr + 1;
end
end
always @ (posedge rclk)
if (rst == 1)
pop_ptr <= 0;
else if (rd_en ==1)
begin
//dout <= memory_s\[pop_ptr\];
//$display("r: %d", pop_ptr);
if (pop_ptr == depth-1)
pop_ptr <=0;
else
pop_ptr <= pop_ptr+1;
end
reg full_s;
reg overflow;
always @*
begin
if (rst == 1)
full_s <= 0;
else if (push_ptr <= pop_ptr)
if (push_ptr + 1 == pop_ptr)
begin
full_s <= 1;
$display("push,pop,full: %d %d %d", push_ptr,pop_ptr,full_s);
end
else
full_s <=0;
else
if(push_ptr + 1 == pop_ptr + depth)
begin
full_s <= 1;
$display("push,pop,full: %d %d %d", push_ptr,pop_ptr,full_s);
end
else
full_s <= 0;
end
endmodule]
는 파형이다
라이트 테스트 벤치 fifoTb 모듈; 당신의 테스트 벤치를 만드는
assign dout = (rd_en) ? memory_s[pop_ptr] : 0;
추가 팁 :
// Inputs
reg rd_en;
reg rclk;
reg [7:0] din;
reg wr_en;
reg wclk;
reg rst;
// Outputs
wire[7:0] dout;
wire empty_out;
wire full;
// Instantiate the Unit Under Test (UUT)
fifo uut (
.dout(dout),
.empty_out(empty_out),
.rd_en(rd_en),
.rclk(rclk),
.din(din),
.full(full),
.wr_en(wr_en),
.wclk(wclk),
.rst(rst)
);
initial begin
// Initialize Inputs
rd_en = 0;
rclk = 0;
wr_en = 0;
wclk = 0;
rst = 1;
din = 8'h0;
// Wait 100 ns for global reset to finish
#100;
rst = 0;
wr_en = 1;
din = 8'h1;
#101 din = 8'h2;
rd_en = 1;
// Add stimulus here
end
always begin #10 wclk = ~wclk; end
always begin #10 rclk = ~rclk; end
endmodule
재설정이 포함 된 조합 블록에는 코드가 이상하게 보입니다. 일반적으로 재설정은 조합 블록에 포함되지 않습니다. – e19293001
게시판에 테스트 벤치를 포함시키지 않았으므로'memory_s '에 초기화 된 값이 없다고 가정합니다. 따라서'memory_s '는'bx 값 '을 출력합니다. 'wr_en'을 먼저 선언하고 ('memory_s'에 값을 쓰십시오)'rd_en'을 ('memory_s'에 쓰여진 값을 읽으려면) 어서 트하십시오. – e19293001
안녕하세요, 답장을 보내 주셔서 감사합니다. 내 테스트 벤치를 추가했습니다. –