`timescale 1ns/1ps module tb_array_ref(); // 输入信号定义 reg clk; reg rst_n; reg array_ref_start; reg [7:0] array_inner_tras; reg [7:0] array_inner_trp; // 输出信号定义 wire array_ref_done; wire array_ref_csn; wire [15:0] array_ref_raddr; // 实例化待测试模块 array_ref uut ( .clk (clk), .rst_n (rst_n), .array_ref_start (array_ref_start), .array_ref_done (array_ref_done), .array_ref_csn (array_ref_csn), .array_ref_raddr (array_ref_raddr), .array_inner_tras (array_inner_tras), .array_inner_trp (array_inner_trp) ); // 时钟生成:10ns周期(100MHz) initial begin clk = 0; forever #1.25 clk = ~clk; end // 主测试流程 initial begin // 初始化信号 rst_n = 0; array_ref_start = 0; array_inner_tras = 8'd2; // RAS周期为2个时钟 array_inner_trp = 8'd1; // RP周期为1个时钟 // 复位释放 #20; rst_n = 1; #10; // 启动刷新操作 @(posedge clk); array_ref_start = 1; @(posedge clk); array_ref_start = 0; // 释放启动信号 // 等待刷新完成(全地址遍历) wait(array_ref_done); $display("=== 第一次完整刷新完成 ==="); #50; // // 测试不同的tras和trp参数 // array_inner_tras = 8'd3; // array_inner_trp = 8'd2; // @(posedge clk); // array_ref_start = 1; // @(posedge clk); // array_ref_start = 0; // wait(array_ref_done); // $display("=== 第二次完整刷新完成 ==="); // #50; // // 测试中途复位 // @(posedge clk); // array_ref_start = 1; // @(posedge clk); // array_ref_start = 0; // #30; // rst_n = 0; // #20; // rst_n = 1; // $display("=== 复位测试完成 ==="); // 结束仿真 #100; $display("=== 仿真结束 ==="); $finish; end initial begin $fsdbDumpfile("tb.fsdb"); $fsdbDumpvars(0,tb_array_ref,"+all"); $vcdpluson; $vcdplusmemon; end // 监控信号变化 initial begin $monitor( "Time: %0t, State: %b, raddr: %h, csn: %b, done: %b, ras_cnt: %h, rp_cnt: %h", $time, uut.cur_state, array_ref_raddr, array_ref_csn, array_ref_done, uut.ref_ras_cnt, uut.ref_rp_cnt ); end endmodule