FPGA-RISC-V-CPU / hardware / sim / alu_tb.v
alu_tb.v
Raw
`timescale 1ns/1ns

module alu_tb();
    reg [31:0] a;
    reg [31:0] b;
    reg [3:0] ALUSel;
    wire [31:0] out;

    alu alu_test(
        .a(a),
        .b(b),
        .ALUSel(ALUSel),
        .out(out)
    );

    initial begin
        `ifndef IVERILOG
            $vcdpluson;
        `endif
        `ifdef IVERILOG
            $dumpfile("alu_tb.fst");
            $dumpvars(0, alu_tb);
        `endif

        // TODO: Write test for each operation
        // Test ADD
        a = 32'd1;
        b = 32'd2;
        ALUSel = 4'b000;
        #(5)
        assert(out == 32'd3) else $display("ERROR: %d", out);

        // Test SLL
        a = 32'd1;
        b = 32'd2;
        ALUSel = 4'b001;
        #(2)
        assert(out == 32'd4) else $display("ERROR: %d", out);

        // Test SLT
        a = 32'd1;
        b = 32'd2;
        ALUSel = 4'b010;
        #(2)
        assert(out == 32'd1) else $display("ERROR: %d", out);

        // Test SLTU
        a = 32'd1;
        b = 32'd2;
        ALUSel = 4'b011;
        #(2)
        assert(out == 32'd1) else $display("ERROR: %d", out);

        // Test XOR
        a = 32'd1;
        b = 32'd2;
        ALUSel = 4'b100;
        #(2)
        assert(out == 32'd3) else $display("ERROR: %d", out);

        // Test SRL
        a = 32'd1;
        b = 32'd2;
        ALUSel = 4'b101;
        #(2)
        assert(out == 32'd0) else $display("ERROR: %d", out);

        // Test OR
        a = 32'd1;
        b = 32'd2;
        ALUSel = 4'b110;
        #(2)
        assert(out == 32'd3) else $display("ERROR: %d", out);

        // Test AND
        a = 32'd1;
        b = 32'd2;
        ALUSel = 4'b111;
        #(2)
        assert(out == 32'd0) else $display("ERROR: %d", out);

        // Test SUB
        a = 32'd2;
        b = 32'd1;
        ALUSel = 4'b1000;
        #(2)
        assert(out == 32'd1) else $display("ERROR sub: %d", out);

        // Test SRA
        a = 32'd1;
        b = 32'd2;
        ALUSel = 4'b1101;
        #(2)
        assert(out == 32'd0) else $display("ERROR: %d", out);

        // Test BSEL
        a = 32'd1;
        b = 32'd2;
        ALUSel = 4'b1111;
        #(2)
        assert(out == 32'd2) else $display("ERROR: %d", out);

        $display("PASSED!");
        $finish();
    end
endmodule