Advertisement
sserban21

Untitled

Apr 9th, 2022
389
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 15.71 KB | None | 0 0
  1. `timescale 1ns / 100ps
  2.  
  3. /*
  4. FPU Operations (fpu_op):
  5. ========================
  6. 0 = add
  7. 1 = sub
  8. 2 = mul
  9. 3 = div
  10. 4 =
  11. 5 =
  12. 6 =
  13. 7 =
  14. Rounding Modes (rmode):
  15. =======================
  16. 0 = round_nearest_even
  17. 1 = round_to_zero
  18. 2 = round_up
  19. 3 = round_down
  20. */
  21.  
  22.  
  23. module fpu( clk, rmode, fpu_op, opa, opb, out, inf, snan, qnan, ine, overflow, underflow, zero, div_by_zero);
  24. input       clk;
  25. input   [1:0]   rmode;
  26. input   [2:0]   fpu_op;
  27. input   [31:0]  opa, opb;
  28. output  [31:0]  out;
  29. output      inf, snan, qnan;
  30. output      ine;
  31. output      overflow, underflow;
  32. output      zero;
  33. output      div_by_zero;
  34.  
  35. parameter   INF  = 31'h7f800000,
  36.         QNAN = 31'h7fc00001,
  37.         SNAN = 31'h7f800001;
  38.  
  39. ////////////////////////////////////////////////////////////////////////
  40. //
  41. // Local Wires
  42. //
  43. reg     zero;
  44. reg [31:0]  opa_r, opb_r;       // Input operand registers
  45. reg [31:0]  out;            // Output register
  46. reg     div_by_zero;        // Divide by zero output register
  47. wire        signa, signb;       // alias to opX sign
  48. wire        sign_fasu;      // sign output
  49. wire    [26:0]  fracta, fractb;     // Fraction Outputs from EQU block
  50. wire    [7:0]   exp_fasu;       // Exponent output from EQU block
  51. reg [7:0]   exp_r;          // Exponent output (registerd)
  52. wire    [26:0]  fract_out_d;        // fraction output
  53. wire        co;         // carry output
  54. reg [27:0]  fract_out_q;        // fraction output (registerd)
  55. wire    [30:0]  out_d;          // Intermediate final result output
  56. wire        overflow_d, underflow_d;// Overflow/Underflow Indicators
  57. reg     overflow, underflow;    // Output registers for Overflow & Underflow
  58. reg     inf, snan, qnan;    // Output Registers for INF, SNAN and QNAN
  59. reg     ine;            // Output Registers for INE
  60. reg [1:0]   rmode_r1, rmode_r2,     // Pipeline registers for rounding mode
  61.         rmode_r3;
  62. reg [2:0]   fpu_op_r1, fpu_op_r2,   // Pipeline registers for fp opration
  63.         fpu_op_r3;
  64. wire        mul_inf, div_inf;
  65. wire        mul_00, div_00;
  66.  
  67. ////////////////////////////////////////////////////////////////////////
  68. //
  69. // Input Registers
  70. //
  71.  
  72. always @(posedge clk)
  73.     opa_r <= #1 opa;
  74.  
  75. always @(posedge clk)
  76.     opb_r <= #1 opb;
  77.  
  78. always @(posedge clk)
  79.     rmode_r1 <= #1 rmode;
  80.  
  81. always @(posedge clk)
  82.     rmode_r2 <= #1 rmode_r1;
  83.  
  84. always @(posedge clk)
  85.     rmode_r3 <= #1 rmode_r2;
  86.  
  87. always @(posedge clk)
  88.     fpu_op_r1 <= #1 fpu_op;
  89.  
  90. always @(posedge clk)
  91.     fpu_op_r2 <= #1 fpu_op_r1;
  92.  
  93. always @(posedge clk)
  94.     fpu_op_r3 <= #1 fpu_op_r2;
  95.  
  96. ////////////////////////////////////////////////////////////////////////
  97. //
  98. // Exceptions block
  99. //
  100. wire        inf_d, ind_d, qnan_d, snan_d, opa_nan, opb_nan;
  101. wire        opa_00, opb_00;
  102. wire        opa_inf, opb_inf;
  103. wire        opa_dn, opb_dn;
  104.  
  105. except u0(  .clk(clk),
  106.         .opa(opa_r), .opb(opb_r),
  107.         .inf(inf_d), .ind(ind_d),
  108.         .qnan(qnan_d), .snan(snan_d),
  109.         .opa_nan(opa_nan), .opb_nan(opb_nan),
  110.         .opa_00(opa_00), .opb_00(opb_00),
  111.         .opa_inf(opa_inf), .opb_inf(opb_inf),
  112.         .opa_dn(opa_dn), .opb_dn(opb_dn)
  113.         );
  114.  
  115. ////////////////////////////////////////////////////////////////////////
  116. //
  117. // Pre-Normalize block
  118. // - Adjusts the numbers to equal exponents and sorts them
  119. // - determine result sign
  120. // - determine actual operation to perform (add or sub)
  121. //
  122.  
  123. wire        nan_sign_d, result_zero_sign_d;
  124. reg     sign_fasu_r;
  125. wire    [7:0]   exp_mul;
  126. wire        sign_mul;
  127. reg     sign_mul_r;
  128. wire    [23:0]  fracta_mul, fractb_mul;
  129. wire        inf_mul;
  130. reg     inf_mul_r;
  131. wire    [1:0]   exp_ovf;
  132. reg [1:0]   exp_ovf_r;
  133. wire        sign_exe;
  134. reg     sign_exe_r;
  135. wire    [2:0]   underflow_fmul_d;
  136.  
  137.  
  138. pre_norm u1(.clk(clk),              // System Clock
  139.     .rmode(rmode_r2),           // Roundin Mode
  140.     .add(!fpu_op_r1[0]),            // Add/Sub Input
  141.     .opa(opa_r),  .opb(opb_r),      // Registered OP Inputs
  142.     .opa_nan(opa_nan),          // OpA is a NAN indicator
  143.     .opb_nan(opb_nan),          // OpB is a NAN indicator
  144.     .fracta_out(fracta),            // Equalized and sorted fraction
  145.     .fractb_out(fractb),            // outputs (Registered)
  146.     .exp_dn_out(exp_fasu),          // Selected exponent output (registered);
  147.     .sign(sign_fasu),           // Encoded output Sign (registered)
  148.     .nan_sign(nan_sign_d),          // Output Sign for NANs (registered)
  149.     .result_zero_sign(result_zero_sign_d),  // Output Sign for zero result (registered)
  150.     .fasu_op(fasu_op)           // Actual fasu operation output (registered)
  151.     );
  152.  
  153. always @(posedge clk)
  154.     sign_fasu_r <= #1 sign_fasu;
  155.  
  156. pre_norm_fmul u2(
  157.         .clk(clk),
  158.         .fpu_op(fpu_op_r1),
  159.         .opa(opa_r), .opb(opb_r),
  160.         .fracta(fracta_mul),
  161.         .fractb(fractb_mul),
  162.         .exp_out(exp_mul),  // FMUL exponent output (registered)
  163.         .sign(sign_mul),    // FMUL sign output (registered)
  164.         .sign_exe(sign_exe),    // FMUL exception sign output (registered)
  165.         .inf(inf_mul),      // FMUL inf output (registered)
  166.         .exp_ovf(exp_ovf),  // FMUL exponnent overflow output (registered)
  167.         .underflow(underflow_fmul_d)
  168.         );
  169.  
  170.  
  171. always @(posedge clk)
  172.     sign_mul_r <= #1 sign_mul;
  173.  
  174. always @(posedge clk)
  175.     sign_exe_r <= #1 sign_exe;
  176.  
  177. always @(posedge clk)
  178.     inf_mul_r <= #1 inf_mul;
  179.  
  180. always @(posedge clk)
  181.     exp_ovf_r <= #1 exp_ovf;
  182.  
  183.  
  184. ////////////////////////////////////////////////////////////////////////
  185. //
  186. // Add/Sub
  187. //
  188.  
  189. add_sub27 u3(
  190.     .add(fasu_op),          // Add/Sub
  191.     .opa(fracta),           // Fraction A input
  192.     .opb(fractb),           // Fraction B Input
  193.     .sum(fract_out_d),      // SUM output
  194.     .co(co_d) );            // Carry Output
  195.  
  196. always @(posedge clk)
  197.     fract_out_q <= #1 {co_d, fract_out_d};
  198.  
  199. ////////////////////////////////////////////////////////////////////////
  200. //
  201. // Mul
  202. //
  203. wire    [47:0]  prod;
  204.  
  205. mul_r2 u5(.clk(clk), .opa(fracta_mul), .opb(fractb_mul), .prod(prod));
  206.  
  207. ////////////////////////////////////////////////////////////////////////
  208. //
  209. // Divide
  210. //
  211. wire    [49:0]  quo;
  212. wire    [49:0]  fdiv_opa;
  213. wire    [49:0]  remainder;
  214. wire        remainder_00;
  215. reg [4:0]   div_opa_ldz_d, div_opa_ldz_r1, div_opa_ldz_r2;
  216.  
  217. always @(fracta_mul)
  218.     casex(fracta_mul[22:0])
  219.        23'b1??????????????????????: div_opa_ldz_d = 1;
  220.        23'b01?????????????????????: div_opa_ldz_d = 2;
  221.        23'b001????????????????????: div_opa_ldz_d = 3;
  222.        23'b0001???????????????????: div_opa_ldz_d = 4;
  223.        23'b00001??????????????????: div_opa_ldz_d = 5;
  224.        23'b000001?????????????????: div_opa_ldz_d = 6;
  225.        23'b0000001????????????????: div_opa_ldz_d = 7;
  226.        23'b00000001???????????????: div_opa_ldz_d = 8;
  227.        23'b000000001??????????????: div_opa_ldz_d = 9;
  228.        23'b0000000001?????????????: div_opa_ldz_d = 10;
  229.        23'b00000000001????????????: div_opa_ldz_d = 11;
  230.        23'b000000000001???????????: div_opa_ldz_d = 12;
  231.        23'b0000000000001??????????: div_opa_ldz_d = 13;
  232.        23'b00000000000001?????????: div_opa_ldz_d = 14;
  233.        23'b000000000000001????????: div_opa_ldz_d = 15;
  234.        23'b0000000000000001???????: div_opa_ldz_d = 16;
  235.        23'b00000000000000001??????: div_opa_ldz_d = 17;
  236.        23'b000000000000000001?????: div_opa_ldz_d = 18;
  237.        23'b0000000000000000001????: div_opa_ldz_d = 19;
  238.        23'b00000000000000000001???: div_opa_ldz_d = 20;
  239.        23'b000000000000000000001??: div_opa_ldz_d = 21;
  240.        23'b0000000000000000000001?: div_opa_ldz_d = 22;
  241.        23'b0000000000000000000000?: div_opa_ldz_d = 23;
  242.     endcase
  243.  
  244. assign fdiv_opa = !(|opa_r[30:23]) ? {(fracta_mul<<div_opa_ldz_d), 26'h0} : {fracta_mul, 26'h0};
  245.  
  246.  
  247. div_r2 u6(.clk(clk), .opa(fdiv_opa), .opb(fractb_mul), .quo(quo), .rem(remainder));
  248.  
  249. assign remainder_00 = !(|remainder);
  250.  
  251. always @(posedge clk)
  252.     div_opa_ldz_r1 <= #1 div_opa_ldz_d;
  253.  
  254. always @(posedge clk)
  255.     div_opa_ldz_r2 <= #1 div_opa_ldz_r1;
  256.  
  257.  
  258. ////////////////////////////////////////////////////////////////////////
  259. //
  260. // Normalize Result
  261. //
  262. wire        ine_d;
  263. reg [47:0]  fract_denorm;
  264. wire    [47:0]  fract_div;
  265. wire        sign_d;
  266. reg     sign;
  267. reg [30:0]  opa_r1;
  268. reg [47:0]  fract_i2f;
  269. reg     opas_r1, opas_r2;
  270. wire        f2i_out_sign;
  271.  
  272. always @(posedge clk)           // Exponent must be once cycle delayed
  273.     case(fpu_op_r2)
  274.       0,1:  exp_r <= #1 exp_fasu;
  275.       2,3:  exp_r <= #1 exp_mul;
  276.       4:    exp_r <= #1 0;
  277.       5:    exp_r <= #1 opa_r1[30:23];
  278.     endcase
  279.  
  280. assign fract_div = (opb_dn ? quo[49:2] : {quo[26:0], 21'h0});
  281.  
  282. always @(posedge clk)
  283.     opa_r1 <= #1 opa_r[30:0];
  284.  
  285. always @(posedge clk)
  286.     fract_i2f <= #1 (fpu_op_r2==5) ?
  287.             (sign_d ?  1-{24'h00, (|opa_r1[30:23]), opa_r1[22:0]}-1 : {24'h0, (|opa_r1[30:23]), opa_r1[22:0]}) :
  288.             (sign_d ? 1 - {opa_r1, 17'h01} : {opa_r1, 17'h0});
  289.  
  290. always @(fpu_op_r3 or fract_out_q or prod or fract_div or fract_i2f)
  291.     case(fpu_op_r3)
  292.        0,1: fract_denorm = {fract_out_q, 20'h0};
  293.        2:   fract_denorm = prod;
  294.        3:   fract_denorm = fract_div;
  295.        4,5: fract_denorm = fract_i2f;
  296.     endcase
  297.  
  298.  
  299. always @(posedge clk)
  300.     opas_r1 <= #1 opa_r[31];
  301.  
  302. always @(posedge clk)
  303.     opas_r2 <= #1 opas_r1;
  304.  
  305. assign sign_d = fpu_op_r2[1] ? sign_mul : sign_fasu;
  306.  
  307. always @(posedge clk)
  308.     sign <= #1 (rmode_r2==2'h3) ? !sign_d : sign_d;
  309.  
  310. post_norm u4(.clk(clk),         // System Clock
  311.     .fpu_op(fpu_op_r3),     // Floating Point Operation
  312.     .opas(opas_r2),         // OPA Sign
  313.     .sign(sign),            // Sign of the result
  314.     .rmode(rmode_r3),       // Rounding mode
  315.     .fract_in(fract_denorm),    // Fraction Input
  316.     .exp_ovf(exp_ovf_r),        // Exponent Overflow
  317.     .exp_in(exp_r),         // Exponent Input
  318.     .opa_dn(opa_dn),        // Operand A Denormalized
  319.     .opb_dn(opb_dn),        // Operand A Denormalized
  320.     .rem_00(remainder_00),      // Diveide Remainder is zero
  321.     .div_opa_ldz(div_opa_ldz_r2),   // Divide opa leading zeros count
  322.     .output_zero(mul_00 | div_00),  // Force output to Zero
  323.     .out(out_d),            // Normalized output (un-registered)
  324.     .ine(ine_d),            // Result Inexact output (un-registered)
  325.     .overflow(overflow_d),      // Overflow output (un-registered)
  326.     .underflow(underflow_d),    // Underflow output (un-registered)
  327.     .f2i_out_sign(f2i_out_sign) // F2I Output Sign
  328.     );
  329.  
  330. ////////////////////////////////////////////////////////////////////////
  331. //
  332. // FPU Outputs
  333. //
  334. reg     fasu_op_r1, fasu_op_r2;
  335. wire    [30:0]  out_fixed;
  336. wire        output_zero_fasu;
  337. wire        output_zero_fdiv;
  338. wire        output_zero_fmul;
  339. reg     inf_mul2;
  340. wire        overflow_fasu;
  341. wire        overflow_fmul;
  342. wire        overflow_fdiv;
  343. wire        inf_fmul;
  344. wire        sign_mul_final;
  345. wire        out_d_00;
  346. wire        sign_div_final;
  347. wire        ine_mul, ine_mula, ine_div, ine_fasu;
  348. wire        underflow_fasu, underflow_fmul, underflow_fdiv;
  349. wire        underflow_fmul1;
  350. reg [2:0]   underflow_fmul_r;
  351. reg     opa_nan_r;
  352.  
  353.  
  354. always @(posedge clk)
  355.     fasu_op_r1 <= #1 fasu_op;
  356.  
  357. always @(posedge clk)
  358.     fasu_op_r2 <= #1 fasu_op_r1;
  359.  
  360. always @(posedge clk)
  361.     inf_mul2 <= #1 exp_mul == 8'hff;
  362.  
  363.  
  364. // Force pre-set values for non numerical output
  365. assign mul_inf = (fpu_op_r3==3'b010) & (inf_mul_r | inf_mul2) & (rmode_r3==2'h0);
  366. assign div_inf = (fpu_op_r3==3'b011) & (opb_00 | opa_inf);
  367.  
  368. assign mul_00 = (fpu_op_r3==3'b010) & (opa_00 | opb_00);
  369. assign div_00 = (fpu_op_r3==3'b011) & (opa_00 | opb_inf);
  370.  
  371. assign out_fixed = (    (qnan_d | snan_d) |
  372.             (ind_d & !fasu_op_r2) |
  373.             ((fpu_op_r3==3'b011) & opb_00 & opa_00) |
  374.             (((opa_inf & opb_00) | (opb_inf & opa_00 )) & fpu_op_r3==3'b010)
  375.            )  ? QNAN : INF;
  376.  
  377. always @(posedge clk)
  378.     out[30:0] <= #1 (mul_inf | div_inf | (inf_d & (fpu_op_r3!=3'b011) & (fpu_op_r3!=3'b101)) | snan_d | qnan_d) & fpu_op_r3!=3'b100 ? out_fixed :
  379.             out_d;
  380.  
  381. assign out_d_00 = !(|out_d);
  382.  
  383. assign sign_mul_final = (sign_exe_r & ((opa_00 & opb_inf) | (opb_00 & opa_inf))) ? !sign_mul_r : sign_mul_r;
  384. assign sign_div_final = (sign_exe_r & (opa_inf & opb_inf)) ? !sign_mul_r : sign_mul_r | (opa_00 & opb_00);
  385.  
  386. always @(posedge clk)
  387.     out[31] <= #1   ((fpu_op_r3==3'b101) & out_d_00) ? (f2i_out_sign & !(qnan_d | snan_d) ) :
  388.             ((fpu_op_r3==3'b010) & !(snan_d | qnan_d)) ?    sign_mul_final :
  389.             ((fpu_op_r3==3'b011) & !(snan_d | qnan_d)) ?    sign_div_final :
  390.             (snan_d | qnan_d | ind_d) ?         nan_sign_d :
  391.             output_zero_fasu ?              result_zero_sign_d :
  392.                                     sign_fasu_r;
  393.  
  394. // Exception Outputs
  395. assign ine_mula = ((inf_mul_r |  inf_mul2 | opa_inf | opb_inf) & (rmode_r3==2'h1) &
  396.         !((opa_inf & opb_00) | (opb_inf & opa_00 )) & fpu_op_r3[1]);
  397.  
  398. assign ine_mul  = (ine_mula | ine_d | inf_fmul | out_d_00 | overflow_d | underflow_d) &
  399.           !opa_00 & !opb_00 & !(snan_d | qnan_d | inf_d);
  400. assign ine_div  = (ine_d | overflow_d | underflow_d) & !(opb_00 | snan_d | qnan_d | inf_d);
  401. assign ine_fasu = (ine_d | overflow_d | underflow_d) & !(snan_d | qnan_d | inf_d);
  402.  
  403. always @(posedge  clk)
  404.     ine <= #1    fpu_op_r3[2] ? ine_d :
  405.             !fpu_op_r3[1] ? ine_fasu :
  406.              fpu_op_r3[0] ? ine_div  : ine_mul;
  407.  
  408.  
  409. assign overflow_fasu = overflow_d & !(snan_d | qnan_d | inf_d);
  410. assign overflow_fmul = !inf_d & (inf_mul_r | inf_mul2 | overflow_d) & !(snan_d | qnan_d);
  411. assign overflow_fdiv = (overflow_d & !(opb_00 | inf_d | snan_d | qnan_d));
  412.  
  413. always @(posedge clk)
  414.     overflow <= #1   fpu_op_r3[2] ? 0 :
  415.             !fpu_op_r3[1] ? overflow_fasu :
  416.              fpu_op_r3[0] ? overflow_fdiv : overflow_fmul;
  417.  
  418. always @(posedge clk)
  419.     underflow_fmul_r <= #1 underflow_fmul_d;
  420.  
  421.  
  422. assign underflow_fmul1 = underflow_fmul_r[0] |
  423.             (underflow_fmul_r[1] & underflow_d ) |
  424.             ((opa_dn | opb_dn) & out_d_00 & (prod!=0) & sign) |
  425.             (underflow_fmul_r[2] & ((out_d[30:23]==0) | (out_d[22:0]==0)));
  426.  
  427. assign underflow_fasu = underflow_d & !(inf_d | snan_d | qnan_d);
  428. assign underflow_fmul = underflow_fmul1 & !(snan_d | qnan_d | inf_mul_r);
  429. assign underflow_fdiv = underflow_fasu & !opb_00;
  430.  
  431. always @(posedge clk)
  432.     underflow <= #1  fpu_op_r3[2] ? 0 :
  433.             !fpu_op_r3[1] ? underflow_fasu :
  434.              fpu_op_r3[0] ? underflow_fdiv : underflow_fmul;
  435.  
  436. always @(posedge clk)
  437.     snan <= #1 snan_d;
  438.  
  439. // synopsys translate_off
  440. wire        mul_uf_del;
  441. wire        uf2_del, ufb2_del, ufc2_del,  underflow_d_del;
  442. wire        co_del;
  443. wire    [30:0]  out_d_del;
  444. wire        ov_fasu_del, ov_fmul_del;
  445. wire    [2:0]   fop;
  446. wire    [4:0]   ldza_del;
  447. wire    [49:0]  quo_del;
  448.  
  449. delay1  #0 ud000(clk, underflow_fmul1, mul_uf_del);
  450. delay1  #0 ud001(clk, underflow_fmul_r[0], uf2_del);
  451. delay1  #0 ud002(clk, underflow_fmul_r[1], ufb2_del);
  452. delay1  #0 ud003(clk, underflow_d, underflow_d_del);
  453. delay1  #0 ud004(clk, test.u0.u4.exp_out1_co, co_del);
  454. delay1  #0 ud005(clk, underflow_fmul_r[2], ufc2_del);
  455. delay1 #30 ud006(clk, out_d, out_d_del);
  456.  
  457. delay1  #0 ud007(clk, overflow_fasu, ov_fasu_del);
  458. delay1  #0 ud008(clk, overflow_fmul, ov_fmul_del);
  459.  
  460. delay1  #2 ud009(clk, fpu_op_r3, fop);
  461.  
  462. delay3  #4 ud010(clk, div_opa_ldz_d, ldza_del);
  463.  
  464. delay1  #49 ud012(clk, quo, quo_del);
  465.  
  466.    // THIS WAS IN, BUT I REMOVED IT
  467. // always @(test.error_event)
  468. //    begin
  469. //  #0.2
  470. //  $display("muf: %b uf0: %b uf1: %b uf2: %b, tx0: %b, co: %b, out_d: %h (%h %h), ov_fasu: %b, ov_fmul: %b, fop: %h",
  471. //          mul_uf_del, uf2_del, ufb2_del, ufc2_del, underflow_d_del, co_del, out_d_del, out_d_del[30:23], out_d_del[22:0],
  472. //          ov_fasu_del, ov_fmul_del, fop );
  473. //  $display("ldza: %h, quo: %b",
  474. //          ldza_del, quo_del);
  475. //    end
  476. // synopsys translate_on
  477.  
  478.  
  479.  
  480. // Status Outputs
  481. always @(posedge clk)
  482.     qnan <= #1  fpu_op_r3[2] ? 0 : (
  483.                         snan_d | qnan_d | (ind_d & !fasu_op_r2) |
  484.                         (opa_00 & opb_00 & fpu_op_r3==3'b011) |
  485.                         (((opa_inf & opb_00) | (opb_inf & opa_00 )) & fpu_op_r3==3'b010)
  486.                        );
  487.  
  488. assign inf_fmul =   (((inf_mul_r | inf_mul2) & (rmode_r3==2'h0)) | opa_inf | opb_inf) &
  489.             !((opa_inf & opb_00) | (opb_inf & opa_00 )) &
  490.             fpu_op_r3==3'b010;
  491.  
  492. always @(posedge clk)
  493.     inf <= #1   fpu_op_r3[2] ? 0 :
  494.             (!(qnan_d | snan_d) & (
  495.                         ((&out_d[30:23]) & !(|out_d[22:0]) & !(opb_00 & fpu_op_r3==3'b011)) |
  496.                         (inf_d & !(ind_d & !fasu_op_r2) & !fpu_op_r3[1]) |
  497.                         inf_fmul |
  498.                         (!opa_00 & opb_00 & fpu_op_r3==3'b011) |
  499.                         (fpu_op_r3==3'b011 & opa_inf & !opb_inf)
  500.                           )
  501.             );
  502.  
  503. assign output_zero_fasu = out_d_00 & !(inf_d | snan_d | qnan_d);
  504. assign output_zero_fdiv = (div_00 | (out_d_00 & !opb_00)) & !(opa_inf & opb_inf) &
  505.               !(opa_00 & opb_00) & !(qnan_d | snan_d);
  506. assign output_zero_fmul = (out_d_00 | opa_00 | opb_00) &
  507.               !(inf_mul_r | inf_mul2 | opa_inf | opb_inf | snan_d | qnan_d) &
  508.               !(opa_inf & opb_00) & !(opb_inf & opa_00);
  509.  
  510. always @(posedge clk)
  511.     zero <= #1  fpu_op_r3==3'b101 ? out_d_00 & !(snan_d | qnan_d):
  512.             fpu_op_r3==3'b011 ? output_zero_fdiv :
  513.             fpu_op_r3==3'b010 ? output_zero_fmul :
  514.                         output_zero_fasu ;
  515.  
  516. always @(posedge clk)
  517.     opa_nan_r <= #1 !opa_nan & fpu_op_r2==3'b011;
  518.  
  519. always @(posedge clk)
  520.     div_by_zero <= #1 opa_nan_r & !opa_00 & !opa_inf & opb_00;
  521.  
  522. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement