Files
IC_PRJ/tb/tb_array_status_ctrl.v

182 lines
5.3 KiB
Verilog
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

`timescale 1ns/1ps
module tb_array_status_ctrl();
// 时钟与复位信号
reg clk;
reg rst_n;
// AXI 到数组的帧信号
reg axi2array_frame_valid;
reg [152:0] axi2array_frame_data;
wire axi2array_frame_ready;
// 数组读写信号
wire array_wr_frame_valid;
wire [151:0] array_wr_frame_data;
reg array_wr_frame_ready;
reg array_wr_done;
wire array_rd_frame_valid;
wire [151:0] array_rd_frame_data;
reg array_rd_frame_ready;
reg array_rd_done;
// 数组刷新信号
wire array_ref_start;
reg array_ref_done;
// 其他控制信号
wire [1:0] array_mux_sel;
reg mc_work_en;
reg array_ref_en;
reg [24:0] array_inner_tref0;
reg [24:0] array_inner_tref1;
reg array_inner_ref_sel;
// 例化被测试模块
array_status_ctrl uut (
.clk (clk),
.rst_n (rst_n),
.axi2array_frame_valid (axi2array_frame_valid),
.axi2array_frame_data (axi2array_frame_data),
.axi2array_frame_ready (axi2array_frame_ready),
.array_wr_frame_valid (array_wr_frame_valid),
.array_wr_frame_data (array_wr_frame_data),
.array_wr_frame_ready (array_wr_frame_ready),
.array_wr_done (array_wr_done),
.array_rd_frame_valid (array_rd_frame_valid),
.array_rd_frame_data (array_rd_frame_data),
.array_rd_frame_ready (array_rd_frame_ready),
.array_rd_done (array_rd_done),
.array_ref_start (array_ref_start),
.array_ref_done (array_ref_done),
.array_mux_sel (array_mux_sel),
.mc_work_en (mc_work_en),
.array_ref_en (array_ref_en),
.array_inner_tref0 (array_inner_tref0),
.array_inner_tref1 (array_inner_tref1),
.array_inner_ref_sel (array_inner_ref_sel)
);
// 生成时钟50MHz周期20ns
initial begin
clk = 0;
forever #10 clk = ~clk;
end
// 主测试流程
initial begin
// 初始化信号
rst_n = 0;
axi2array_frame_valid = 0;
axi2array_frame_data = 0;
array_wr_frame_ready = 0;
array_wr_done = 0;
array_rd_frame_ready = 0;
array_rd_done = 0;
array_ref_done = 0;
mc_work_en = 0;
array_ref_en = 0;
array_inner_tref0 = 25'd5; // 刷新计数阈值
array_inner_tref1 = 25'd10;
array_inner_ref_sel = 0;
// 释放复位
#100 rst_n = 1;
#20;
// 测试场景1写操作
$display("Test Case 1: Write Operation");
mc_work_en = 1; // 使能工作模式
#20;
// 发送写请求bit152=1
axi2array_frame_data = {1'b1, 152'h123456}; // 写数据
axi2array_frame_valid = 1;
array_wr_frame_ready = 1; // 准备接收写数据
#20;
array_wr_done = 1; // 写完成
#20;
axi2array_frame_valid = 0;
array_wr_done = 0;
#100;
// 测试场景2读操作
$display("Test Case 2: Read Operation");
// 发送读请求bit152=0
axi2array_frame_data = {1'b0, 152'hABCDEF}; // 读数据
axi2array_frame_valid = 1;
array_rd_frame_ready = 1; // 准备接收读数据
#20;
array_rd_done = 1; // 读完成
#20;
axi2array_frame_valid = 0;
array_rd_done = 0;
#100;
// 测试场景3刷新操作达到计数阈值
$display("Test Case 3: Refresh Operation (by counter)");
array_ref_en = 1; // 使能刷新
#200; // 等待刷新计数器达到阈值tref0=5约100ns后触发
array_ref_done = 1; // 刷新完成
#20;
array_ref_done = 0;
array_ref_en = 0;
#100;
// 测试场景4状态优先级刷新 > 写 > 读)
$display("Test Case 4: State Priority (Refresh > Write > Read)");
array_ref_en = 1;
mc_work_en = 1;
// 同时触发刷新请求、写请求和读请求
axi2array_frame_data = {1'b1, 152'hFEDCBA}; // 写请求
axi2array_frame_valid = 1;
#20;
array_ref_done = 1; // 先完成刷新
#20;
array_ref_done = 0;
#20;
array_wr_done = 1; // 再完成写操作
#20;
axi2array_frame_valid = 0;
array_wr_done = 0;
#100;
// 结束测试
$display("All Test Cases Completed!");
$finish;
end
// 监控状态变化
always @(posedge clk) begin
if (rst_n) begin
case (uut.cur_state)
2'b00: $display("[%0t] State: IDLE", $time);
2'b01: $display("[%0t] State: WRITE", $time);
2'b10: $display("[%0t] State: READ", $time);
2'b11: $display("[%0t] State: REFRESH", $time);
endcase
end
end
initial begin
$fsdbDumpfile("tb.fsdb");
$fsdbDumpvars(0,tb_array_status_ctrl,"+all");
$vcdpluson;
$vcdplusmemon;
end
// 监控关键信号
always @(posedge clk) begin
if (array_ref_start) begin
$display("[%0t] Refresh Start Triggered", $time);
end
if (array_wr_frame_valid && array_wr_frame_ready) begin
$display("[%0t] Write Data Transferred: %h", $time, array_wr_frame_data);
end
if (array_rd_frame_valid && array_rd_frame_ready) begin
$display("[%0t] Read Data Transferred: %h", $time, array_rd_frame_data);
end
end
endmodule