`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