FPA_module_test.sv 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. module floating_add #(parameter N=16)(a, b, c);
  2. input logic [N-1:0] a, b;
  3. output logic [N-1:0] c;
  4. logic flag_a;
  5. logic flag_b;
  6. logic abs;
  7. // sign_x = x[N-1]
  8. // exponent_x = x[N-2:N-6]
  9. // mantissa_x = x[N-7:0]
  10. assign c[N-1] = a[N-1] ^ b[N-1];
  11. always_comb
  12. begin
  13. if (a[N-2:N-6] > b[N-2:N-6])
  14. begin
  15. flag_a = 1;
  16. flag_b = 0;
  17. abs = a[N-2:N-6] - b[N-2:N-6];
  18. c[N-2:N-6] = a[N-2:N-6];
  19. end
  20. else if (b[N-2:N-6] > a[N-2:N-6])
  21. begin
  22. flag_a = 0;
  23. flag_b = 1;
  24. abs = b[N-2:N-6] - a[N-2:N-6];
  25. c[N-2:N-6] = b[N-2:N-6];
  26. end
  27. else
  28. begin
  29. flag_a = 1;
  30. flag_b = 1;
  31. abs <= 0;
  32. c[N-2:N-6] = a[N-2:N-6];
  33. end
  34. end
  35. always_comb
  36. begin
  37. if (abs > 4'b1000)
  38. begin
  39. if (flag_a & ~flag_b) c = a;
  40. else if (~flag_a & flag_b) c = b;
  41. else c <= a;
  42. end
  43. else
  44. begin
  45. if (flag_a & ~flag_b)
  46. c[N-7:0] = a[N-7:0] + (b[N-7:0] >> abs);
  47. else if (~flag_a & flag_b)
  48. c[N-7:0] = b[N-7:0] + (a[N-7:0] >> abs);
  49. else c[N-7:0] <= b[N-7:0] << 1;
  50. end
  51. end
  52. endmodule