Updated tests.sv to not perform prior module tests. Seperated testbenches for hazard and nohazard tests.

This commit is contained in:
riley committed 2026-11-12 12:33:24 +11:00
1 parent 2f3ecb9a3c
commit 6b938a24be
3 files changed
+231 -83

No files matched your search

+86 -76
View File
@@ -17,10 +17,11 @@
module mips_pipelined_tb(); module mips_pipelined_tb();
logic [0:0] clk; logic [0:0] clk;
logic [0:0] rst; logic [0:0] rst;
assignment3 CPU (clk, rst); assignment3 #("./asm/bin/ELEC4720-2026s2-Ass-03-NoHazardsDemo.hex") CPU (clk, rst);
initial clk = 0; initial clk = 0;
initial rst = 0; initial rst = 0;
always #1 clk = ~clk; always #1 clk = ~clk;
integer num_errors = 0; integer num_errors = 0;
@@ -40,98 +41,107 @@ module mips_pipelined_tb();
$dumpvars(6, CPU.ALU); $dumpvars(6, CPU.ALU);
$display("Beginning Pipelined MIPS tests"); $display("Beginning Pipelined MIPS tests");
#2; // 4x steps to allow pipeline to fill up
#2; #2;
#2; #2;
#2; #2;
#2; #2;
`TEST_CHECK(CPU.REGS.regs[8] == 32'd0);
#2; #2;
`TEST_CHECK(CPU.REGS.regs[9] == 32'd0); //`TEST_CHECK(CPU.REGS.regs[8] == 32'd0);
#2; #2;
`TEST_CHECK(CPU.REGS.regs[10] == 32'd0); //`TEST_CHECK(CPU.REGS.regs[9] == 32'd7);
#2; #2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2; #2;
//`TEST_CHECK(CPU.RAM.mem[0] == 32'd7);
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[10] == 32'd7);
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[11] == (CPU.REGS.regs[9] + CPU.REGS.regs[10]) );
//`TEST_CHECK(CPU.REGS.regs[11] == 32'd14);
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[12] == (CPU.REGS.regs[9] - CPU.REGS.regs[11]));
//`TEST_CHECK(CPU.REGS.regs[12] == -$signed(32'd7));
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[13] == (CPU.REGS.regs[9] + 32'd3) );
//`TEST_CHECK(CPU.REGS.regs[13] == 32'd10);
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[14] == (CPU.REGS.regs[12] + CPU.REGS.regs[13]) );
//`TEST_CHECK(CPU.REGS.regs[14] == 32'd3 );
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[16] == (CPU.REGS.regs[9] & CPU.REGS.regs[13]));
//`TEST_CHECK(CPU.REGS.regs[16] == 32'd2);
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[17] == (CPU.REGS.regs[9] | CPU.REGS.regs[13]));
//`TEST_CHECK(CPU.REGS.regs[17] == 32'd15);
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[17] == (CPU.REGS.regs[9] ^ CPU.REGS.regs[13]));
//`TEST_CHECK(CPU.REGS.regs[17] == 32'd13);
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[17] == ~(CPU.REGS.regs[9] | CPU.REGS.regs[13]));
//`TEST_CHECK(CPU.REGS.regs[17] == -$signed(32'd16));
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[18] == ($signed(CPU.REGS.regs[12]) < $signed(CPU.REGS.regs[14])));
//`TEST_CHECK(CPU.REGS.regs[18] == 32'd1);
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[19] == (CPU.REGS.regs[12] < CPU.REGS.regs[14]));
//`TEST_CHECK(CPU.REGS.regs[19] == 32'd0);
#2;
#2;
for (integer i = 0; i < 10; ++i) begin
//`TEST_CHECK(CPU.REGS.regs[8] == (CPU.REGS.regs[8] + 1));
//`TEST_CHECK(CPU.REGS.regs[8] == 32'(i+1));
#2;
#2;
//`TEST_CHECK(CPU.REGS.regs[20] == (CPU.REGS.regs[8] < CPU.REGS.regs[13]));
//`TEST_CHECK(CPU.REGS.regs[20] == (i+1) < 10);
#2;
#2;
if (i != 9) begin
//`TEST_CHECK(CPU.PC.pc == 32'd56);
#2;
#2;
end else begin
//`TEST_CHECK(CPU.PC.pc == 32'd68);
end
end
#2;
#2;
#2;
#2;
#2;
#2;
#2;
#2;
#2;
#2;
`TEST_CHECK(CPU.REGS.regs[8] == 32'd10);
`TEST_CHECK(CPU.REGS.regs[9] == 32'd7); `TEST_CHECK(CPU.REGS.regs[9] == 32'd7);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.RAM.mem[0] == 32'd7);
#2;
`TEST_CHECK(CPU.REGS.regs[10] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[12] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[10] == 32'd7); `TEST_CHECK(CPU.REGS.regs[10] == 32'd7);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[12] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[13] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == (CPU.REGS.regs[9] + CPU.REGS.regs[10]) );
`TEST_CHECK(CPU.REGS.regs[11] == 32'd14); `TEST_CHECK(CPU.REGS.regs[11] == 32'd14);
#2; `TEST_CHECK(CPU.REGS.regs[12] == -$signed(32'd7));
`TEST_CHECK(CPU.REGS.regs[12] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[13] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[14] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[12] == (CPU.REGS.regs[9] - CPU.REGS.regs[11]));
`TEST_CHECK(CPU.REGS.regs[12] == -32'sd7);
#2;
`TEST_CHECK(CPU.REGS.regs[13] == (CPU.REGS.regs[9] + 3) );
`TEST_CHECK(CPU.REGS.regs[13] == 32'd10); `TEST_CHECK(CPU.REGS.regs[13] == 32'd10);
#2;
`TEST_CHECK(CPU.REGS.regs[14] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[15] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[16] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[14] == (CPU.REGS.regs[12] + CPU.REGS.regs[13]));
`TEST_CHECK(CPU.REGS.regs[14] == 32'd3); `TEST_CHECK(CPU.REGS.regs[14] == 32'd3);
#2; `TEST_CHECK(CPU.REGS.regs[15] == 32'd0);
`TEST_CHECK(CPU.REGS.regs[16] == (CPU.REGS.regs[9] & CPU.REGS.regs[13]));
`TEST_CHECK(CPU.REGS.regs[16] == 32'd2); `TEST_CHECK(CPU.REGS.regs[16] == 32'd2);
#2;
`TEST_CHECK(CPU.REGS.regs[17] == (CPU.REGS.regs[9] | CPU.REGS.regs[13]));
`TEST_CHECK(CPU.REGS.regs[17] == 32'd15); `TEST_CHECK(CPU.REGS.regs[17] == 32'd15);
#2;
`TEST_CHECK(CPU.REGS.regs[18] == (CPU.REGS.regs[9] ^ CPU.REGS.regs[13]));
`TEST_CHECK(CPU.REGS.regs[18] == 32'd13); `TEST_CHECK(CPU.REGS.regs[18] == 32'd13);
#2; `TEST_CHECK(CPU.REGS.regs[19] == -$signed(32'd16));
`TEST_CHECK(CPU.REGS.regs[19] == ~(CPU.REGS.regs[9] | CPU.REGS.regs[13]));
`TEST_CHECK(CPU.REGS.regs[19] == 32'hfffffff0);
#2;
`TEST_CHECK(CPU.REGS.regs[20] == ( $signed(CPU.REGS.regs[12]) < $signed(CPU.REGS.regs[14]) ));
`TEST_CHECK(CPU.REGS.regs[20] == 32'd1); `TEST_CHECK(CPU.REGS.regs[20] == 32'd1);
#2;
`TEST_CHECK(CPU.REGS.regs[21] == ( CPU.REGS.regs[12] < CPU.REGS.regs[14] ));
`TEST_CHECK(CPU.REGS.regs[21] == 32'd0); `TEST_CHECK(CPU.REGS.regs[21] == 32'd0);
`TEST_CHECK(CPU.REGS.regs[22] == 32'd0);
// TODO: Verify program never branches `TEST_CHECK(CPU.REGS.regs[23] == 32'd0);
#2;
#2;
#2;
#2;
// TODO: Verify final program register state
if (num_errors == 0) begin $display("\x1b[38;5;10mAll pipelined MIPS tests passing\x1b[m");
end else begin $display("\x1b[38;5;9m%0d pipelined MIPS test(s) failing\x1b[m", num_errors); end
$dumpflush;
$finish;
end end
endmodule endmodule
+137
View File
@@ -0,0 +1,137 @@
`include "assignment3.sv"
`timescale 1us/10ns
`define PRINT_REGISTERS(regs)\
$display("\tt0-t8: \t0x%0x 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x\n\ts0-s8: \t0x%0x 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x\n\tmem[0] = 0x%0x\n",\
regs[8], regs[9], regs[10], regs[11], regs[12], regs[13], regs[14], regs[15], \
regs[16], regs[17], regs[18], regs[19], regs[20], regs[21], regs[22], regs[23], \
CPU.RAM.mem[0]\
);
`define TEST_CHECK(cond) if (cond) begin end else begin \
$display("Check %s failed", `"cond`"); \
`PRINT_REGISTERS(CPU.REGS.regs); \
num_errors += 1; \
end
module mips_pipelined_nohazard_tb();
logic [0:0] clk;
logic [0:0] rst;
assignment3 #("./asm/bin/ELEC4720-2026s2-Ass-03-NoHazardsDemo.hex") CPU (clk, rst);
initial clk = 0;
initial rst = 0;
always #1 clk = ~clk;
integer num_errors = 0;
initial begin
rst = 1;
#2;
rst = 0;
#2;
$dumpfile("output.vcd");
$dumpvars(0, clk);
$dumpvars(1, CPU.REGS);
$dumpvars(2, CPU.ROM);
$dumpvars(3, CPU.RAM);
$dumpvars(4, CPU.PC);
$dumpvars(5, CPU.CONTROL_UNIT);
$dumpvars(6, CPU.ALU);
$display("Beginning Pipelined nohazard MIPS tests");
#2; // 4x steps to allow pipeline to fill up
#2;
#2;
#2;
#2;
`TEST_CHECK(CPU.REGS.regs[8] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[9] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[10] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[9] == 32'd7);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.RAM.mem[0] == 32'd7);
#2;
`TEST_CHECK(CPU.REGS.regs[10] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[12] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[10] == 32'd7);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[12] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[13] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[11] == (CPU.REGS.regs[9] + CPU.REGS.regs[10]) );
`TEST_CHECK(CPU.REGS.regs[11] == 32'd14);
#2;
`TEST_CHECK(CPU.REGS.regs[12] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[13] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[14] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[12] == (CPU.REGS.regs[9] - CPU.REGS.regs[11]));
`TEST_CHECK(CPU.REGS.regs[12] == -32'sd7);
#2;
`TEST_CHECK(CPU.REGS.regs[13] == (CPU.REGS.regs[9] + 3) );
`TEST_CHECK(CPU.REGS.regs[13] == 32'd10);
#2;
`TEST_CHECK(CPU.REGS.regs[14] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[15] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[16] == 32'd0);
#2;
`TEST_CHECK(CPU.REGS.regs[14] == (CPU.REGS.regs[12] + CPU.REGS.regs[13]));
`TEST_CHECK(CPU.REGS.regs[14] == 32'd3);
#2;
`TEST_CHECK(CPU.REGS.regs[16] == (CPU.REGS.regs[9] & CPU.REGS.regs[13]));
`TEST_CHECK(CPU.REGS.regs[16] == 32'd2);
#2;
`TEST_CHECK(CPU.REGS.regs[17] == (CPU.REGS.regs[9] | CPU.REGS.regs[13]));
`TEST_CHECK(CPU.REGS.regs[17] == 32'd15);
#2;
`TEST_CHECK(CPU.REGS.regs[18] == (CPU.REGS.regs[9] ^ CPU.REGS.regs[13]));
`TEST_CHECK(CPU.REGS.regs[18] == 32'd13);
#2;
`TEST_CHECK(CPU.REGS.regs[19] == ~(CPU.REGS.regs[9] | CPU.REGS.regs[13]));
`TEST_CHECK(CPU.REGS.regs[19] == 32'hfffffff0);
#2;
`TEST_CHECK(CPU.REGS.regs[20] == ( $signed(CPU.REGS.regs[12]) < $signed(CPU.REGS.regs[14]) ));
`TEST_CHECK(CPU.REGS.regs[20] == 32'd1);
#2;
`TEST_CHECK(CPU.REGS.regs[21] == ( CPU.REGS.regs[12] < CPU.REGS.regs[14] ));
`TEST_CHECK(CPU.REGS.regs[21] == 32'd0);
// TODO: Verify program never branches
#2;
#2;
#2;
#2;
// TODO: Verify final program register state
if (num_errors == 0) begin $display("\x1b[38;5;10mAll pipelined nohazard MIPS tests passing\x1b[m");
end else begin $display("\x1b[38;5;9m%0d pipelined nohazard MIPS test(s) failing\x1b[m", num_errors); end
$dumpflush;
$finish;
end
endmodule
+8 -7
View File
@@ -1,8 +1,9 @@
`include "tests/seven_seg_tb.sv" //`include "tests/seven_seg_tb.sv"
`include "tests/lu_tb.sv" //`include "tests/lu_tb.sv"
`include "tests/asu_tb.sv" //`include "tests/asu_tb.sv"
`include "tests/instruction_classifier_tb.sv" //`include "tests/instruction_classifier_tb.sv"
`include "tests/shifter_tb.sv" //`include "tests/shifter_tb.sv"
`include "tests/alu_tb.sv" //`include "tests/alu_tb.sv"
`include "tests/mips_singlecycle.sv" //`include "tests/mips_singlecycle.sv"
//`include "tests/mips_pipelined_nohazard.sv"
`include "tests/mips_pipelined.sv" `include "tests/mips_pipelined.sv"