// 守恒律验证器 - 实时验证Lattice Gas的守恒律
module conservation_checker #(
    parameter WIDTH = 64,
    parameter HEIGHT = 64
)(
    input  wire             clk,
    input  wire             rst_n,
    input  wire [3:0]       grid [0:WIDTH*HEIGHT-1],
    output wire [31:0]      total_particles,
    output wire signed [31:0] momentum_x,
    output wire signed [31:0] momentum_y,
    output wire             conservation_ok  // 1=守恒律满足
);
    reg [31:0] particles;
    reg signed [31:0] px, py;
    reg [31:0] prev_particles;
    reg signed [31:0] prev_px, prev_py;
    integer idx;
    
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            prev_particles <= 32'd0;
            prev_px <= 32'd0; prev_py <= 32'd0;
        end else begin
            prev_particles <= particles;
            prev_px <= px; prev_py <= py;
        end
    end
    
    always @(*) begin
        particles = 32'd0; px = 32'd0; py = 32'd0;
        for (idx = 0; idx < WIDTH*HEIGHT; idx = idx + 1) begin
            particles = particles + grid[idx][0] + grid[idx][1] +
                        grid[idx][2] + grid[idx][3];
            px = px + grid[idx][0] - grid[idx][2];  // 东-西
            py = py + grid[idx][1] - grid[idx][3];  // 南-北
        end
    end
    
    assign total_particles = particles;
    assign momentum_x = px;
    assign momentum_y = py;
    assign conservation_ok = (particles == prev_particles);
endmodule