fpu32p.sv 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. `include "mult32.v"
  2. module fpu32p_tb;
  3. reg reset, clk;
  4. logic [31:0] input_a, input_b, result_add, result_mult;
  5. logic [31:0] expected_add, expected_mult;
  6. fp_adder#(.N(32), .M(8)) adder1(
  7. .clk(clk),
  8. .reset(reset),
  9. .input_a(input_a),
  10. .input_b(input_b),
  11. .output_z(result_add)
  12. );
  13. mult_32 multiplier1(
  14. .clk(clk),
  15. .a(input_a),
  16. .b(input_b),
  17. .out(result_mult),
  18. .zero2(),
  19. .invalid2(),
  20. .overflow1()
  21. );
  22. initial forever #5 clk = ~clk;
  23. localparam PIPELINES_ADD = 2;
  24. localparam PIPELINES_MUL = 12;
  25. reg [31:0] test_mem [29:0][3:0];
  26. initial $readmemh("scripts/fp32_test.hex", test_mem);
  27. initial begin
  28. static int num_err = 0;
  29. static int num_tests = $size(test_mem) * 2;
  30. clk = 0;
  31. reset = 1;
  32. #15;
  33. reset = 0;
  34. expected_add = 0;
  35. expected_mult = 0;
  36. for (int i=0; i < $size(test_mem)+PIPELINES_MUL; i++) begin
  37. if(i >= PIPELINES_ADD) expected_add = test_mem[i-PIPELINES_ADD][2];
  38. if(i >= PIPELINES_MUL) expected_mult = test_mem[i-PIPELINES_MUL][3];
  39. input_a = test_mem[i][0];
  40. input_b = test_mem[i][1];
  41. #10;
  42. if(result_add != expected_add) begin
  43. if(num_err < 20)
  44. $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]);
  45. num_err = num_err + 1;
  46. end
  47. if(result_mult != expected_mult) begin
  48. if(num_err < 20)
  49. $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]);
  50. num_err = num_err + 1;
  51. end
  52. end
  53. expected_add = 0;
  54. expected_mult = 0;
  55. #50;
  56. $display("Passed %d of %d tests", num_tests-num_err, num_tests);
  57. $finish();
  58. end
  59. endmodule : fpu32p_tb