Advertisement
cr88192

JX2Core3: ALU Example 0

Mar 11th, 2019
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. ALU
  3.  
  4. Perform some ALU Operations
  5. May Sign or Zero Extend output.
  6.  
  7. idUIxt:
  8.   [7:6]=CC (AL/NV/CT/CF)
  9.   [  5]=QWord
  10.   [  4]=ZExt (0=SX, 1=ZX)
  11.   [3:0]=Op1
  12.  
  13. Op1:
  14.   0000: ADD
  15.   0001: SUB
  16.   0010: ADC
  17.   0011: SBB
  18.   0100: TST
  19.   0101: AND
  20.   0110: OR
  21.   0111: XOR
  22.   1000: CMPNE
  23.   1001: CMPHS
  24.   1010: CMPGE
  25.   1011: -
  26.   1100: CMPEQ
  27.   1101: CMPHI
  28.   1110: CMPGT
  29.   1111: -
  30.  
  31.  */
  32.  
  33. `include "CoreDefs.v"
  34.  
  35. module ExALU(
  36.     /* verilator lint_off UNUSED */
  37.     regValRs,
  38.     regValRt,
  39.     idUIxt,
  40.     regInSrT,
  41.     regOutVal,
  42.     regOutSrT
  43.     );
  44.  
  45. input[63:0]     regValRs;
  46. input[63:0]     regValRt;
  47. input[7:0]      idUIxt;
  48. input           regInSrT;
  49.  
  50. output[63:0]    regOutVal;
  51. output          regOutSrT;
  52.  
  53. reg[63:0]   tRegOutVal;
  54. reg         tRegOutSrT;
  55. assign  regOutVal = tRegOutVal;
  56. assign  regOutSrT = tRegOutSrT;
  57.  
  58.  
  59. reg[16:0]   tAdd1A0;
  60. reg[16:0]   tAdd1A1;
  61. reg[16:0]   tAdd1B0;
  62. reg[16:0]   tAdd1B1;
  63.  
  64. reg[16:0]   tAdd1C0;
  65. reg[16:0]   tAdd1C1;
  66. reg[16:0]   tAdd1D0;
  67. reg[16:0]   tAdd1D1;
  68.  
  69. reg[16:0]   tSub1A0;
  70. reg[16:0]   tSub1A1;
  71. reg[16:0]   tSub1B0;
  72. reg[16:0]   tSub1B1;
  73.  
  74. reg[16:0]   tSub1C0;
  75. reg[16:0]   tSub1C1;
  76. reg[16:0]   tSub1D0;
  77. reg[16:0]   tSub1D1;
  78.  
  79. reg[32:0]   tAdd2A0;
  80. reg[32:0]   tAdd2A1;
  81. reg[32:0]   tAdd2B0;
  82. reg[32:0]   tAdd2B1;
  83.  
  84. reg[32:0]   tSub2A0;
  85. reg[32:0]   tSub2A1;
  86. reg[32:0]   tSub2B0;
  87. reg[32:0]   tSub2B1;
  88.  
  89. reg[64:0]   tAdd3A0;
  90. reg[64:0]   tAdd3A1;
  91. reg[64:0]   tSub3A0;
  92. reg[64:0]   tSub3A1;
  93.  
  94. reg[32:0]   tResult1A;
  95. reg         tResult1T;
  96.  
  97. reg[64:0]   tResult2A;
  98. reg         tResult2T;
  99.  
  100. reg         tSub1ZF;
  101. reg         tSub1CF;
  102. reg         tSub1SF;
  103. reg         tSub1VF;
  104. reg         tTst1ZF;
  105.  
  106. reg         tSub2ZF;
  107. reg         tSub2CF;
  108. reg         tSub2SF;
  109. reg         tSub2VF;
  110. reg         tTst2ZF;
  111.  
  112.  
  113. always @*
  114. begin
  115.     tAdd1A0 = { 1'b0, regValRs[15: 0] } + { 1'b0,  regValRt[15: 0] } + 0;
  116.     tAdd1A1 = { 1'b0, regValRs[15: 0] } + { 1'b0,  regValRt[15: 0] } + 1;
  117.     tAdd1B0 = { 1'b0, regValRs[31:16] } + { 1'b0,  regValRt[31:16] } + 0;
  118.     tAdd1B1 = { 1'b0, regValRs[31:16] } + { 1'b0,  regValRt[31:16] } + 1;
  119.     tAdd1C0 = { 1'b0, regValRs[47:32] } + { 1'b0,  regValRt[47:32] } + 0;
  120.     tAdd1C1 = { 1'b0, regValRs[47:32] } + { 1'b0,  regValRt[47:32] } + 1;
  121.     tAdd1D0 = { 1'b0, regValRs[63:48] } + { 1'b0,  regValRt[63:48] } + 0;
  122.     tAdd1D1 = { 1'b0, regValRs[63:48] } + { 1'b0,  regValRt[63:48] } + 1;
  123.  
  124.     tSub1A0 = { 1'b0, regValRs[15: 0] } + { 1'b0, ~regValRt[15: 0] } + 0;
  125.     tSub1A1 = { 1'b0, regValRs[15: 0] } + { 1'b0, ~regValRt[15: 0] } + 1;
  126.     tSub1B0 = { 1'b0, regValRs[31:16] } + { 1'b0, ~regValRt[31:16] } + 0;
  127.     tSub1B1 = { 1'b0, regValRs[31:16] } + { 1'b0, ~regValRt[31:16] } + 1;
  128.     tSub1C0 = { 1'b0, regValRs[47:32] } + { 1'b0, ~regValRt[47:32] } + 0;
  129.     tSub1C1 = { 1'b0, regValRs[47:32] } + { 1'b0, ~regValRt[47:32] } + 1;
  130.     tSub1D0 = { 1'b0, regValRs[63:48] } + { 1'b0, ~regValRt[63:48] } + 0;
  131.     tSub1D1 = { 1'b0, regValRs[63:48] } + { 1'b0, ~regValRt[63:48] } + 1;
  132.    
  133.     tAdd2A0 = { tAdd1A0[16]?tAdd1B1:tAdd1B0, tAdd1A0[15:0] };
  134.     tAdd2A1 = { tAdd1A1[16]?tAdd1B1:tAdd1B0, tAdd1A1[15:0] };
  135.     tAdd2B0 = { tAdd1C0[16]?tAdd1D1:tAdd1D0, tAdd1C0[15:0] };
  136.     tAdd2B1 = { tAdd1C1[16]?tAdd1D1:tAdd1D0, tAdd1C1[15:0] };
  137.  
  138.     tSub2A0 = { tSub1A0[16]?tSub1B1:tSub1B0, tSub1A0[15:0] };
  139.     tSub2A1 = { tSub1A1[16]?tSub1B1:tSub1B0, tSub1A1[15:0] };
  140.     tSub2B0 = { tSub1C0[16]?tSub1D1:tSub1D0, tSub1C0[15:0] };
  141.     tSub2B1 = { tSub1C1[16]?tSub1D1:tSub1D0, tSub1C1[15:0] };
  142.  
  143.     tAdd3A0 = { tAdd2A0[32]?tAdd2B1:tAdd2B0, tAdd2A0[31:0] };
  144.     tAdd3A1 = { tAdd2A1[32]?tAdd2B1:tAdd2B0, tAdd2A1[31:0] };
  145.     tSub3A0 = { tSub2A0[32]?tSub2B1:tSub2B0, tSub2A0[31:0] };
  146.     tSub3A1 = { tSub2A1[32]?tSub2B1:tSub2B0, tSub2A1[31:0] };
  147.  
  148.  
  149.     tSub1ZF = (tSub2A1[15:0]==0) && (tSub2A1[31:16]==0);
  150.     tSub2ZF = tSub1ZF && (tSub3A1[47:32]==0) && (tSub3A1[63:48]==0);
  151.     tSub1CF = tSub2A1[32];
  152.     tSub2CF = tSub3A1[64];
  153.     tSub1SF = tSub2A1[31];
  154.     tSub2SF = tSub3A1[63];
  155.    
  156.     tTst1ZF =
  157.         ((regValRs[15: 0]&regValRt[15: 0])==0) &&
  158.         ((regValRs[31:16]&regValRt[31:16])==0) ;
  159.     tTst2ZF =
  160.         tTst1ZF &&
  161.         ((regValRs[47:32]&regValRt[47:32])==0) &&
  162.         ((regValRs[63:48]&regValRt[63:48])==0) ;
  163.  
  164.     case({regValRs[31], regValRt[31], tSub1SF})
  165.         3'b000: tSub1VF=0;
  166.         3'b001: tSub1VF=1;
  167.         3'b010: tSub1VF=0;
  168.         3'b011: tSub1VF=0;
  169.         3'b100: tSub1VF=0;
  170.         3'b101: tSub1VF=0;
  171.         3'b110: tSub1VF=1;
  172.         3'b111: tSub1VF=0;
  173.     endcase
  174.  
  175.     case({regValRs[63], regValRt[63], tSub2SF})
  176.         3'b000: tSub2VF=0;
  177.         3'b001: tSub2VF=1;
  178.         3'b010: tSub2VF=0;
  179.         3'b011: tSub2VF=0;
  180.         3'b100: tSub2VF=0;
  181.         3'b101: tSub2VF=0;
  182.         3'b110: tSub2VF=1;
  183.         3'b111: tSub2VF=0;
  184.     endcase
  185.  
  186.  
  187.     case({ idUIxt[3:0] })
  188.         4'h0: begin     /* ADD */
  189.             tResult1A=tAdd2A0;
  190.             tResult2A=tAdd3A0;
  191.             tResult1T=regInSrT;
  192.             tResult2T=regInSrT;
  193.         end
  194.         4'h1: begin     /* SUB */
  195.             tResult1A=tSub2A1;
  196.             tResult2A=tSub3A1;
  197.             tResult1T=regInSrT;
  198.             tResult2T=regInSrT;
  199.         end
  200.         4'h2: begin     /* ADC */
  201.             tResult1A=regInSrT ? tAdd2A1 : tAdd2A0;
  202.             tResult2A=regInSrT ? tAdd3A1 : tAdd3A0;
  203.             tResult1T=tResult1A[32];
  204.             tResult2T=tResult2A[64];
  205.         end
  206.         4'h3: begin     /* SBB */
  207.             tResult1A=regInSrT ? tSub2A0 : tSub2A1;
  208.             tResult2A=regInSrT ? tSub3A0 : tSub3A1;
  209.             tResult1T=!tResult1A[32];
  210.             tResult2T=!tResult2A[64];
  211.         end
  212.        
  213.         4'h4: begin     /* TST */
  214.             tResult1A=UV33_XX;
  215.             tResult2A=UV65_XX;
  216.             tResult1T=tTst1ZF;
  217.             tResult2T=tTst2ZF;
  218.         end
  219.         4'h5: begin     /* AND */
  220.             tResult1A={1'b0, regValRs[31:0] & regValRt[31:0]};
  221.             tResult2A={1'b0, regValRs[63:0] & regValRt[63:0]};
  222.             tResult1T=regInSrT;
  223.             tResult2T=regInSrT;
  224.         end
  225.         4'h6: begin     /* OR */
  226.             tResult1A={1'b0, regValRs[31:0] | regValRt[31:0]};
  227.             tResult2A={1'b0, regValRs[63:0] | regValRt[63:0]};
  228.             tResult1T=regInSrT;
  229.             tResult2T=regInSrT;
  230.         end
  231.         4'h7: begin     /* XOR */
  232.             tResult1A={1'b0, regValRs[31:0] ^ regValRt[31:0]};
  233.             tResult2A={1'b0, regValRs[63:0] ^ regValRt[63:0]};
  234.             tResult1T=regInSrT;
  235.             tResult2T=regInSrT;
  236.         end
  237.  
  238.         4'h8: begin     /* CMPNE */
  239.             tResult1A=UV33_XX;
  240.             tResult2A=UV65_XX;
  241.             tResult1T=!tSub1ZF;
  242.             tResult2T=!tSub2ZF;
  243.         end
  244.         4'h9: begin     /* CMPHS */
  245.             tResult1A=UV33_XX;
  246.             tResult2A=UV65_XX;
  247.             tResult1T=!tSub1CF;
  248.             tResult2T=!tSub2CF;
  249.         end
  250.         4'hA: begin     /* CMPGE */
  251.             tResult1A=UV33_XX;
  252.             tResult2A=UV65_XX;
  253.             tResult1T=tSub1ZF || (tSub1SF^tSub1VF);
  254.             tResult2T=tSub2ZF || (tSub2SF^tSub2VF);
  255.         end
  256.         4'hB: begin     /* Resv */
  257.             tResult1A=UV33_XX;
  258.             tResult2A=UV65_XX;
  259.             tResult1T=regInSrT;
  260.             tResult2T=regInSrT;
  261.         end
  262.  
  263.         4'hC: begin     /* CMPEQ */
  264.             tResult1A=UV33_XX;
  265.             tResult2A=UV65_XX;
  266.             tResult1T=tSub1ZF;
  267.             tResult2T=tSub2ZF;
  268.         end
  269.         4'hD: begin     /* CMPHI */
  270.             tResult1A=UV33_XX;
  271.             tResult2A=UV65_XX;
  272.             tResult1T=!tSub1CF && !tSub1ZF;
  273.             tResult2T=!tSub2CF && !tSub2ZF;
  274.         end
  275.         4'hE: begin     /* CMPGT */
  276.             tResult1A=UV33_XX;
  277.             tResult2A=UV65_XX;
  278.             tResult1T=(tSub1SF^tSub1VF);
  279.             tResult2T=(tSub2SF^tSub2VF);
  280.         end
  281.         4'hF: begin     /* Resv */
  282.             tResult1A=UV33_XX;
  283.             tResult2A=UV65_XX;
  284.             tResult1T=regInSrT;
  285.             tResult2T=regInSrT;
  286.         end
  287.     endcase
  288.  
  289.     if(idUIxt[5])
  290.     begin
  291.         tRegOutVal = tResult2A[63:0];
  292.         tRegOutSrT = tResult2T;
  293.     end
  294.     else
  295.     begin
  296.         if(idUIxt[4])
  297.             tRegOutVal = { UV32_00, tResult1A[31:0] };
  298.         else
  299.             tRegOutVal = { tResult1A[31]?UV32_FF:UV32_00, tResult1A[31:0] };
  300.         tRegOutSrT = tResult1T;
  301.     end
  302. end
  303.  
  304. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement