`timescale 1ns/1ps

module tb_array_mux;

    // 输入信号定义
    reg           array_wr_csn;    // 写操作片选
    reg   [15:0]  array_wr_raddr;  // 写操作地址
    reg           array_rd_csn;    // 读操作片选
    reg   [15:0]  array_rd_raddr;  // 读操作地址
    reg           array_ref_csn;   // 刷新操作片选
    reg   [15:0]  array_ref_raddr; // 刷新操作地址
    reg   [1:0]   array_mux_sel;   // 选择控制信号

    // 输出信号定义
    wire          array_csn;       // 输出片选
    wire  [15:0]  array_raddr;     // 输出地址

    // 例化被测试模块
    array_mux uut (
        .array_wr_csn    (array_wr_csn),
        .array_wr_raddr  (array_wr_raddr),
        .array_rd_csn    (array_rd_csn),
        .array_rd_raddr  (array_rd_raddr),
        .array_ref_csn   (array_ref_csn),
        .array_ref_raddr (array_ref_raddr),
        .array_mux_sel   (array_mux_sel),
        .array_csn       (array_csn),
        .array_raddr     (array_raddr)
    );

    // 初始化测试向量
    initial begin
        // 初始值设置
        array_wr_csn    = 1'b0;
        array_wr_raddr  = 16'h1234;
        array_rd_csn    = 1'b1;
        array_rd_raddr  = 16'h5678;
        array_ref_csn   = 1'b0;
        array_ref_raddr = 16'h9ABC;
        array_mux_sel   = 2'b00;

        // 等待10ns，确保初始状态稳定
        #10;

        // 测试场景1：选择刷新操作（2'b01）
        array_mux_sel = 2'b01;
        #10;
        $display("Test Case 1 (sel=01): csn=%b, addr=%h (Expected: csn=%b, addr=%h)",
                 array_csn, array_raddr, array_ref_csn, array_ref_raddr);

        // 测试场景2：选择写操作（2'b10）
        array_mux_sel = 2'b10;
        #10;
        $display("Test Case 2 (sel=10): csn=%b, addr=%h (Expected: csn=%b, addr=%h)",
                 array_csn, array_raddr, array_wr_csn, array_wr_raddr);

        // 测试场景3：选择读操作（2'b11）
        array_mux_sel = 2'b11;
        #10;
        $display("Test Case 3 (sel=11): csn=%b, addr=%h (Expected: csn=%b, addr=%h)",
                 array_csn, array_raddr, array_rd_csn, array_rd_raddr);

        // 测试场景4：默认情况（2'b00）
        array_mux_sel = 2'b00;
        #10;
        $display("Test Case 4 (sel=00): csn=%b, addr=%h (Expected: csn=1, addr=0000)",
                 array_csn, array_raddr);

        // 测试场景5：动态改变输入值，验证实时性
        array_ref_csn   = 1'b1;
        array_ref_raddr = 16'hDEF0;
        array_mux_sel   = 2'b01;
        #10;
        $display("Test Case 5 (sel=01 updated): csn=%b, addr=%h (Expected: csn=%b, addr=%h)",
                 array_csn, array_raddr, array_ref_csn, array_ref_raddr);

        // 测试场景6：覆盖所有可能的选择信号
        array_mux_sel = 2'b00; #5;
        array_mux_sel = 2'b01; #5;
        array_mux_sel = 2'b10; #5;
        array_mux_sel = 2'b11; #5;

        // 结束仿真
        $finish;
    end

    initial begin
        $fsdbDumpfile("tb.fsdb");
        $fsdbDumpvars(0,tb_array_mux,"+all");
        $vcdpluson;
        $vcdplusmemon;
    end

    // 监控信号变化（可选，用于波形分析）
    initial begin
        $monitor("Time: %0t, sel=%b, csn=%b, addr=%h",
                 $time, array_mux_sel, array_csn, array_raddr);
    end

endmodule