// ============================================================================
// ca_multi_rule_tb.v - 多规则验证
// ============================================================================
\`timescale 1ns/1ps

module ca_multi_rule_tb;

    parameter WIDTH = 16;
    reg clk, rst_n, enable, init;
    reg  [WIDTH-1:0] seed;
    reg  [7:0]       rule;
    wire [WIDTH-1:0] state;
    wire [31:0]      step_count;

    ca_configurable_1d #(.WIDTH(WIDTH)) dut (
        .clk(clk), .rst_n(rst_n), .enable(enable),
        .init(init), .seed(seed), .rule(rule),
        .wrap_en(1'b1), .fixed_val(1'b0),
        .state(state), .step_count(step_count)
    );

    // 时钟生成
    initial clk = 0;
    always #5 clk = ~clk;

    // 规则测试序列
    reg [7:0] rules_to_test [0:3];
    integer   r, step;

    initial begin
        rules_to_test[0] = 8'd30;    // 混沌
        rules_to_test[1] = 8'd90;    // Sierpinski
        rules_to_test[2] = 8'd110;   // 通用计算
        rules_to_test[3] = 8'd150;   // XOR

        $dumpfile("ca_multi_rule.vcd");
        $dumpvars(0, ca_multi_rule_tb);

        for (r = 0; r < 4; r = r + 1) begin
            // 复位
            rst_n = 0; enable = 0; init = 0;
            #20 rst_n = 1;

            // 加载初始状态：仅中心位为1
            rule = rules_to_test[r];
            seed = (WIDTH == 16) ? 16'h0080 : 64'h1;
            init = 1; #10; init = 0;

            $display("--- Rule %0d ---", rule);

            // 运行16步
            for (step = 0; step < 16; step = step + 1) begin
                // 打印状态
                $write("Step %2d: ", step);
                for (integer b = WIDTH-1; b >= 0; b = b - 1)
                    $write("%b", state[b]);
                $write("\n");

                enable = 1; #10; enable = 0; #10;
            end
        end

        $display("✅ All rules verified successfully!");
        $finish;
    end

endmodule