OpenCores
URL https://opencores.org/ocsvn/aemb/aemb/trunk

Subversion Repositories aemb

[/] [aemb/] [branches/] [DEV_SYBREON/] [rtl/] [verilog/] [aeMB2_aslu.v] - Diff between revs 78 and 80

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 78 Rev 80
Line 1... Line 1...
/* $Id: aeMB2_aslu.v,v 1.1 2007-12-11 00:43:17 sybreon Exp $
/* $Id: aeMB2_aslu.v,v 1.2 2007-12-12 19:16:59 sybreon Exp $
**
**
** AEMB2 INTEGER ARITHMETIC SHIFT LOGIC UNIT
** AEMB2 INTEGER ARITHMETIC SHIFT LOGIC UNIT
**
**
** Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
** Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
**
**
Line 21... Line 21...
*/
*/
 
 
module aeMB2_aslu (/*AUTOARG*/
module aeMB2_aslu (/*AUTOARG*/
   // Outputs
   // Outputs
   dwb_adr_o, dwb_sel_o, rSEL_MA, cwb_adr_o, cwb_tga_o, cwb_sel_o,
   dwb_adr_o, dwb_sel_o, rSEL_MA, cwb_adr_o, cwb_tga_o, cwb_sel_o,
   rMUL_MA, rRES_MA, rRES_EX, rMSR_IE, rMSR_BE, rMSR_BIP,
   rMUL_MA, rRES_MA, rRES_EX, rMSR_IE, rMSR_BE, rMSR_TXE, rMSR_BIP,
   // Inputs
   // Inputs
   rIMM_OF, rALU_OF, rOPC_OF, rRA_OF, rRD_OF, rPC_OF, rOPA_OF,
   rIMM_OF, rALU_OF, rOPC_OF, rOPC_IF, rRA_OF, rRD_OF, rOPA_OF,
   rOPB_OF, pha_i, clk_i, rst_i, ena_i
   rOPB_OF, pha_i, clk_i, rst_i, ena_i
   );
   );
 
 
   parameter DWB = 32;
   parameter DWB = 32;
 
   parameter TXE = 1;
 
 
   parameter MUL = 0;
   parameter MUL = 0;
   parameter BSF = 1;
   parameter BSF = 1;
   parameter FSL = 1;
   parameter FSL = 1;
 
 
   parameter TXE = 1;
 
   parameter LUT = 1;
 
 
 
   // DWB
   // DWB
   output [DWB-1:2] dwb_adr_o;
   output [DWB-1:2] dwb_adr_o;
   output [3:0]     dwb_sel_o;
   output [3:0]     dwb_sel_o;
   output [3:0]     rSEL_MA;
   output [3:0]     rSEL_MA;
 
 
Line 53... Line 51...
   output [31:0]    rRES_MA,
   output [31:0]    rRES_MA,
                    rRES_EX;
                    rRES_EX;
 
 
   output           rMSR_IE,
   output           rMSR_IE,
                    rMSR_BE,
                    rMSR_BE,
 
                    rMSR_TXE,
                    rMSR_BIP;
                    rMSR_BIP;
 
 
   input [15:0]     rIMM_OF;
   input [15:0]     rIMM_OF;
   input [2:0]       rALU_OF;
   input [2:0]       rALU_OF;
   input [5:0]       rOPC_OF;
   input [5:0]       rOPC_OF,
 
                    rOPC_IF;
 
 
   input [4:0]       rRA_OF,
   input [4:0]       rRA_OF,
                    rRD_OF;
                    rRD_OF;
   input [31:2]     rPC_OF;
 
   input [31:0]     rOPA_OF, // RA, PC
   input [31:0]     rOPA_OF, // RA, PC
                    rOPB_OF; // RB, IMM
                    rOPB_OF; // RB, IMM
 
 
   // SYSTEM
   // SYSTEM
   input            pha_i,
   input            pha_i,
