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

Subversion Repositories aemb

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

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

Rev 88 Rev 90
Line 1... Line 1...
/* $Id: aeMB2_aslu.v,v 1.6 2007-12-16 20:38:06 sybreon Exp $
/* $Id: aeMB2_aslu.v,v 1.7 2007-12-17 12:53:27 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 99... Line 99...
   // End of automatics
   // End of automatics
 
 
   reg                  rMSR_C0,
   reg                  rMSR_C0,
                        rMSR_C1,
                        rMSR_C1,
                        rMSR_C,
                        rMSR_C,
 
                        rMSR_CC,
                        rMSR_CL[0:1];
                        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;
Line 162... Line 163...
 
 
   // TODO: Optimise
   // TODO: Optimise
 
 
   wire                 wMSR_CX, wMSR_C;
   wire                 wMSR_CX, wMSR_C;
   assign               wMSR_CX = (pha_i) ? rMSR_C0 : rMSR_C1;
   assign               wMSR_CX = (pha_i) ? rMSR_C0 : rMSR_C1;
 
 
   assign               wMSR_C = (rOPC_IF == 6'o44) & wMSR_CX | // SRX
   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] & wMSR_CX | // ADDC/RSUBC
                                 (rOPC_IF[5:4] == 2'o0) & (rOPC_IF[1:0] == 2'o1); // RSUB
                                 (rOPC_IF[5:4] == 2'o0) & (rOPC_IF[1:0] == 2'o1); // RSUB
 
   /*
 
   assign               wMSR_C = ((rOPC_IF[5:4] == 2'o0) & (rOPC_OF[1:0] == 2'o1)) ? 1'b1 : // RSUB = 1
 
                                 ((rOPC_IF[5:4] == 2'o0) & (rOPC_OF[1:0] == 2'o0)) ? 1'b0 : // ADD = 0
 
                                 wMSR_CX;
 
   */
 
 
   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_C <= 1'h0;
        rMSR_C <= 1'h0;
 
        rMSR_CC <= 1'h0;
        // End of automatics
        // End of automatics
     end else if (ena_i) begin
     end else if (ena_i) begin
        rMSR_C <= #1 wMSR_C;
        rMSR_C <= #1 wMSR_CX;
 
        rMSR_CC <= #1 wMSR_C;
     end
     end
 
 
   /*
   /*
    ADD/SUB SELECTOR
    ADD/SUB SELECTOR
 
 
Line 194... Line 203...
   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 = ((wMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & (!rOPC[5] & ~&rOPC[5:4]);
   //assign             wOPC = ((rMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & (!rOPC[5] & ~&rOPC[5:4]);
   assign               wOPC = rMSR_C;
   assign               wOPC = rMSR_CC;
 
 
   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;
   reg [31:0]            rRES_ADD;
   reg [31:0]            rRES_ADD;
   always @(rIMM or rOPC or wADD or wADDC or wCMP
   always @(rIMM or rOPC or wADD or wADDC or wCMP
            or wCMPC or wSUB or wSUBC)
            or wCMPC or wSUB or wSUBC)
     case ({rOPC[3],rOPC[0],rIMM[0]})
     case ({rOPC[3],rOPC[0],rIMM[0]})
       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
    LOGIC
Line 426... Line 435...
            or rRES_ADDC or rRES_SFTC)
            or rRES_ADDC or rRES_SFTC)
     case (rALU_OF[1:0])
     case (rALU_OF[1:0])
     //case (rOPC[5:4])
     //case (rOPC[5:4])
       3'o0: xMSR_C <= (fADDC) ? rRES_ADDC : rMSR_C; // ADD/SUB
       3'o0: xMSR_C <= (fADDC) ? rRES_ADDC : rMSR_C; // ADD/SUB
       3'o2: case (rOPC[2:0])
       3'o2: case (rOPC[2:0])
               3'o5: xMSR_C <= (rIMM[14]) ? rOPC[2] : rMSR_C; // MTS
               3'o5: xMSR_C <= (rIMM[14]) ? rOPA[2] : rMSR_C; // MTS
               3'o4: xMSR_C <= (&rIMM[6:5]) ? rMSR_C : rRES_SFTC; // SRX
               3'o4: xMSR_C <= (&rIMM[6:5]) ? rMSR_C : rRES_SFTC; // SRX
               default: xMSR_C <= rMSR_C;
               default: xMSR_C <= rMSR_C;
             endcase // case (rOPC[2:0])
             endcase // case (rOPC[2:0])
       default: xMSR_C <= rMSR_C;
       default: xMSR_C <= rMSR_C;
     endcase // case (rOPC[5:4])
     endcase // case (rOPC[5:4])
Line 552... Line 561...
     end // if (ena_i)
     end // if (ena_i)
 
 
endmodule // aeMB2_aslu
endmodule // aeMB2_aslu
 
 
/* $Log: not supported by cvs2svn $
/* $Log: not supported by cvs2svn $
 
/* Revision 1.6  2007/12/16 20:38:06  sybreon
 
/* Minor optimisations.
 
/*
/* Revision 1.5  2007/12/16 03:25:37  sybreon
/* Revision 1.5  2007/12/16 03:25:37  sybreon
/* Some optimisations.
/* Some optimisations.
/*
/*
/* Revision 1.4  2007/12/13 21:25:41  sybreon
/* Revision 1.4  2007/12/13 21:25:41  sybreon
/* Further optimisations (speed + size).
/* Further optimisations (speed + size).

powered by: WebSVN 2.1.0

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