Advertisement
cr88192

Modestly cheap integer MUL/DIV

Apr 5th, 2022
1,571
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Slow Integer MUL/DIV
  3.  
  4. Perform an Integer MUL/DIV via the Shift-Add approach.
  5. This is slow, but it can do 64-bit MUL/DIV in a moderately cost-effective way.
  6.  
  7.  */
  8.  
  9. `include "CoreDefs.v"
  10.  
  11. module ExOpSloMulDiv(
  12.     clock,      reset,
  13.     idUCmd,     idUIxt,
  14.     valRs,      valRt,
  15.     valRn,      valRnHi,
  16.     exInHold,   exOutHold
  17.     );
  18.  
  19. input   clock;
  20. input   reset;
  21.  
  22. input       exInHold;
  23. output      exOutHold;
  24.  
  25. input[8:0]      idUCmd;
  26. input[8:0]      idUIxt;
  27.  
  28. input[63:0]     valRs;
  29. input[63:0]     valRt;
  30. output[63:0]    valRn;
  31. output[63:0]    valRnHi;
  32.  
  33. reg             tDoHold;
  34. assign      exOutHold = tDoHold;
  35.  
  36. reg[63:0]       tValRs;
  37. reg[63:0]       tValRt;
  38. reg[63:0]       tValRn;
  39. reg[63:0]       tNxtValRn;
  40. reg[63:0]       tValRnHi;
  41. reg[63:0]       tNxtValRnHi;
  42.  
  43. assign      valRn = tValRn;
  44. assign      valRnHi = tValRnHi;
  45.  
  46. reg[63:0]       tValQ;
  47. reg[63:0]       tNxtValQ;
  48. reg[63:0]       tValR;
  49. reg[63:0]       tNxtValR;
  50.  
  51. reg[63:0]       tValAQ;
  52. reg[63:0]       tNxtValAQ;
  53. reg[63:0]       tValAR;
  54. reg[63:0]       tNxtValAR;
  55.  
  56. reg[63:0]       tValRsubD;
  57.  
  58. reg[63:0]       tValAddD;
  59. reg[63:0]       tNxtValAddD;
  60. reg             tValAddDc;
  61. reg             tNxtValAddDc;
  62.  
  63. reg[5:0]        tValOp;
  64. reg[5:0]        tNxtValOp;
  65. reg             tValSg;
  66. reg             tNxtValSg;
  67. reg             tValSg1;
  68.  
  69. reg             tValC1;
  70. reg             tValC;
  71. reg             tNxtValC;
  72.  
  73. reg[6:0]        tOpCnt;
  74. reg[6:0]        tNxtOpCnt;
  75.  
  76. always @*
  77. begin
  78.     tNxtValAddD     = tValAddD;
  79.     tNxtValAddDc    = tValAddDc;
  80.     tNxtValOp       = tValOp;
  81.     tNxtValSg       = tValSg;
  82.     tDoHold         = 0;
  83.    
  84.     tValC1      =   tValC;
  85.     if(!tNxtValOp[2])
  86.         tValC1      =   tValR[63];
  87.    
  88. //  tNxtValR    = { tValR[62:0], tValQ[63] };
  89.     tNxtValR    = { tValR[62:0], tValQ[63] && tNxtValOp[2] };
  90.     tNxtValQ    = { tValQ[62:0], tValC1 };
  91. //  tValRsubD   = tNxtValR[63:0] + tValAddD;
  92.     tValRsubD   = tNxtValR[63:0] + tValAddD + { 63'h0, tValAddDc };
  93.     tNxtValC    = !tValRsubD[63];
  94.     if(tNxtValC && tNxtValOp[2])
  95.         tNxtValR = tValRsubD;
  96.  
  97.     if(tValQ[63] && !tNxtValOp[2])
  98.     begin
  99.         tNxtValR    = tValRsubD;
  100.     end
  101.  
  102.     tNxtValAR   = tValSg ? -tValR[63:0] : tValR[63:0];
  103.     tNxtValAQ   = tValSg ? -tValQ[63:0] : tValQ[63:0];
  104.  
  105.     tNxtValRnHi = tValAQ[63:0];
  106.     if(tValOp[1] ^ !tValOp[2])
  107.         tNxtValRn   = tValAR[63:0];
  108.     else
  109.         tNxtValRn   = tValAQ[63:0];
  110.  
  111. //  tNxtValRnHi = tValQ[63:0];
  112. //  if(tValOp[1] ^ !tValOp[2])
  113. //      tNxtValRn   = tValSg ? -tValR[63:0] : tValR[63:0];
  114. //  else
  115. //      tNxtValRn   = tValSg ? -tValQ[63:0] : tValQ[63:0];
  116.  
  117.     tDoHold     = (tOpCnt!=0);
  118.  
  119.     if(tOpCnt!=0)
  120.     begin
  121.         tNxtOpCnt   = tOpCnt - 1;
  122. //      tDoHold     = 1;
  123.     end
  124.     else
  125.     begin
  126.         tNxtValRn       = tValRn;
  127.         tNxtValRnHi     = tValRnHi;
  128.  
  129.         if(idUCmd[5:0]==JX2_UCMD_QMULDIV)
  130.         begin
  131. //          if( (idUIxt[5:0]==JX2_UCIX_QMUL_DIVS) ||
  132. //              (idUIxt[5:0]==JX2_UCIX_QMUL_DIVU) ||
  133. //              (idUIxt[5:0]==JX2_UCIX_QMUL_MODS) ||
  134. //              (idUIxt[5:0]==JX2_UCIX_QMUL_MODU) )
  135.             if(idUIxt[2])
  136.             begin
  137.                 tNxtValSg       = (valRs[63] ^ valRt[63]) && !idUIxt[0];
  138. //              tNxtOpCnt       = 66;
  139.                 tNxtOpCnt       = 67;
  140.                 if(idUIxt[1])
  141. //                  tNxtOpCnt       = 65;
  142.                     tNxtOpCnt       = 66;
  143.  
  144.                 if(valRs[63] && !idUIxt[0])
  145.                     tNxtValQ        = -valRs;
  146.                 else
  147.                     tNxtValQ        =  valRs;
  148.  
  149.                 tNxtValR        = UV64_00;
  150.                 tNxtValAddDc    = 0;
  151.  
  152.                 if(valRt[63] && !idUIxt[0])
  153.                 begin
  154.                     tNxtValAddD     =  valRt;
  155.                 end
  156.                 else
  157.                 begin
  158. //                  tNxtValAddD     = -valRt;
  159.                     tNxtValAddD     = ~valRt;
  160.                     tNxtValAddDc    = 1;
  161.                 end
  162.  
  163.                 tNxtValOp       = idUIxt[5:0];
  164.             end
  165.  
  166.             else
  167.  
  168. //          if( (idUIxt[5:0]==JX2_UCIX_QMUL_MULS)   ||
  169. //              (idUIxt[5:0]==JX2_UCIX_QMUL_MULU)   ||
  170. //              (idUIxt[5:0]==JX2_UCIX_QMUL_MULHS)  ||
  171. //              (idUIxt[5:0]==JX2_UCIX_QMUL_MULHU)  )
  172.             begin
  173.                 tValSg1         = (valRs[63] ^ valRt[63]) && !idUIxt[0];
  174. //              tNxtOpCnt       = 65;
  175.                 tNxtOpCnt       = 66;
  176.                 tNxtValQ        = valRs;
  177.                 tNxtValR        = tValSg1 ? UV64_FF : UV64_00;
  178.                 tNxtValAddD     = valRt;
  179.                 tNxtValOp       = idUIxt[5:0];
  180.                 tNxtValSg       = 0;
  181.             end
  182.         end
  183.     end
  184. end
  185.  
  186. always @(posedge clock)
  187. begin
  188.     tValQ       <= tNxtValQ;
  189.     tValR       <= tNxtValR;
  190.     tValC       <= tNxtValC;
  191.     tOpCnt      <= tNxtOpCnt;
  192.     tValAddD    <= tNxtValAddD;
  193.     tValAddDc   <= tNxtValAddDc;
  194.     tValOp      <= tNxtValOp;
  195.     tValSg      <= tNxtValSg;
  196.  
  197.     tValAQ      <= tNxtValAQ;
  198.     tValAR      <= tNxtValAR;
  199.  
  200.     tValRn      <= tNxtValRn;
  201.     tValRnHi    <= tNxtValRnHi;
  202.    
  203.     if(!tDoHold)
  204.     begin
  205.         tValRs  <= valRs;
  206.         tValRt  <= valRt;
  207.     end
  208. end
  209.  
  210. endmodule
  211.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement