fpu16.sv 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. `include "fp_adder.sv"
  2. `include "fp_product.sv"
  3. module fpu16_tb;
  4. reg reset, clk;
  5. logic [15:0] input_a, input_b, result_add, result_mult;
  6. logic [15:0] expected_add, expected_mult;
  7. fp_adder adder1(.input_a(input_a), .input_b(input_b), .output_z(result_add), .clk(clk), .reset(reset));
  8. fp_product multiplier1(.input_a(input_a), .input_b(input_b), .output_z(result_mult), .clk(clk), .reset(reset));
  9. initial forever #5 clk = ~clk;
  10. localparam PIPELINES = 3;
  11. reg [15:0] test_mem [29:0][3:0];
  12. initial $readmemh("scripts/fp16_test.hex", test_mem);
  13. initial begin
  14. static int num_err = 0;
  15. static int num_tests = $size(test_mem) * 2;
  16. clk = 0;
  17. reset = 1;
  18. #15;
  19. reset = 0;
  20. expected_add = 0;
  21. expected_mult = 0;
  22. for (int i=0; i < $size(test_mem)+PIPELINES; i++) begin
  23. if(i >= PIPELINES) begin
  24. expected_add = test_mem[i-PIPELINES][2];
  25. expected_mult = test_mem[i-PIPELINES][3];
  26. end
  27. input_a = test_mem[i][0];
  28. input_b = test_mem[i][1];
  29. #10;
  30. if(result_add != expected_add) begin
  31. if(num_err < 20)
  32. $display("FAIL ADD: %H + %H = %H, expected %H", test_mem[i-PIPELINES][0], test_mem[i-PIPELINES][1], result_add, test_mem[i][2]);
  33. num_err = num_err + 1;
  34. end
  35. if(result_mult != expected_mult) begin
  36. if(num_err < 20)
  37. $display("FAIL MULTIPLY: %H x %H = %H, expected %H", test_mem[i-PIPELINES][0], test_mem[i-PIPELINES][1], result_mult, test_mem[i][3]);
  38. num_err = num_err + 1;
  39. end
  40. end
  41. expected_add = 0;
  42. expected_mult = 0;
  43. #50;
  44. $display("Passed %d of %d tests", num_tests-num_err, num_tests);
  45. $finish();
  46. end
  47. endmodule : fpu16_tb