ic_com/tb/fifo/sync/fifo_sync_tb.sv

109 lines
2.3 KiB
Systemverilog

`timescale 1ns/1ps
module fifo_sync_tb;
parameter DATA_WIDTH = 8;
parameter DEPTH = 16;
parameter USE_RAM = 0;
parameter OUT_REG = 1;
reg clk;
reg rst_n;
reg wr_en;
reg [DATA_WIDTH-1:0] din;
reg rd_en;
wire [DATA_WIDTH-1:0] dout;
wire empty;
wire full;
wire [$clog2(DEPTH):0] data_count;
// 实例化DUT
fifo_sync #(
.DATA_WIDTH(DATA_WIDTH),
.DEPTH(DEPTH),
.USE_RAM(USE_RAM),
.OUT_REG(OUT_REG)
) dut (
.clk(clk),
.rst_n(rst_n),
.wr_en(wr_en),
.din(din),
.rd_en(rd_en),
.dout(dout),
.empty(empty),
.full(full),
.data_count(data_count)
);
// 时钟生成
initial clk = 0;
always #5 clk = ~clk;
// 复位
initial begin
rst_n = 0;
wr_en = 0;
rd_en = 0;
din = 0;
#20;
rst_n = 1;
end
// 主测试流程
initial begin
wait(rst_n == 1);
@(negedge clk);
// 写入DEPTH个数据
for (int i = 0; i < DEPTH; i++) begin
@(negedge clk);
wr_en = 1;
din = i;
rd_en = 0;
end
@(negedge clk);
wr_en = 0;
// 检查full信号
if (!full) $display("[TB][ERROR] FIFO未满!");
else $display("[TB][INFO] FIFO已满!");
// 读出DEPTH个数据
for (int i = 0; i < DEPTH; i++) begin
@(negedge clk);
wr_en = 0;
rd_en = 1;
end
@(negedge clk);
rd_en = 0;
// 检查empty信号
if (!empty) $display("[TB][ERROR] FIFO未空!");
else $display("[TB][INFO] FIFO已空!");
// 交错写读
for (int i = 0; i < 8; i++) begin
@(negedge clk);
wr_en = 1;
din = i + 100;
rd_en = 1;
end
@(negedge clk);
wr_en = 0;
rd_en = 0;
#20;
$display("[TB][INFO] 测试结束");
$finish;
end
// 监控输出
always @(posedge clk) begin
if (wr_en && !full)
$display("[TB][WRITE] @%0t: din=%0d, wr_ptr=%0d", $time, din, dut.wr_ptr);
if (rd_en && !empty)
$display("[TB][READ ] @%0t: dout=%0d, rd_ptr=%0d", $time, dout, dut.rd_ptr);
end
endmodule