`include "mult32.v" module fpu32p_tb; reg reset, clk; logic [31:0] input_a, input_b, result_add, result_mult; logic [31:0] expected_add, expected_mult; fp_adder#(.N(32), .M(8)) adder1( .clk(clk), .reset(reset), .input_a(input_a), .input_b(input_b), .output_z(result_add) ); mult_32 multiplier1( .clk(clk), .a(input_a), .b(input_b), .out(result_mult), .zero2(), .invalid2(), .overflow1() ); initial forever #5 clk = ~clk; localparam PIPELINES_ADD = 2; localparam PIPELINES_MUL = 12; reg [31:0] test_mem [29:0][3:0]; initial $readmemh("scripts/fp32_test.hex", test_mem); initial begin static int num_err = 0; static int num_tests = $size(test_mem) * 2; clk = 0; reset = 1; #15; reset = 0; expected_add = 0; expected_mult = 0; for (int i=0; i < $size(test_mem)+PIPELINES_MUL; i++) begin if(i >= PIPELINES_ADD) expected_add = test_mem[i-PIPELINES_ADD][2]; if(i >= PIPELINES_MUL) expected_mult = test_mem[i-PIPELINES_MUL][3]; input_a = test_mem[i][0]; input_b = test_mem[i][1]; #10; if(result_add != expected_add) begin if(num_err < 20) $display("FAIL ADD: %H + %H = %H, expected %H", test_mem[i-PIPELINES_ADD][0], test_mem[i-PIPELINES_ADD][1], result_add, test_mem[i][2]); num_err = num_err + 1; end if(result_mult != expected_mult) begin if(num_err < 20) $display("FAIL MULTIPLY: %H x %H = %H, expected %H", test_mem[i-PIPELINES_MUL][0], test_mem[i-PIPELINES_MUL][1], result_mult, test_mem[i][3]); num_err = num_err + 1; end end expected_add = 0; expected_mult = 0; #50; $display("Passed %d of %d tests", num_tests-num_err, num_tests); $finish(); end endmodule : fpu32p_tb