Advertisement
Guest User

Untitled

a guest
Jul 16th, 2016
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module alu(input Clock, input Reset,
  2.            input ClockEnable, input Flush,
  3.  
  4.            input [2:0] Op, input Fix, input Short,
  5.            input [63:0] Ai, input [63:0] Bi,
  6.            input [4:0] DestReg,
  7.  
  8.            output [63:0] Result,
  9.            output [4:0] ResultReg);
  10.  
  11.  
  12.   reg [5*8-1:0] RegDest;
  13.  
  14.   assign ResultReg = RegDest[5*7 +: 5];
  15.  
  16.   always @(posedge Clock)
  17.   if(Reset || Flush)
  18.   begin
  19.     RegDest <= 0;
  20.   end
  21.   else if(ClockEnable)
  22.   begin
  23.     RegDest <= {RegDest[0 +: 7*5], DestReg};
  24.   end
  25.  
  26.   wire [3*9-1:0] OpNext;
  27.   wire [8:0] CarryIn;
  28.   wire [64*9-1:0] A;
  29.   wire [64*9-1:0] B;
  30.                        
  31.   assign OpNext[2:0] = Op;
  32.   assign CarryIn[0] = ((Op == 0) && Fix) ? 1'b1 :
  33.                       ((Op == 5) && Fix) ? Ai[63] :
  34.                       1'b0;
  35.   assign A[63:0] = Ai;
  36.   assign B[63:0] = ((Op == 0) && Fix) ? ~Bi : Bi;
  37.  
  38.   assign Result = A[64*8 +: 64];
  39.        
  40.   genvar i;
  41.   generate
  42.     for(i=0; i<8; i=i+1)
  43.     begin : alu_stages
  44.       alu_stage #(.STAGE(i)) stage(
  45.         .Clock(Clock),
  46.         .Reset(Reset),
  47.         .ClockEnable(ClockEnable),
  48.         .Op(OpNext[3*i +: 3]),
  49.         .OpNext(OpNext[3*(i+1) +: 3]),
  50.         .CarryIn(CarryIn[i]),
  51.         .CarryOut(CarryIn[i+1]),
  52.         .A(A[i*64 +: 64]),
  53.         .B(B[i*64 +: 64]),
  54.         .NextA(A[(i+1)*64 +: 64]),
  55.         .NextB(B[(i+1)*64 +: 64])
  56.       );
  57.     end
  58.   endgenerate
  59.  
  60. endmodule
  61.  
  62. module alu_stage #( parameter STAGE = 0 )
  63.                 (input Clock, input Reset,
  64.                  input ClockEnable,
  65.  
  66.                  input [2:0] Op,
  67.                  output reg [2:0] OpNext,
  68.  
  69.                  input CarryIn,
  70.                  output reg CarryOut,
  71.                  input [63:0] A, input [63:0] B,
  72.                  output reg [63:0] NextA, output reg [63:0] NextB);
  73.  
  74.   // Stage 0: AS+Xor
  75.   // Stage 4: AS+And
  76.   // Stage 6: AS+Or
  77.  
  78.   wire [9:0] AddSubResult = {1'b0, A[STAGE*8 +: 8],CarryIn}+{1'b0, B[STAGE*8 +: 8],1'b1};
  79.  
  80.   wire [63:0] AddResult;
  81.   wire [63:0] NeqResult;
  82.   wire [63:0] XorResult;
  83.   wire [63:0] AndResult;
  84.   wire [63:0] OrResult;
  85.  
  86.   generate
  87.     if(STAGE == 0)
  88.       assign AddResult = {A[63:8], AddSubResult[8:1]};
  89.     else if(STAGE == 7)
  90.       assign AddResult = {AddSubResult[8:1], A[55:0]};
  91.     else
  92.       assign AddResult = {A[63:(STAGE+1)*8], AddSubResult[8:1], A[0 +: STAGE*8]};
  93.   endgenerate
  94.  
  95.   wire [3*64-1:0] ShiftInput = {{64{CarryIn}}, A, 64'd0};
  96.   wire [63:0] SllResult;
  97.   wire [63:0] SrlResult;
  98.  
  99.   generate
  100.     if(STAGE < 6) assign SllResult = B[STAGE] ? ShiftInput[64-(1<<STAGE) +: 64] : ShiftInput[64 +: 64];
  101.     else assign SllResult = A;
  102.  
  103.     if(STAGE < 6) assign SrlResult = B[STAGE] ? ShiftInput[64+(1<<STAGE) +: 64] : ShiftInput[64 +: 64];
  104.     else assign SrlResult = A;
  105.   endgenerate
  106.  
  107.   generate
  108.     if(STAGE == 0) assign NeqResult = A ^ B;
  109.     else if(STAGE < 7) assign NeqResult = A | A[(1<<(STAGE-1)) +: (64-(1<<(STAGE-1)))];
  110.     else assign NeqResult = {63'd0, A[0]};
  111.   endgenerate
  112.  
  113.   generate
  114.     if(STAGE == 0) assign XorResult = NeqResult;
  115.     else assign XorResult = CarryIn ? NeqResult : A;
  116.   endgenerate
  117.  
  118.   generate
  119.     if(STAGE == 4) assign AndResult = A & B;
  120.     else assign AndResult = A;
  121.   endgenerate
  122.  
  123.   generate
  124.     if(STAGE == 6) assign OrResult = A | B;
  125.     else assign OrResult = A;
  126.   endgenerate
  127.  
  128.   always @(posedge Clock)
  129.     if(Reset)
  130.     begin
  131.       OpNext <= 0;
  132.       NextA <= 0;
  133.       NextB <= 0;
  134.       CarryOut <= 0;
  135.     end
  136.     else if(ClockEnable)
  137.     begin
  138.       OpNext <= Op;
  139.  
  140.       NextA <= A;
  141.       NextB <= B;
  142.  
  143.       CarryOut <= 1'b0;
  144.  
  145.       case(Op)
  146.         0,2,3:
  147.           begin
  148.             NextA <= AddResult;
  149.             CarryOut <= AddSubResult[9];
  150.           end
  151.         1: NextA <= SllResult;
  152.         5:
  153.           begin
  154.             NextA <= SrlResult;
  155.             CarryOut <= CarryIn;
  156.           end
  157.         4: NextA <= XorResult;
  158.         6: NextA <= AndResult;
  159.         7: NextA <= OrResult;
  160.       endcase
  161.     end
  162.  
  163. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement