Advertisement
cr88192

Slow Mul/Div (part 2, bugfixed)

Apr 6th, 2022
1,719
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. reg             tValRsubDc;
  58.  
  59. reg[63:0]       tValAddD;
  60. reg[63:0]       tNxtValAddD;
  61. reg             tValAddDc;
  62. reg             tNxtValAddDc;
  63.  
  64. reg[5:0]        tValOp;
  65. reg[5:0]        tNxtValOp;
  66. reg             tValSg;
  67. reg             tNxtValSg;
  68. reg             tValSg1;
  69. reg             tValSg1s;
  70. reg             tValSg1t;
  71.  
  72. reg             tValC1;
  73. reg             tValC;
  74. reg             tNxtValC;
  75.  
  76. reg[6:0]        tOpCnt;
  77. reg[6:0]        tNxtOpCnt;
  78.  
  79. always @*
  80. begin
  81.     tNxtValAddD     = tValAddD;
  82.     tNxtValAddDc    = tValAddDc;
  83.     tNxtValOp       = tValOp;
  84.     tNxtValSg       = tValSg;
  85.     tDoHold         = 0;
  86.     tNxtOpCnt       = tOpCnt;
  87.    
  88.     tValC1      =   tValC;
  89.     if(!tNxtValOp[2])
  90.         tValC1      =   tValR[63];
  91.    
  92.     tNxtValR    = { tValR[62:0], tValQ[63] && tNxtValOp[2] };
  93.  
  94. //  tValRsubD   = tNxtValR[63:0] + tValAddD;
  95. //  tValRsubD   = tNxtValR[63:0] + tValAddD + { 63'h0, tValAddDc };
  96.     { tValRsubDc, tValRsubD }   =
  97.         {  1'b0, tNxtValR[63:0] } +
  98.         {  1'b0, tValAddD } +
  99.         { 64'h0, tValAddDc };
  100.  
  101. //  if(tValRsubDc && !tNxtValOp[2])
  102. //      tValC1 = 1;
  103.     tNxtValQ    = { tValQ[62:0], tValC1 };
  104.  
  105.     if(tValRsubDc && !tNxtValOp[2])
  106. //      tNxtValQ = tNxtValQ+1;
  107.         tNxtValQ[3:0] = tNxtValQ[3:0] + 1;
  108.  
  109.     tNxtValC    = !tValRsubD[63];
  110.     if(tNxtValC && tNxtValOp[2])
  111.         tNxtValR = tValRsubD;
  112.  
  113.     if(tValQ[63] && !tNxtValOp[2])
  114.     begin
  115.         tNxtValR    = tValRsubD;
  116.     end
  117.  
  118.     tNxtValAR   = tValSg ? -tValR[63:0] : tValR[63:0];
  119.     tNxtValAQ   = tValSg ? -tValQ[63:0] : tValQ[63:0];
  120.  
  121.     tNxtValRnHi = tValAQ[63:0];
  122.     if(tValOp[1] ^ !tValOp[2])
  123.         tNxtValRn   = tValAR[63:0];
  124.     else
  125.         tNxtValRn   = tValAQ[63:0];
  126.  
  127.     tDoHold     = (tOpCnt!=0);
  128.  
  129.     if(tOpCnt!=0)
  130.     begin
  131.         tNxtOpCnt   = tOpCnt - 1;
  132.     end
  133.     else
  134.     begin
  135.         tNxtValRn       = tValRn;
  136.         tNxtValRnHi     = tValRnHi;
  137.  
  138.         if(idUCmd[5:0]==JX2_UCMD_QMULDIV)
  139.         begin
  140.  
  141.             tValSg1s        = valRs[63];
  142.             tValSg1t        = valRt[63];
  143.  
  144.             if(idUIxt[3])
  145.             begin
  146.                 tValSg1s        = valRs[31];
  147.                 tValSg1t        = valRt[31];
  148.             end
  149.  
  150.             if(idUIxt[0])
  151.             begin
  152.                 tValSg1s        = 0;
  153.                 tValSg1t        = 0;
  154.             end
  155.  
  156.             if(idUIxt[4])
  157.                 tValSg1t        = 0;
  158.  
  159.             tNxtValSg       = tValSg1s ^ tValSg1t;
  160.  
  161.             tNxtValR        = UV64_00;
  162.             tNxtValAddDc    = 0;
  163.  
  164.             tNxtValOp       = idUIxt[5:0];
  165.  
  166.             if(tValSg1s)
  167.                 tNxtValQ        = -valRs;
  168.             else
  169.                 tNxtValQ        =  valRs;
  170.  
  171.             if(tValSg1t ^ idUIxt[2])
  172.             begin
  173.                 tNxtValAddD     = ~valRt;
  174.                 tNxtValAddDc    = 1;
  175.             end
  176.             else
  177.             begin
  178.                 tNxtValAddD     =  valRt;
  179.             end
  180.  
  181.             if(idUIxt[3])
  182.             begin
  183.                 tNxtValQ[63:32]     = 32'h00;
  184.                 tNxtValAddD[63:32]  = 32'h00;
  185.             end
  186.  
  187.             if(idUIxt[2])
  188.             begin
  189.                 tNxtOpCnt       = 67;
  190.                 if(idUIxt[1])
  191.                     tNxtOpCnt       = 66;
  192.             end
  193.             else
  194.             begin
  195.                 tNxtOpCnt       = 66;
  196.             end
  197.         end
  198.     end
  199. end
  200.  
  201. always @(posedge clock)
  202. begin
  203.     tValQ       <= tNxtValQ;
  204.     tValR       <= tNxtValR;
  205.     tValC       <= tNxtValC;
  206.     tOpCnt      <= tNxtOpCnt;
  207.     tValAddD    <= tNxtValAddD;
  208.     tValAddDc   <= tNxtValAddDc;
  209.     tValOp      <= tNxtValOp;
  210.     tValSg      <= tNxtValSg;
  211.  
  212.     tValAQ      <= tNxtValAQ;
  213.     tValAR      <= tNxtValAR;
  214.  
  215.     tValRn      <= tNxtValRn;
  216.     tValRnHi    <= tNxtValRnHi;
  217.    
  218.     if(!tDoHold)
  219.     begin
  220.         tValRs  <= valRs;
  221.         tValRt  <= valRt;
  222.     end
  223. end
  224.  
  225. endmodule
  226.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement