147 lines
4.7 KiB
Systemverilog
147 lines
4.7 KiB
Systemverilog
`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_tb();
|
|
logic [0:0] clk;
|
|
logic [0:0] rst;
|
|
assignment3 #("./asm/bin/ELEC4720-2026s2-Ass-03-HazardsDemo.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 MIPS tests");
|
|
|
|
#2;
|
|
#2;
|
|
#2;
|
|
#2;
|
|
#2;
|
|
//`TEST_CHECK(CPU.REGS.regs[8] == 32'd0);
|
|
#2;
|
|
//`TEST_CHECK(CPU.REGS.regs[9] == 32'd7);
|
|
#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[10] == 32'd7);
|
|
`TEST_CHECK(CPU.REGS.regs[11] == 32'd14);
|
|
`TEST_CHECK(CPU.REGS.regs[12] == -$signed(32'd7));
|
|
`TEST_CHECK(CPU.REGS.regs[13] == 32'd10);
|
|
`TEST_CHECK(CPU.REGS.regs[14] == 32'd3);
|
|
`TEST_CHECK(CPU.REGS.regs[15] == 32'd0);
|
|
|
|
`TEST_CHECK(CPU.REGS.regs[16] == 32'd2);
|
|
`TEST_CHECK(CPU.REGS.regs[17] == 32'd15);
|
|
`TEST_CHECK(CPU.REGS.regs[18] == 32'd13);
|
|
`TEST_CHECK(CPU.REGS.regs[19] == -$signed(32'd16));
|
|
`TEST_CHECK(CPU.REGS.regs[20] == 32'd1);
|
|
`TEST_CHECK(CPU.REGS.regs[21] == 32'd0);
|
|
`TEST_CHECK(CPU.REGS.regs[22] == 32'd0);
|
|
`TEST_CHECK(CPU.REGS.regs[23] == 32'd0);
|
|
end
|
|
endmodule |