Line 80... Line 81...
   reg [DWB-1:2]        dwb_adr_o;
   reg [DWB-1:2]        dwb_adr_o;
   reg [3:0]             dwb_sel_o;
   reg [3:0]             dwb_sel_o;
   reg                  rMSR_BE;
   reg                  rMSR_BE;
   reg                  rMSR_BIP;
   reg                  rMSR_BIP;
   reg                  rMSR_IE;
   reg                  rMSR_IE;
 
   reg                  rMSR_TXE;
   reg [31:0]            rMUL_MA;
   reg [31:0]            rMUL_MA;
   reg [31:0]            rRES_EX;
   reg [31:0]            rRES_EX;
   reg [31:0]            rRES_MA;
   reg [31:0]            rRES_MA;
   reg [3:0]             rSEL_MA;
   reg [3:0]             rSEL_MA;
   // End of automatics
   // End of automatics
 
 
   reg                  rMSR_C0,
   reg                  rMSR_C0,
                        rMSR_C1,
                        rMSR_C1,
                        rMSR_CL[0:TXE];
                        rMSR_CL[0:1];
 
 
 
 
   wire [4:0]        rRD = rRD_OF;
   wire [4:0]        rRD = rRD_OF;
   wire [31:0]       rOPA = rOPA_OF;
   wire [31:0]       rOPA = rOPA_OF;
   wire [31:0]       rOPB = rOPB_OF;
   wire [31:0]       rOPB = rOPB_OF;
   wire [5:0]        rOPC = rOPC_OF;
   wire [5:0]        rOPC = rOPC_OF;
   wire [4:0]        rRA = rRA_OF;
   wire [4:0]        rRA = rRA_OF;
   wire [15:0]       rIMM = rIMM_OF;
   wire [15:0]       rIMM = rIMM_OF;
   wire [10:0]       rALT = rIMM_OF[10:0];
   wire [10:0]       rALT = rIMM_OF[10:0];
 
 
   // --- ADD/SUB SELECTOR ----
   /*
 
    C SELECTOR
 
 
 
    Preselects the C in the OF stage to speed things up.  */
 
 
 
   // TODO: Optimise
 
 
 
   wire                 wMSR_CX, wMSR_C;
 
   assign               wMSR_CX = (pha_i) ? rMSR_C0 :
 
                                  (TXE) ? rMSR_C1 : 1'bX;
 
 
 
   assign               wMSR_C = (rOPC_IF == 6'o44) & wMSR_CX | // SRX
 
                                 (rOPC_IF[5:4] == 2'o0) & rOPC_IF[1] & wMSR_CX | // ADDC/RSUBC
 
                                 (rOPC_IF[5:4] == 2'o0) & (rOPC_IF[1:0] == 2'o1); // RSUB
 
 
 
   reg                  rMSR_C;
 
 
 
   always @(posedge clk_i)
 
     if (rst_i) begin
 
        /*AUTORESET*/
 
        // Beginning of autoreset for uninitialized flops
 
        rMSR_C <= 1'h0;
 
        // End of automatics
 
     end else if (ena_i) begin
 
        rMSR_C <= #1 wMSR_C;
 
     end
 
 
 
   /*
 
    ADD/SUB SELECTOR
 
 
 
    Current implementation is a clutz. It needs to be
 
    re-implemented. It is also in the critical path.  */
 
 
   // FIXME: Redesign
   // FIXME: Redesign
   // TODO: Refactor
 
   // TODO: Verify signed compare
   // TODO: Verify signed compare
 
 
   wire             rMSR_CX = (!pha_i) ? rMSR_C0 : (TXE) ? rMSR_C1 : 1'bX;
 
   wire             rMSR_C = (LUT) ? rMSR_CL[pha_i] : rMSR_CX;
 
 
 
   wire             wADDC, wSUBC, wRES_AC, wCMPC, wOPC;
   wire             wADDC, wSUBC, wRES_AC, wCMPC, wOPC;
   wire [31:0]       wADD, wSUB, wRES_A, wCMP, wOPX;
   wire [31:0]       wADD, wSUB, wRES_A, wCMP, wOPX;
 
 
   wire             wCMPU = (rOPA > rOPB);
   wire             wCMPU = (rOPA > rOPB);
   wire             wCMPF = (rIMM[1]) ? wCMPU :
   wire             wCMPF = (rIMM[1]) ? wCMPU :
                            ((wCMPU & ~(rOPB[31] ^ rOPA[31])) | (rOPB[31] & ~rOPA[31]));
                            ((wCMPU & ~(rOPB[31] ^ rOPA[31])) | (rOPB[31] & ~rOPA[31]));
 
 
   assign           {wCMPC,wCMP} = {wSUBC,wCMPF,wSUB[30:0]};
   assign           {wCMPC,wCMP} = {wSUBC,wCMPF,wSUB[30:0]};
   assign           wOPX = (rOPC[0] & !rOPC[5]) ? ~rOPA : rOPA ;
   assign           wOPX = (rOPC[0] & !rOPC[5]) ? ~rOPA : rOPA ;
   assign           wOPC = ((rMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & (!rOPC[5] & ~&rOPC[5:4]);
   //assign             wOPC = ((wMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & (!rOPC[5] & ~&rOPC[5:4]);
 
   assign               wOPC = rMSR_C;
 
 
   assign           {wSUBC,wSUB} = {wADDC,wADD};
   assign           {wSUBC,wSUB} = {wADDC,wADD};
   assign           {wADDC,wADD} = (rOPB + wOPX) + wOPC;
   assign           {wADDC,wADD} = (rOPB + wOPX) + wOPC;
 
 
   reg              rRES_ADDC;
   reg              rRES_ADDC;
Line 131... Line 162...
       4'h2, 4'h6, 4'h7: {rRES_ADDC,rRES_ADD} <= #1 {~wSUBC,wSUB}; // SUB
       4'h2, 4'h6, 4'h7: {rRES_ADDC,rRES_ADD} <= #1 {~wSUBC,wSUB}; // SUB
       4'h3: {rRES_ADDC,rRES_ADD} <= #1 {~wCMPC,wCMP}; // CMP
       4'h3: {rRES_ADDC,rRES_ADD} <= #1 {~wCMPC,wCMP}; // CMP
       default: {rRES_ADDC,rRES_ADD} <= #1 {wADDC,wADD};
       default: {rRES_ADDC,rRES_ADD} <= #1 {wADDC,wADD};
     endcase // case ({rOPC[3],rOPC[0],rIMM[0]})
     endcase // case ({rOPC[3],rOPC[0],rIMM[0]})
 
 
   // --- LOGIC SELECTOR --------------------------------------
   /*
 
    LOGIC
 
 
 
    This can be combined with the shifter below.
 
    */
 
 
   reg [31:0]        rRES_LOG;
   reg [31:0]        rRES_LOG;
   always @(/*AUTOSENSE*/rOPA or rOPB or rOPC)
   always @(/*AUTOSENSE*/rOPA or rOPB or rOPC)
     case (rOPC[1:0])
     case (rOPC[2:0])
       2'o0: rRES_LOG <= #1 rOPA | rOPB;
       2'o0: rRES_LOG <= #1 rOPA | rOPB;
       2'o1: rRES_LOG <= #1 rOPA & rOPB;
       2'o1: rRES_LOG <= #1 rOPA & rOPB;
       2'o2: rRES_LOG <= #1 rOPA ^ rOPB;
       2'o2: rRES_LOG <= #1 rOPA ^ rOPB;
       2'o3: rRES_LOG <= #1 rOPA & ~rOPB;
       2'o3: rRES_LOG <= #1 rOPA & ~rOPB;
     endcase // case (rOPC[1:0])
     endcase // case (rOPC[2:0])
 
 
 
   /*
 
    SIMPLE SHIFTER
 
 
   // --- SHIFTER SELECTOR ------------------------------------
    Implemented as wiring and registers.
 
    */
 
 
   reg [31:0]        rRES_SFT;
   reg [31:0]        rRES_SFT;
   reg              rRES_SFTC;
   reg              rRES_SFTC;
 
 
   always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
   always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
     case (rIMM[6:5])
     case (rIMM[6:5])
       2'o0: {rRES_SFT, rRES_SFTC} <= #1 {rOPA[31],rOPA[31:0]};
       2'o0: rRES_SFT <= {rOPA[31],rOPA[31:1]}; // SRA
       2'o1: {rRES_SFT, rRES_SFTC} <= #1 {rMSR_C,rOPA[31:0]};
       2'o1: rRES_SFT <= {rMSR_C,rOPA[31:1]}; // SRC
       2'o2: {rRES_SFT, rRES_SFTC} <= #1 {1'b0,rOPA[31:0]};
       2'o2: rRES_SFT <= {1'b0,rOPA[31:1]}; // SRL
       2'o3: {rRES_SFT, rRES_SFTC} <= #1 (rIMM[0]) ? { {(16){rOPA[15]}}, rOPA[15:0], rMSR_C} :
       2'o3: rRES_SFT <= (rIMM[0]) ?
                                      { {(24){rOPA[7]}}, rOPA[7:0], rMSR_C};
                         {{(16){rOPA[15]}}, rOPA[15:0]} : // SEXT16
 
                         {{(24){rOPA[7]}}, rOPA[7:0]}; // SEXT8
     endcase // case (rIMM[6:5])
     endcase // case (rIMM[6:5])
 
 
   // --- MOVE SELECTOR ---------------------------------------
   always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
 
     rRES_SFTC <= (&rIMM[6:5]) ? rMSR_C : rOPA[0];
 
 
 
   /*
 
    MOVE FROM SPECIAL
 
 
 
    MSR bits
 
    31 - CC (carry copy)
 
    30 - PHA (current phase)
 
    29 - TXE (enable second thread)
 
 
 
     3 - BIP (break in progress)
 
     2 - C (carry flag)
 
     1 - IE (interrupt enable)
 
     0 - BE (bus-lock enable)
 
    */
 
 
   wire             wTXE = (TXE) ? 2'd1 : 2'd0;
   wire                 wTXE = (TXE) ? 1'b1 : 1'b0;
   wire [31:0]       wMSR = {rMSR_C, // MSR_CC                       
   wire [31:0]       wMSR = {rMSR_C, // MSR_CC                       
                            pha_i, // Current phase
                            pha_i, // Current phase
                            !pha_i, // Current phase
                                rMSR_TXE, // Thread Execution Enabled
                            wTXE, // Thread Execution Enabled
                                wTXE,
                            4'h0, // Reserved
                            4'h0, // Reserved
                            8'hAE, // Vendor
                            8'hAE, // Vendor
                            8'h32, // Version
                            8'h32, // Version
                            4'h0, // Reserved
                            4'h0, // Reserved
                            rMSR_BIP, // MSR_BIP
                            rMSR_BIP, // MSR_BIP
Line 176... Line 230...
                            rMSR_BE}; // MSR_BE
                            rMSR_BE}; // MSR_BE
 
 
   wire             fMFSR = (rOPC == 6'o45) & !rIMM[14] & rIMM[0];
   wire             fMFSR = (rOPC == 6'o45) & !rIMM[14] & rIMM[0];
   wire             fMFPC = (rOPC == 6'o45) & !rIMM[14] & !rIMM[0];
   wire             fMFPC = (rOPC == 6'o45) & !rIMM[14] & !rIMM[0];
   reg [31:0]        rRES_MOV;
   reg [31:0]        rRES_MOV;
   always @(/*AUTOSENSE*/fMFPC or fMFSR or rOPA or rOPB or rPC_OF
   always @(/*AUTOSENSE*/fMFSR or rOPA or rOPB or rRA or wMSR)
            or rRA or wMSR)
 
     rRES_MOV <= (fMFSR) ? wMSR :
     rRES_MOV <= (fMFSR) ? wMSR :
                 (fMFPC) ? {rPC_OF, 2'd0} :
                 //(fMFPC) ? rOPA :
                 (rRA[3]) ? rOPB :
                 (rRA[3]) ? rOPB :
                 rOPA;
                 rOPA;
 
 
   // --- MULTIPLIER ------------------------------------------
   /*
   // 2-stage
    MULTIPLIER
 
 
 
    Implemented as a 2-stage multiplier in order to increase clock
 
    speed. */
 
 
   reg [31:0]        rRES_MUL;
   reg [31:0]        rRES_MUL;
   always @(posedge clk_i) begin
   always @(posedge clk_i) begin
      rMUL_MA <= (MUL) ? rRES_MUL : 32'hX;
      rMUL_MA <= (MUL) ? rRES_MUL : 32'hX;
      rRES_MUL <= (rOPA * rOPB);
      rRES_MUL <= (MUL) ? (rOPA * rOPB) : 32'hX;
   end
   end
 
 
   // --- BARREL SHIFTER --------------------------------------
   /*
   // 1-stage
    BARREL SHIFTER
 
 
 
    This can be potentially made 2-stage to increase clock
 
    speed. Doesn't seem necessary at the moment as the critical path
 
    runs through the adder. */
 
 
   reg [31:0]     rRES_BSF;
   reg [31:0]     rRES_BSF;
   reg [31:0]     xBSRL, xBSRA, xBSLL;
   reg [31:0]     xBSRL, xBSRA, xBSLL;
 
 
   // Infer a logical left barrel shifter.   
   /* logical left barrel shifter */
   always @(/*AUTOSENSE*/rOPA or rOPB)
   always @(/*AUTOSENSE*/rOPA or rOPB)
     xBSLL <= rOPA << rOPB[4:0];
     xBSLL <= rOPA << rOPB[4:0];
 
 
   // Infer a logical right barrel shifter.
   /* logical right barrel shifter */
   always @(/*AUTOSENSE*/rOPA or rOPB)
   always @(/*AUTOSENSE*/rOPA or rOPB)
     xBSRL <= rOPA >> rOPB[4:0];
     xBSRL <= rOPA >> rOPB[4:0];
 
 
   // Infer a arithmetic right barrel shifter.
   /* arithmetic right barrel shifter */
   always @(/*AUTOSENSE*/rOPA or rOPB)
   always @(/*AUTOSENSE*/rOPA or rOPB)
     case (rOPB[4:0])
     case (rOPB[4:0])
       5'd00: xBSRA <= rOPA;
       5'd00: xBSRA <= rOPA;
       5'd01: xBSRA <= {{(1){rOPA[31]}}, rOPA[31:1]};
       5'd01: xBSRA <= {{(1){rOPA[31]}}, rOPA[31:1]};
       5'd02: xBSRA <= {{(2){rOPA[31]}}, rOPA[31:2]};
       5'd02: xBSRA <= {{(2){rOPA[31]}}, rOPA[31:2]};
Line 243... Line 303...
       5'd29: xBSRA <= {{(29){rOPA[31]}}, rOPA[31:29]};
       5'd29: xBSRA <= {{(29){rOPA[31]}}, rOPA[31:29]};
       5'd30: xBSRA <= {{(30){rOPA[31]}}, rOPA[31:30]};
       5'd30: xBSRA <= {{(30){rOPA[31]}}, rOPA[31:30]};
       5'd31: xBSRA <= {{(31){rOPA[31]}}, rOPA[31]};
       5'd31: xBSRA <= {{(31){rOPA[31]}}, rOPA[31]};
     endcase // case (rOPB[4:0])
     endcase // case (rOPB[4:0])
 
 
 
   /* select the shift result (2nd stage) */
   always @(/*AUTOSENSE*/rALT or xBSLL or xBSRA or xBSRL)
   always @(/*AUTOSENSE*/rALT or xBSLL or xBSRA or xBSRL)
     case (rALT[10:9])
     case (rALT[10:9])
       2'd0: rRES_BSF <= xBSRL;
       2'd0: rRES_BSF <= xBSRL;
       2'd1: rRES_BSF <= xBSRA;
       2'd1: rRES_BSF <= xBSRA;
       2'd2: rRES_BSF <= xBSLL;
       2'd2: rRES_BSF <= xBSLL;
       default: rRES_BSF <= 32'hX;
       default: rRES_BSF <= 32'hX;
     endcase // case (rALT[10:9])
     endcase // case (rALT[10:9])
 
 
 
 
   // --- MSR REGISTER -----------------
   /*
 
    MSR REGISTER
 
 
 
    Move data to the MSR or change due to break/returns. */
 
 
   reg           xMSR_C;
   reg           xMSR_C;
 
 
   // C
   // C
   wire            fMTS = (rOPC == 6'o45) & rIMM[14];
   wire            fMTS = (rOPC == 6'o45) & rIMM[14];
   wire            fADDC = ({rOPC[5:4], rOPC[2]} == 3'o0);
   wire            fADDC = ({rOPC[5:4], rOPC[2]} == 3'o0);
Line 269... Line 334...
       3'o2: xMSR_C <= rRES_SFTC; // SHIFT
       3'o2: xMSR_C <= rRES_SFTC; // SHIFT
       3'o3: xMSR_C <= (fMTS) ? rOPA[2] : rMSR_C;
       3'o3: xMSR_C <= (fMTS) ? rOPA[2] : rMSR_C;
       3'o4: xMSR_C <= rMSR_C;
       3'o4: xMSR_C <= rMSR_C;
       3'o5: xMSR_C <= rMSR_C;
       3'o5: xMSR_C <= rMSR_C;
       default: xMSR_C <= 1'hX;
       default: xMSR_C <= 1'hX;
     endcase
     endcase // case (rALU_OF)
 
 
   always @(posedge clk_i)
   always @(posedge clk_i)
     if (rst_i) begin
     if (rst_i) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        rMSR_C0 <= 1'h0;
        rMSR_C0 <= 1'h0;
        rMSR_C1 <= 1'h0;
        rMSR_C1 <= 1'h0;
        // End of automatics
        // End of automatics
     end else if (ena_i) begin
     end else begin
        if (pha_i)
        if (pha_i & ena_i & rMSR_TXE)
          rMSR_C1 <= #1 xMSR_C;
          rMSR_C1 <= #1 xMSR_C;
        else
 
          rMSR_C0 <= #1 xMSR_C;
 
     end
 
 
 
   always @(posedge clk_i)
        if (!pha_i & ena_i)
     if (ena_i)
          rMSR_C0 <= #1 xMSR_C;
       rMSR_CL[pha_i] <= xMSR_C;
     end // else: !if(rst_i)
 
 
   // IE/BIP/BE
   // IE/BIP/BE
   wire             fRTID = (rOPC == 6'o55) & rRD[0];
   wire             fRTID = (rOPC == 6'o55) & rRD[0];
   wire             fRTBD = (rOPC == 6'o55) & rRD[1];
   wire             fRTBD = (rOPC == 6'o55) & rRD[1];
   wire             fBRK = ((rOPC == 6'o56) | (rOPC == 6'o66)) & (rRA == 5'hC);
   wire             fBRK = ((rOPC == 6'o56) | (rOPC == 6'o66)) & (rRA == 5'hC);
Line 302... Line 364...
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        rMSR_BE <= 1'h0;
        rMSR_BE <= 1'h0;
        rMSR_BIP <= 1'h0;
        rMSR_BIP <= 1'h0;
        rMSR_IE <= 1'h0;
        rMSR_IE <= 1'h0;
 
        rMSR_TXE <= 1'h0;
        // End of automatics
        // End of automatics
     end else if (ena_i) begin
     end else if (ena_i) begin
 
 
 
        // Interrupt enable (compatible)
        rMSR_IE <= #1
        rMSR_IE <= #1
                   (fINT) ? 1'b0 :
                   (fINT) ? 1'b0 :
                   (fRTID) ? 1'b1 :
                   (fRTID) ? 1'b1 :
                   (fMTS) ? rOPA[1] :
                   (fMTS) ? rOPA[1] :
                   rMSR_IE;
                   rMSR_IE;
 
 
 
        // Break in progress (compatible)
        rMSR_BIP <= #1
        rMSR_BIP <= #1
                    (fBRK) ? 1'b1 :
                    (fBRK) ? 1'b1 :
                    (fRTBD) ? 1'b0 :
                    (fRTBD) ? 1'b0 :
                    (fMTS) ? rOPA[3] :
                    (fMTS) ? rOPA[3] :
                    rMSR_BIP;
                    rMSR_BIP;
 
 
 
        // Forcibly assert dwb_cyc_o signal     
        rMSR_BE <= #1
        rMSR_BE <= #1
                   (fMTS) ? rOPA[0] : rMSR_BE;
                   (fMTS) ? rOPA[0] : rMSR_BE;
     end
 
 
 
 
        // Enable the thread extension
 
        rMSR_TXE <= #1
 
                    (fMTS) ? rOPA[28] & TXE : rMSR_TXE;
 
 
 
     end // if (ena_i)
 
 
   // --- RESULT SELECTOR -------------------------------------------
   /*
   // Selects results from functional units. 
    RESULTS
 
    */
 
 
   // RESULT   
   // RESULT   
   always @(posedge clk_i)
   always @(posedge clk_i)
     if (rst_i) begin
     if (rst_i) begin
        /*AUTORESET*/
        /*AUTORESET*/
Line 346... Line 417...
          3'o5: rRES_EX <= #1 (BSF) ? rRES_BSF : 32'hX;
          3'o5: rRES_EX <= #1 (BSF) ? rRES_BSF : 32'hX;
          default: rRES_EX <= #1 32'hX;
          default: rRES_EX <= #1 32'hX;
        endcase // case (rALU_OF)
        endcase // case (rALU_OF)
     end // if (ena_i)
     end // if (ena_i)
 
 
   // --- DATA/FSL WISHBONE -----
   /*
 
    DATA/FSL WISHBONE
 
 
 
    Asserts the data address as calculated by the adder and the
 
    appropriate byte select lanes depending on the byte offset of the
 
    address. It does not check for mis-aligned addresses.  */
 
 
 
   // TODO: Check for mis-alignment
 
 
   always @(posedge clk_i)
   always @(posedge clk_i)
     if (rst_i) begin
     if (rst_i) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
Line 359... Line 437...
        cwb_tga_o <= 2'h0;
        cwb_tga_o <= 2'h0;
        dwb_adr_o <= {(1+(DWB-1)-(2)){1'b0}};
        dwb_adr_o <= {(1+(DWB-1)-(2)){1'b0}};
        dwb_sel_o <= 4'h0;
        dwb_sel_o <= 4'h0;
        rSEL_MA <= 4'h0;
        rSEL_MA <= 4'h0;
        // End of automatics
        // End of automatics
     end else if (ena_i) begin
     end else if (ena_i) begin // if (rst_i)
        rSEL_MA <= #1 dwb_sel_o;
        rSEL_MA <= #1 dwb_sel_o;
 
 
        dwb_adr_o <= #1 wADD[DWB-1:2];
        dwb_adr_o <= #1 wADD[DWB-1:2];
        case (rOPC[1:0])
        case (rOPC[1:0])
          2'o0: case (wADD[1:0]) // 8'bit
          2'o0: case (wADD[1:0]) // 8'bit
Line 388... Line 466...
   initial begin
   initial begin
      for (r=0; r<TXE; r=r+1) begin
      for (r=0; r<TXE; r=r+1) begin
         rMSR_CL[r] <= $random;
         rMSR_CL[r] <= $random;
      end
      end
   end
   end
 
 
   // synopsys translate_on
   // synopsys translate_on
 
 
endmodule // aeMB2_aslu
endmodule // aeMB2_aslu
 
 
/* $Log: not supported by cvs2svn $ */
 
 No newline at end of file
 No newline at end of file
 
/* $Log: not supported by cvs2svn $
 
/* Revision 1.1  2007/12/11 00:43:17  sybreon
 
/* initial import
 
/* */
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.