Files
IC_PRJ/tb/tb_array_status_ctrl.v

182 lines
5.3 KiB
Coq
Raw Permalink Normal View History

`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