`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