Skip to content

Commit e9c3a61

Browse files
authored
feat: add alu testbench Noah MS 9-24-25
1 parent bf351ba commit e9c3a61

File tree

1 file changed

+99
-0
lines changed
  • src/getting_started/onboarding/RiSC-16

1 file changed

+99
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
`timescale 1ns / 1ps
2+
3+
module alu_tb;
4+
5+
// Inputs
6+
reg MUX_alu1, MUX_alu2;
7+
reg [1:0] FUNC_alu;
8+
reg [15:0] src1_reg, src2_reg;
9+
reg [9:0] imm;
10+
11+
// Outputs
12+
wire EQ;
13+
wire [15:0] alu_out;
14+
15+
// Instantiate the Unit Under Test (UUT)
16+
// You can swap "alu" with "alu_corrected" to test the corrected module
17+
alu uut (
18+
.MUX_alu1(MUX_alu1),
19+
.MUX_alu2(MUX_alu2),
20+
.FUNC_alu(FUNC_alu),
21+
.src1_reg(src1_reg),
22+
.src2_reg(src2_reg),
23+
.imm(imm),
24+
.EQ(EQ),
25+
.alu_out(alu_out)
26+
);
27+
28+
29+
// Test sequence
30+
initial begin
31+
// 1. Initialize Inputs and apply reset
32+
$display("--------------------------------------------------");
33+
$display("--- Starting ALU Testbench ---");
34+
$display("--------------------------------------------------");
35+
36+
MUX_alu1 = 0;
37+
MUX_alu2 = 0;
38+
FUNC_alu = 0;
39+
src1_reg = 0;
40+
src2_reg = 0;
41+
imm = 0;
42+
43+
44+
// 2. Test ADD (reg + reg)
45+
$display("\n--- Testing ADD (FUNC=00, MUX=0,0) ---");
46+
FUNC_alu = 2'b00; MUX_alu1 = 0; MUX_alu2 = 0;
47+
src1_reg = 16'd10; src2_reg = 16'd20; #10;
48+
$display("Time=%0t: 10 + 20 = %d, EQ=%b", $time, alu_out, EQ);
49+
src1_reg = 16'hFFFF; src2_reg = 16'd1; #10; // -1 + 1 = 0
50+
$display("Time=%0t: -1 + 1 = %d, EQ=%b", $time, alu_out, EQ);
51+
src1_reg = 16'd55; src2_reg = 16'd55; #10;
52+
$display("Time=%0t: 55 + 55 = %d, EQ=%b", $time, alu_out, EQ);
53+
54+
// 3. Test ADDI (reg + sign-extended immediate)
55+
$display("\n--- Testing ADDI (FUNC=00, MUX=0,1) ---");
56+
FUNC_alu = 2'b00; MUX_alu1 = 0; MUX_alu2 = 1;
57+
src1_reg = 16'd100; imm = 10'd5; #10; // imm[6:0] = 5, positive
58+
$display("Time=%0t: 100 + 5 (imm) = %d", $time, alu_out);
59+
src1_reg = 16'd50; imm = 10'b1111110100; #10; // imm[6:0] = 110100 -> -12
60+
$display("Time=%0t: 50 + (-12) (imm) = %d", $time, alu_out);
61+
62+
// 4. Test NAND (reg & reg)
63+
$display("\n--- Testing NAND (FUNC=01, MUX=0,0) ---");
64+
FUNC_alu = 2'b01; MUX_alu1 = 0; MUX_alu2 = 0;
65+
src1_reg = 16'hAAAA; src2_reg = 16'h5555; #10; // Should be all 1s
66+
$display("Time=%0t: 0xAAAA NAND 0x5555 = 0x%h", $time, alu_out);
67+
$display("Above output should be 0xffff");
68+
src1_reg = 16'hFFFF; src2_reg = 16'hFFFF; #10; // Should be all 0s
69+
$display("Time=%0t: 0xFFFF NAND 0xFFFF = 0x%h", $time, alu_out);
70+
$display("Above output should be 0x0000");
71+
72+
// 5. Test PASS1 (src1_reg)
73+
$display("\n--- Testing PASS1 (FUNC=10, MUX=0,0) ---");
74+
FUNC_alu = 2'b10; MUX_alu1 = 0; MUX_alu2 = 0;
75+
src1_reg = 16'hBEEF; src2_reg = 16'hDEAD; #10;
76+
$display("Time=%0t: Pass src1_reg (0x%h) -> out=0x%h", $time, src1_reg, alu_out);
77+
78+
// 6. Test LUI (PASS1 with left-shifted immediate)
79+
$display("\n--- Testing LUI (FUNC=10, MUX=1,0) ---");
80+
FUNC_alu = 2'b10; MUX_alu1 = 1; MUX_alu2 = 0;
81+
imm = 10'b1100110011; #10; // value << 6
82+
$display("Time=%0t: LUI with imm (0x%h) -> out=0x%h", $time, imm, alu_out);
83+
$display("Above output should be 0xccc0");
84+
// 7. Test EQL/BEQ (Equality check)
85+
$display("\n--- Testing EQL (FUNC=11, MUX=0,0) ---");
86+
FUNC_alu = 2'b11; MUX_alu1 = 0; MUX_alu2 = 0;
87+
src1_reg = 16'd1234; src2_reg = 16'd1234; #10; // Should be equal
88+
$display("Time=%0t: 1234 == 1234 -> EQ=%b, out=%d", $time, EQ, alu_out);
89+
src1_reg = 16'd1234; src2_reg = 16'd4321; #10; // Should not be equal
90+
$display("Time=%0t: 1234 == 4321 -> EQ=%b, out=%d", $time, EQ, alu_out);
91+
92+
$display("\n--------------------------------------------------");
93+
$display("--- Testbench Finished ---");
94+
$display("--------------------------------------------------");
95+
#20;
96+
$finish;
97+
end
98+
99+
endmodule

0 commit comments

Comments
 (0)