commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r5140 - in gnuradio/branches/developers/matt/u2f/openc


From: matt
Subject: [Commit-gnuradio] r5140 - in gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog: . CVS
Date: Thu, 26 Apr 2007 19:24:56 -0600 (MDT)

Author: matt
Date: 2007-04-26 19:24:56 -0600 (Thu, 26 Apr 2007)
New Revision: 5140

Added:
   
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_core_BE.v
Modified:
   gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/CVS/Entries
   gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_aslu.v
   
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_control.v
   gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_core.v
   
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_decode.v
   gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_fetch.v
   
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_regfile.v
Log:
updated version from OpenCores


Modified: 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/CVS/Entries
===================================================================
--- 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/CVS/Entries    
    2007-04-27 01:13:38 UTC (rev 5139)
+++ 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/CVS/Entries    
    2007-04-27 01:24:56 UTC (rev 5140)
@@ -1,9 +1,9 @@
-/aeMB_control.v/1.3/Wed Apr 11 06:30:44 2007//
-/aeMB_fetch.v/1.3/Wed Apr 11 06:30:44 2007//
 /aeMB_ucore.v/1.1/Fri Apr 13 13:02:34 2007//
 /aeMB_wbbus.v/1.1/Fri Apr 13 13:02:34 2007//
-/aeMB_aslu.v/1.5/Wed Apr 25 19:45:17 2007//
-/aeMB_core.v/1.4/Wed Apr 25 19:45:17 2007//
-/aeMB_decode.v/1.5/Wed Apr 25 19:45:17 2007//
-/aeMB_regfile.v/1.10/Thu Apr 26 07:28:30 2007//
+/aeMB_aslu.v/1.7/Fri Apr 27 01:14:55 2007//
+/aeMB_control.v/1.4/Fri Apr 27 01:14:55 2007//
+/aeMB_core.v/1.5/Fri Apr 27 01:14:55 2007//
+/aeMB_decode.v/1.6/Fri Apr 27 01:14:55 2007//
+/aeMB_fetch.v/1.4/Fri Apr 27 01:14:55 2007//
+/aeMB_regfile.v/1.12/Fri Apr 27 01:14:56 2007//
 D

Modified: 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_aslu.v
===================================================================
--- 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_aslu.v    
    2007-04-27 01:13:38 UTC (rev 5139)
+++ 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_aslu.v    
    2007-04-27 01:24:56 UTC (rev 5140)
@@ -1,28 +1,37 @@
 /*
- * $Id: aeMB_aslu.v,v 1.5 2007/04/25 22:15:04 sybreon Exp $
+ * $Id: aeMB_aslu.v,v 1.7 2007/04/27 00:23:55 sybreon Exp $
  *
  * AEMB Arithmetic Shift Logic Unit 
- * Copyright (C) 2006 Shawn Tan Ser Ngiap <address@hidden>
+ * Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <address@hidden>
  *  
- * This library is free software; you can redistribute it and/or modify it 
- * under the terms of the GNU Lesser General Public License as published by 
- * the Free Software Foundation; either version 2.1 of the License, 
- * or (at your option) any later version.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
  * 
- * This library is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
- * License for more details.
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
  * 
- * You should have received a copy of the GNU Lesser General Public License 
- * along with this library; if not, write to the Free Software Foundation, 
Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
  *
  * DESCRIPTION
- * Arithmetic, shift and logic execution unit
+ * Arithmetic, shift and logic execution unit. It also performs the
+ * necessary calculations for branch and load/store targets.
  * 
  * HISTORY
  * $Log: aeMB_aslu.v,v $
+ * Revision 1.7  2007/04/27 00:23:55  sybreon
+ * Added code documentation.
+ * Improved size & speed of rtl/verilog/aeMB_aslu.v
+ *
+ * Revision 1.6  2007/04/26 14:29:53  sybreon
+ * Made minor performance optimisations.
+ *
  * Revision 1.5  2007/04/25 22:15:04  sybreon
  * Added support for 8-bit and 16-bit data types.
  *
@@ -41,7 +50,6 @@
  *
  */
 
-// address@hidden
 module aeMB_aslu (/*AUTOARG*/
    // Outputs
    dwb_adr_o, dwb_sel_o, rRESULT, rDWBSEL,
@@ -70,89 +78,76 @@
    input [1:0]              rMXLDST;   
    
    input            nclk, nrst, drun, nrun;   
-   
+
    reg [31:0]      rRESULT, xRESULT;
    reg                     rMSR_C, xMSR_C;
 
-   // Operands
-   wire [31:0]             wOPA, wOPB;   
-   
-   // DWB I/F
-   reg [31:0]      rDWBADR;
-   wire [31:0]             wDWBADR;
-   
-   assign          dwb_adr_o = {rDWBADR[DSIZ-1:2],2'b00};
-   assign          wDWBADR = (wOPA + wOPB);   
+   /**
+    Operand Selection
+    -----------------
+    Selects the A and B operands depending on the source. All
+    forwarding information is controlled by the decode unit.
+    */
 
-   reg [3:0]       rDWBSEL, xDWBSEL;
-
-   always @(/*AUTOSENSE*/rOPC or wDWBADR)
-     case (wDWBADR[1:0])
-       2'o0: case (rOPC[1:0])
-              2'o0: xDWBSEL <= 4'h8;
-              2'o1: xDWBSEL <= 4'hC;
-              default: xDWBSEL <= 4'hF;
-            endcase // case (rOPC[1:0])
-       2'o1: case (rOPC[1:0])
-              2'o0: xDWBSEL <= 4'h4;
-              default: xDWBSEL <= 4'h0;
-            endcase // case (rOPC[1:0])
-       2'o2: case (rOPC[1:0])
-              2'o0: xDWBSEL <= 4'h2;
-              2'o1: xDWBSEL <= 4'h3;
-              default: xDWBSEL <= 4'h0;
-            endcase // case (rOPC[1:0])
-       2'o3: case (rOPC[1:0])
-              2'o0: xDWBSEL <= 4'h1;
-              default: xDWBSEL <= 4'h0;
-            endcase // case (rOPC[1:0])
-     endcase // case (wDWBADR[1:0])
+   wire [31:0]             wOPA, wOPB;
    
-   
-   // Endian correction
-   wire [31:0]             wDWBDAT;
-   assign          dwb_sel_o = {rDWBSEL[0],rDWBSEL[1],rDWBSEL[2],rDWBSEL[3]};  
 
-   assign          wDWBDAT = sDWBDAT;
-   
-   // Source and Target Select
    assign          wOPA =
-                   (rMXSRC == 2'b11) ? wDWBDAT :
+                   (rMXSRC == 2'b11) ? sDWBDAT :
                    (rMXSRC == 2'b10) ? rRESULT :
                    (rMXSRC == 2'b01) ? rPC : 
                    rREGA;
    assign          wOPB =
-                   (rMXTGT == 2'b11) ? wDWBDAT :
+                   (rMXTGT == 2'b11) ? sDWBDAT :
                    (rMXTGT == 2'b10) ? rRESULT :
                    (rMXTGT == 2'b01) ? rSIMM :
                    rREGB;
    
-   // ARITHMETIC
-   //wire          wADDC_ = (rOPC[1] & (rMXLDST == 2'o0)) ? rMSR_C : 1'b0;
-   wire            wADDC_ = (rOPC[1]) ? rMSR_C : 1'b0;
-   wire            wSUBC_ = (rOPC[1]) ? rMSR_C : 1'b1;
-   wire            wADDC, wSUBC, wRES_AC,wCMPC;
-   wire [31:0]             wADD,wSUB,wRES_A,wCMP;
+   /**
+    Simple Arithmetic
+    -----------------
+    Performs addition and subtraction using a single 32-bit adder with
+    carry in and out. This is done in parallel with other
+    operations. The adder is also used to calculate branch target
+    addresses as well as load/store memory addresses.
+    
+    TODO: Verify signed compare
+    */
    
-   // TODO: verify signed compare
-   wire            wCMPU = (wOPA > wOPB);   
+   wire            wADDC, wSUBC, wRES_AC, wCMPC, wOPC;
+   wire [31:0]             wADD, wSUB, wRES_A, wCMP, wOPX;
+   
+   wire            wCMP0 = (wOPA[7:0] > wOPB[7:0]);
+   wire            wCMP1 = (wOPA[15:8] > wOPB[15:8]);
+   wire            wCMP2 = (wOPA[23:16] > wOPB[23:16]);
+   wire            wCMP3 = (wOPA[31:24] > wOPB[31:24]);
+   wire            wCMPU = (wOPA > wOPB);         
    wire            wCMPF = (rIMM[1]) ? wCMPU :
-                           ((wCMPU & ~(wOPB[31] ^ wOPA[31])) | (wOPB[31] & 
~wOPA[31]));   
+                           ((wCMPU & ~(wOPB[31] ^ wOPA[31])) | (wOPB[31] & 
~wOPA[31]));
+   
    assign          {wCMPC,wCMP} = {wSUBC,wCMPF,wSUB[30:0]};  
-   assign          {wADDC,wADD} = (wOPB + wOPA) + wADDC_;
-   assign          {wSUBC,wSUB} = (wOPB + ~wOPA) + wSUBC_;      
+   assign          wOPX = (rOPC[0] & !rOPC[5]) ? ~wOPA : wOPA ;
+   assign          wOPC = ((rMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & 
(!rOPC[5] & !rMXLDST[1]);
    
+   assign          {wSUBC,wSUB} = {wADDC,wADD}; 
+   assign          {wADDC,wADD} = (wOPB + wOPX) + wOPC; 
+      
    reg                     rRES_AC;
    reg [31:0]      rRES_A;
    always @(/*AUTOSENSE*/rIMM or rOPC or wADD or wADDC or wCMP
            or wCMPC or wSUB or wSUBC)
-     //{rRES_AC,rRES_A} <= #1 (rOPC[0] & ~rOPC[5]) ? {~wSUBC,wSUB} : 
{wADDC,wADD};   
-     case ({rOPC[5],rOPC[3],rOPC[0],rIMM[0]})
+     case ({rOPC[3],rOPC[0],rIMM[0]})
        4'h2, 4'h6, 4'h7: {rRES_AC,rRES_A} <= #1 {~wSUBC,wSUB}; // SUB
        4'h3: {rRES_AC,rRES_A} <= #1 {~wCMPC,wCMP}; // CMP
        default: {rRES_AC,rRES_A} <= #1 {wADDC,wADD};       
-     endcase // case ({rOPC[5],rOPC[3],rOPC[0],rIMM[0]})
+     endcase // case ({rOPC[3],rOPC[0],rIMM[0]})
    
-   // LOGIC
+   /**
+    Logic
+    -----
+    Performs all the simple logic functions in parallel with other
+    operations.
+    */
+   
    wire [31:0]             wOR = wOPA | wOPB;
    wire [31:0]             wAND = wOPA & wOPB;
    wire [31:0]             wXOR = wOPA ^ wOPB;
@@ -167,7 +162,13 @@
        2'o3: rRES_L <= #1 wANDN;       
      endcase // case (rOPC[1:0])
    
-   // SHIFT
+   /**
+    Shifter
+    -------
+    Performs shift instructions as well as sign extension. This is
+    done in parallel with the other operations.
+    */
+   
    wire            wSRAC, wSRCC, wSRLC, wRES_SC;
    wire [31:0]             wSRA,wSRC, wSRL, wSEXT8, wSEXT16, wRES_S;
    assign          {wSRAC,wSRA} = {wOPA[0],wOPA[0],wOPA[31:1]};
@@ -188,40 +189,80 @@
        2'o3: {rRES_SC,rRES_S} <= #1 (rIMM[0]) ? {rMSR_C,wSEXT16} : 
{rMSR_C,wSEXT8};       
      endcase // case (rIMM[6:5])
 
-   // MOVE
+   /**
+    Mover
+    -----
+    Moves an operand from source to destination for move instructions
+    done in parallel with other operations.
+    */
+   
    reg [31:0]      rRES_M;
    always @(/*AUTOSENSE*/rRA or wOPA or wOPB)
      rRES_M <= #1 (rRA[3]) ? wOPB : wOPA;   
+
+   /**
+    Data WISHBONE Bus
+    -----------------
+    Asserts the appropriate byte select signals depending on the size
+    of the operation and the address location. For faster operation,
+    the result of the adder is used as the end selector.
+    
+    FIXME: It does not check for invalid memory locations.
+    FIXME: Endian correction!
+    */
+
+   reg [3:0]       rDWBSEL, xDWBSEL;
+   assign          dwb_adr_o = {rRESULT[DSIZ-1:2],2'b00};
+   assign          dwb_sel_o = {rDWBSEL[0],rDWBSEL[1],rDWBSEL[2],rDWBSEL[3]};
+
+   always @(/*AUTOSENSE*/rOPC or wADD)
+     case (wADD[1:0])
+       2'o0: case (rOPC[1:0])
+              2'o0: xDWBSEL <= 4'h8;
+              2'o1: xDWBSEL <= 4'hC;
+              default: xDWBSEL <= 4'hF;
+            endcase // case (rOPC[1:0])
+       2'o1: xDWBSEL <= 4'h4;
+       2'o2: xDWBSEL <= (rOPC[0]) ? 4'h3 : 4'h2;       
+       2'o3: xDWBSEL <= 4'h1;
+     endcase // case (wADD[1:0])
    
-   // RESULT + C
-   always @(/*AUTOSENSE*/drun or rMSR_C or rMXALU or rOPC or rRES_A
-           or rRES_AC or rRES_L or rRES_M or rRES_S or rRES_SC)
-     if (drun) begin
-       case (rMXALU)
-         2'o0: xRESULT <= #1 rRES_A;
-         2'o1: xRESULT <= #1 rRES_L;
-         2'o2: xRESULT <= #1 rRES_S;
-         2'o3: xRESULT <= #1 rRES_M;     
-       endcase // case (rMXALU)
-       case (rMXALU)
-         2'o0: xMSR_C <= #1 (rOPC[2]) ? rMSR_C : rRES_AC;
-         2'o2: xMSR_C <= #1 rRES_SC;
-         default: xMSR_C <= #1 rMSR_C;
-       endcase // case (rMXALU)
-     end else begin // if (drun)
-       /*AUTORESET*/
-       // Beginning of autoreset for uninitialized flops
-       xMSR_C <= 1'h0;
-       xRESULT <= 32'h0;
-       // End of automatics
-     end // else: !if(drun)
-
+   /**
+    RESULT + C
+    ----------
+    The RESULT and MSR[C] are collected at the end of the pipeline,
+    depending on the operation selected. This was done in order to
+    allow the operations to proceed in parallel for faster speed.
+    
+    FIXME: rMSR[C] might need to be blocked (drun) during a branch.
+    TODO: MTS/MFS instruction
+    */
+   
+   always @(/*AUTOSENSE*/rMXALU or rRES_A or rRES_L or rRES_M
+           or rRES_S) begin
+      case (rMXALU)
+       2'o0: xRESULT <= #1 rRES_A;
+       2'o1: xRESULT <= #1 rRES_L;
+       2'o2: xRESULT <= #1 rRES_S;
+       2'o3: xRESULT <= #1 rRES_M;       
+      endcase // case (rMXALU)
+   end
+   
+   always @(/*AUTOSENSE*/rMSR_C or rMXALU or rOPC or rRES_AC
+           or rRES_SC) begin
+      case (rMXALU)
+       2'o0: xMSR_C <= #1 (rOPC[2]) ? rMSR_C : rRES_AC;
+       2'o2: xMSR_C <= #1 rRES_SC;
+       default: xMSR_C <= #1 rMSR_C;
+      endcase // case (rMXALU)
+   end
+   
    // PIPELINE REGISTER //////////////////////////////////////////////////
+   
    always @(negedge nclk or negedge nrst)
      if (!nrst) begin
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
-       rDWBADR <= 32'h0;
        rDWBSEL <= 4'h0;
        rMSR_C <= 1'h0;
        rRESULT <= 32'h0;
@@ -229,7 +270,6 @@
      end else if (nrun) begin
        rRESULT <= #1 xRESULT;
        rMSR_C <= #1 xMSR_C;
-       rDWBADR <= #1 wDWBADR;
        rDWBSEL <= #1 xDWBSEL;  
      end
    

Modified: 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_control.v
===================================================================
--- 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_control.v 
    2007-04-27 01:13:38 UTC (rev 5139)
+++ 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_control.v 
    2007-04-27 01:24:56 UTC (rev 5140)
@@ -1,28 +1,33 @@
 /*
- * $Id: aeMB_control.v,v 1.3 2007/04/11 04:30:43 sybreon Exp $
+ * $Id: aeMB_control.v,v 1.4 2007/04/27 00:23:55 sybreon Exp $
  * 
  * AE68 System Control Unit
- * Copyright (C) 2006 Shawn Tan Ser Ngiap <address@hidden>
+ * Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <address@hidden>
  *  
- * This library is free software; you can redistribute it and/or modify it 
- * under the terms of the GNU Lesser General Public License as published by 
- * the Free Software Foundation; either version 2.1 of the License, 
- * or (at your option) any later version.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
  * 
- * This library is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
- * License for more details.
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
  * 
- * You should have received a copy of the GNU Lesser General Public License 
- * along with this library; if not, write to the Free Software Foundation, 
Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
  *
  * DESCRIPTION
  * Controls the state of the processor.
  * 
  * HISTORY
  * $Log: aeMB_control.v,v $
+ * Revision 1.4  2007/04/27 00:23:55  sybreon
+ * Added code documentation.
+ * Improved size & speed of rtl/verilog/aeMB_aslu.v
+ *
  * Revision 1.3  2007/04/11 04:30:43  sybreon
  * Added pipeline stalling from incomplete bus cycles.
  * Separated sync and async portions of code.
@@ -35,7 +40,6 @@
  *
  */
 
-// address@hidden
 module aeMB_control (/*AUTOARG*/
    // Outputs
    rFSM, nclk, nrst, nrun, frun, drun,
@@ -47,7 +51,6 @@
    input       sys_rst_i, sys_clk_i;
    input       sys_int_i;
    input       sys_exc_i;   
-   //input     sys_run_i;
    
    // Instruction WB
    input       rIWBSTB;
@@ -64,13 +67,25 @@
    output      nclk, nrst, nrun;   
    output      frun, drun;
       
-   // Clock code here
-   assign      nclk = sys_clk_i;
+   /**
+    RUN Signal
+    ----------
+    This master run signal will pause or run the entire pipeline. It
+    will pause for any incomplete bus transaction.
+    */
+   
+   assign      nrun = ~((rDWBSTB ^ dwb_ack_i) | ((rIWBSTB ^ iwb_ack_i)));
 
-   // Debounce reset
+   /**
+    Debounce
+    --------
+    The following external signals are debounced and synchronised:
+    - Reset
+    - Interrupt
+    */
+   
    reg [1:0]   rRST;
-   assign      nrst = rRST[1];
-   always @(posedge nclk or negedge sys_rst_i)     
+   always @(negedge nclk or negedge sys_rst_i)     
      if (!sys_rst_i) begin
        //rNRST <= 2'h3;        
        /*AUTORESET*/
@@ -81,24 +96,27 @@
        rRST <= {rRST[0],1'b1};
      end
 
-   // Quiet RUN signal
-   assign      nrun = ~((rDWBSTB ^ dwb_ack_i) | ((rIWBSTB ^ iwb_ack_i)));
-
-   // Debounce Interrupt/Exception Signals
    reg [2:0] rEXC, rINT;
    always @(negedge nclk or negedge nrst)
      if (!nrst) begin
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
-       rEXC <= 3'h0;
        rINT <= 3'h0;
        // End of automatics
      end else if (nrun) begin
-       rEXC <= #1 {rEXC[1:0], sys_exc_i};
+       //rEXC <= #1 {rEXC[1:0], sys_exc_i};
        rINT <= #1 {rINT[1:0], sys_int_i};      
      end
    
-   // Machine States
+   /**
+    Machine States
+    --------------
+    The internal machine state is affected by external interrupt,
+    exception and software exceptions. Only interrupts are
+    implemented.
+    
+    TODO: Implement exceptions.
+    */
    parameter [1:0]
                FSM_RUN = 2'o0,
                FSM_SWEXC = 2'o3,
@@ -116,19 +134,26 @@
        rFSM <= #1 rNXT;
      end
 
-   always @(/*AUTOSENSE*/rEXC or rFSM or rINT)
+   always @(/*AUTOSENSE*/rFSM or rINT)
      case (rFSM)
        FSM_HWEXC: rNXT <= FSM_RUN;       
        //FSM_SWEXC: rNXT <= FSM_RUN;     
        FSM_HWINT: rNXT <= FSM_RUN;      
        default: begin
-         rNXT <= (rEXC == 3'h3) ? FSM_HWEXC :
+         rNXT <= //(rEXC == 3'h3) ? FSM_HWEXC :
                  (rINT == 3'h3) ? FSM_HWINT :
                  FSM_RUN;        
        end
      endcase // case (rFSM)
       
-   // Pause/Bubble
+   /**
+    Bubble
+    ------
+    Pipeline bubbles are introduced during a branch or interrupt.
+    
+    TODO: Implement interrupt bubble.
+    */
+   
    reg [1:0]    rRUN;   
    assign      {drun,frun} = rRUN;
    
@@ -139,5 +164,16 @@
      end else begin
        rRUN <= #1 {~(rBRA ^ rDLY), ~rBRA};     
      end
+
+   /**
+    Clock/Reset
+    -----------
+    This controls the internal clock/reset signal for the core. Any
+    DCM/PLL/DPLL can be instantiated here if needed.
+    */
    
+   assign      nclk = sys_clk_i;
+   assign      nrst = rRST[1];
+
+   
 endmodule // aeMB_control

Modified: 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_core.v
===================================================================
--- 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_core.v    
    2007-04-27 01:13:38 UTC (rev 5139)
+++ 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_core.v    
    2007-04-27 01:24:56 UTC (rev 5140)
@@ -1,22 +1,23 @@
 /*
- * $Id: aeMB_core.v,v 1.4 2007/04/25 22:15:04 sybreon Exp $
+ * $Id: aeMB_core.v,v 1.5 2007/04/27 00:23:55 sybreon Exp $
  * 
  * AEMB 32-bit Microblaze Compatible Core
- * Copyright (C) 2006 Shawn Tan Ser Ngiap <address@hidden>
+ * Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <address@hidden>
  *  
- * This library is free software; you can redistribute it and/or modify it 
- * under the terms of the GNU Lesser General Public License as published by 
- * the Free Software Foundation; either version 2.1 of the License, 
- * or (at your option) any later version.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
  * 
- * This library is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
- * License for more details.
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
  * 
- * You should have received a copy of the GNU Lesser General Public License 
- * along with this library; if not, write to the Free Software Foundation, 
Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
  *
  * DESCRIPTION
  * Microblaze compatible, WISHBONE compliant hardware core. This core is
@@ -25,6 +26,10 @@
  *
  * HISTORY
  * $Log: aeMB_core.v,v $
+ * Revision 1.5  2007/04/27 00:23:55  sybreon
+ * Added code documentation.
+ * Improved size & speed of rtl/verilog/aeMB_aslu.v
+ *
  * Revision 1.4  2007/04/25 22:15:04  sybreon
  * Added support for 8-bit and 16-bit data types.
  *
@@ -61,7 +66,7 @@
    output              dwb_stb_o;              // From decode of aeMB_decode.v
    output              dwb_we_o;               // From decode of aeMB_decode.v
    output [ISIZ-1:0]   iwb_adr_o;              // From fetch of aeMB_fetch.v
-   output              iwb_stb_o;              // From decode of aeMB_decode.v
+   output              iwb_stb_o;              // From fetch of aeMB_fetch.v
    // End of automatics
    /*AUTOINPUT*/
    // Beginning of automatic inputs (from unused autoinst inputs)
@@ -88,7 +93,7 @@
    wire                        rDWBWE;                 // From decode of 
aeMB_decode.v
    wire [1:0]          rFSM;                   // From control of 
aeMB_control.v
    wire [15:0]         rIMM;                   // From decode of aeMB_decode.v
-   wire                        rIWBSTB;                // From decode of 
aeMB_decode.v
+   wire                        rIWBSTB;                // From fetch of 
aeMB_fetch.v
    wire                        rLNK;                   // From decode of 
aeMB_decode.v
    wire [1:0]          rMXALU;                 // From decode of aeMB_decode.v
    wire [1:0]          rMXLDST;                // From decode of aeMB_decode.v
@@ -99,7 +104,6 @@
    wire [4:0]          rRA;                    // From decode of aeMB_decode.v
    wire [4:0]          rRB;                    // From decode of aeMB_decode.v
    wire [4:0]          rRD;                    // From decode of aeMB_decode.v
-   wire [4:0]          rRD_;                   // From decode of aeMB_decode.v
    wire [31:0]         rREGA;                  // From regfile of 
aeMB_regfile.v
    wire [31:0]         rREGB;                  // From regfile of 
aeMB_regfile.v
    wire [31:0]         rRESULT;                // From aslu of aeMB_aslu.v
@@ -108,6 +112,8 @@
    wire [31:0]         sDWBDAT;                // From regfile of 
aeMB_regfile.v
    // End of automatics
 
+   // INSTANTIATIONS 
/////////////////////////////////////////////////////////////////
+   
    aeMB_regfile #(DSIZ)
      regfile (/*AUTOINST*/
              // Outputs
@@ -122,7 +128,6 @@
              .rRA                      (rRA[4:0]),
              .rRB                      (rRB[4:0]),
              .rRD                      (rRD[4:0]),
-             .rRD_                     (rRD_[4:0]),
              .rRESULT                  (rRESULT[31:0]),
              .rFSM                     (rFSM[1:0]),
              .rPC                      (rPC[31:0]),
@@ -139,7 +144,9 @@
      fetch (/*AUTOINST*/
            // Outputs
            .iwb_adr_o                  (iwb_adr_o[ISIZ-1:0]),
+           .iwb_stb_o                  (iwb_stb_o),
            .rPC                        (rPC[31:0]),
+           .rIWBSTB                    (rIWBSTB),
            // Inputs
            .iwb_dat_i                  (iwb_dat_i[31:0]),
            .nclk                       (nclk),
@@ -208,18 +215,15 @@
             .rRA                       (rRA[4:0]),
             .rRB                       (rRB[4:0]),
             .rRD                       (rRD[4:0]),
-            .rRD_                      (rRD_[4:0]),
             .rOPC                      (rOPC[5:0]),
             .rIMM                      (rIMM[15:0]),
             .rDWBSTB                   (rDWBSTB),
             .rDWBWE                    (rDWBWE),
-            .rIWBSTB                   (rIWBSTB),
             .rDLY                      (rDLY),
             .rLNK                      (rLNK),
             .rBRA                      (rBRA),
             .rRWE                      (rRWE),
             .rMXLDST                   (rMXLDST[1:0]),
-            .iwb_stb_o                 (iwb_stb_o),
             .dwb_stb_o                 (dwb_stb_o),
             .dwb_we_o                  (dwb_we_o),
             // Inputs

Added: 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_core_BE.v
===================================================================
--- 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_core_BE.v 
                            (rev 0)
+++ 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_core_BE.v 
    2007-04-27 01:24:56 UTC (rev 5140)
@@ -0,0 +1,64 @@
+
+// Wrapper for aeMB core:
+//    Make it big-endian like the standard MicroBlaze
+//    Drive wb_cyc_o  (just tied to wb_stb_o for now)
+//    Make input reset active high (like the signal name makes it sound....)
+
+module aeMB_core_BE
+  #(parameter ISIZ=32, parameter DSIZ=32)
+    (input sys_clk_i,
+     input sys_rst_i,
+
+     output iwb_stb_o,
+     output [ISIZ-1:0] iwb_adr_o,
+     input [31:0] iwb_dat_i,
+     input iwb_ack_i,
+
+     output dwb_we_o,
+     output dwb_stb_o,
+     output [DSIZ-1:0] dwb_adr_o,
+     output [31:0] dwb_dat_o,
+     input [31:0] dwb_dat_i,
+     input dwb_ack_i,
+     output [3:0] dwb_sel_o,
+     output dwb_cyc_o,
+     
+     input sys_int_i, 
+     input sys_exc_i);
+
+   assign  dwb_cyc_o = dwb_stb_o;
+   
+   aeMB_core #(.ISIZ(ISIZ),.DSIZ(DSIZ))
+     aeMB_core (.sys_clk_i(sys_clk_i), 
+               .sys_rst_i(~sys_rst_i),
+               
+               .iwb_stb_o(iwb_stb_o),
+               .iwb_adr_o(iwb_adr_o),
+               .iwb_ack_i(iwb_ack_i),
+               .iwb_dat_i({iwb_dat_i[7:0],
+                           iwb_dat_i[15:8],
+                           iwb_dat_i[23:16],
+                           iwb_dat_i[31:24]}),
+                           
+               
+               .dwb_we_o(dwb_we_o),
+               .dwb_stb_o(dwb_stb_o),
+               .dwb_adr_o(dwb_adr_o),
+               .dwb_ack_i(dwb_ack_i),
+               .dwb_sel_o({dwb_sel_o[0],
+                           dwb_sel_o[1],
+                           dwb_sel_o[2],
+                           dwb_sel_o[3]}),
+               .dwb_dat_i({dwb_dat_i[7:0],
+                           dwb_dat_i[15:8],
+                           dwb_dat_i[23:16],
+                           dwb_dat_i[31:24]}),
+               .dwb_dat_o({dwb_dat_o[7:0],
+                           dwb_dat_o[15:8],
+                           dwb_dat_o[23:16],
+                           dwb_dat_o[31:24]}),
+               
+               .sys_int_i(sys_int_i),
+               .sys_exc_i(sys_exc_i) );
+
+endmodule // aeMB_core_BE

Modified: 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_decode.v
===================================================================
--- 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_decode.v  
    2007-04-27 01:13:38 UTC (rev 5139)
+++ 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_decode.v  
    2007-04-27 01:24:56 UTC (rev 5140)
@@ -1,28 +1,33 @@
 /*
- * $Id: aeMB_decode.v,v 1.5 2007/04/25 22:15:04 sybreon Exp $
+ * $Id: aeMB_decode.v,v 1.6 2007/04/27 00:23:55 sybreon Exp $
  * 
  * AEMB Instruction Decoder
- * Copyright (C) 2006 Shawn Tan Ser Ngiap <address@hidden>
+ * Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <address@hidden>
  *  
- * This library is free software; you can redistribute it and/or modify it 
- * under the terms of the GNU Lesser General Public License as published by 
- * the Free Software Foundation; either version 2.1 of the License, 
- * or (at your option) any later version.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
  * 
- * This library is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
- * License for more details.
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
  * 
- * You should have received a copy of the GNU Lesser General Public License 
- * along with this library; if not, write to the Free Software Foundation, 
Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
  *
  * DESCRIPTION
  * Instruction decoder
  *
  * HISTORY
  * $Log: aeMB_decode.v,v $
+ * Revision 1.6  2007/04/27 00:23:55  sybreon
+ * Added code documentation.
+ * Improved size & speed of rtl/verilog/aeMB_aslu.v
+ *
  * Revision 1.5  2007/04/25 22:15:04  sybreon
  * Added support for 8-bit and 16-bit data types.
  *
@@ -41,12 +46,10 @@
  *
  */
 
-// address@hidden
 module aeMB_decode (/*AUTOARG*/
    // Outputs
-   rSIMM, rMXALU, rMXSRC, rMXTGT, rRA, rRB, rRD, rRD_, rOPC, rIMM,
-   rDWBSTB, rDWBWE, rIWBSTB, rDLY, rLNK, rBRA, rRWE, rMXLDST,
-   iwb_stb_o, dwb_stb_o, dwb_we_o,
+   rSIMM, rMXALU, rMXSRC, rMXTGT, rRA, rRB, rRD, rOPC, rIMM, rDWBSTB,
+   rDWBWE, rDLY, rLNK, rBRA, rRWE, rMXLDST, dwb_stb_o, dwb_we_o,
    // Inputs
    sDWBDAT, rDWBSEL, rREGA, rRESULT, iwb_dat_i, nclk, nrst, drun,
    frun, nrun
@@ -55,10 +58,10 @@
    output [31:0] rSIMM;
    output [1:0]  rMXALU;
    output [1:0]  rMXSRC, rMXTGT;
-   output [4:0]  rRA, rRB, rRD, rRD_;
+   output [4:0]  rRA, rRB, rRD;
    output [5:0]  rOPC;   
    output [15:0] rIMM;
-   output       rDWBSTB, rDWBWE, rIWBSTB;
+   output       rDWBSTB, rDWBWE;
    output       rDLY, rLNK, rBRA, rRWE;
    output [1:0]  rMXLDST;
    input [31:0]  sDWBDAT;   
@@ -67,32 +70,35 @@
    
    // External I/F
    input [31:0]  iwb_dat_i;
-   //, dwb_dat_i;
-   output       iwb_stb_o;   
    output       dwb_stb_o, dwb_we_o;
    
    // System I/F
    input        nclk, nrst, drun, frun, nrun;
 
-   // Endian Correction
+   /**
+    rOPC/rRD/rRA/rRB/rIMM
+    ---------------------
+    Instruction latch for the different fields of the instruction
+    ISA. This part may be changed in the future to incorporate an
+    instruction cache.
+   
+    FIXME: Endian correction!
+    TODO: Modify this for block RAM based instruction cache.
+    */
    wire [31:0]          wIREG;
-   wire [31:0]          wWBDAT;
    assign       wIREG = 
{iwb_dat_i[7:0],iwb_dat_i[15:8],iwb_dat_i[23:16],iwb_dat_i[31:24]};
-   assign       wWBDAT = sDWBDAT;
-   
-   // Decode
+         
    wire [5:0]   wOPC = wIREG[31:26];
    wire [4:0]   wRD = wIREG[25:21];
    wire [4:0]   wRA = wIREG[20:16];
    wire [4:0]   wRB = wIREG[15:11];   
    wire [15:0]          wIMM = wIREG[15:0];
-      
-   // rOPC, rRD, rRA, rRB, rIMM;
+
    reg [5:0]    rOPC;
-   reg [4:0]    rRD, rRA, rRB, rRD_;
+   reg [4:0]    rRD, rRA, rRB;
    reg [15:0]   rIMM;
    reg [5:0]    xOPC;
-   reg [4:0]    xRD, xRA, xRB, xRD_;
+   reg [4:0]    xRD, xRA, xRB;
    reg [15:0]   xIMM;
    
    always @(/*AUTOSENSE*/frun or wIMM or wOPC or wRA or wRB or wRD)
@@ -113,17 +119,13 @@
        // End of automatics
      end // else: !if(frun)
    
-   always @(/*AUTOSENSE*/drun or rRD)
-     if (drun) begin
-       xRD_ <= rRD;
-     end else begin
-       /*AUTORESET*/
-       // Beginning of autoreset for uninitialized flops
-       xRD_ <= 5'h0;
-       // End of automatics
-     end
+   /**
+    Opcode Groups
+    -------------
+    Start decoding by breaking up the opcode into groups. This should
+    infer a bunch of decoders on appropriate synthesis tools.
+    */
    
-   // Groups
    wire         fGH0 = (wOPC[5:3] == 3'o0);
    wire         fGH1 = (wOPC[5:3] == 3'o1);
    wire         fGH2 = (wOPC[5:3] == 3'o2);
@@ -141,7 +143,13 @@
    wire         fGL6 = (wOPC[2:0] == 3'o6);
    wire         fGL7 = (wOPC[2:0] == 3'o7);
    
-   // Decode Logic
+   /*
+    Main Decoder
+    ------------
+    As there aren't many instruction groups to decode, we will decode
+    all the instruction families here.
+    */
+   
    wire         fADD = ({wOPC[5:4],wOPC[0]} == 3'o0);
    wire         fSUB = ({wOPC[5:4],wOPC[0]} == 3'o1);   
    wire         fLOGIC = ({wOPC[5:4],wOPC[2]} == 3'o4);
@@ -159,7 +167,12 @@
    wire         fRET = fGH5 & fGL5;
    wire         fMISC = fGH4 & fGL5;
 
-   // MXALU
+   /**
+    MXALU
+    -----
+    This signal controls the MXALU mux inside the ASLU unit.
+    */
+   
    reg [1:0]    rMXALU, xMXALU;
    always @(/*AUTOSENSE*/fBRA or fLOGIC or fSHIFT or frun)
      if (frun) begin
@@ -175,7 +188,13 @@
        // End of automatics
      end // else: !if(frun)
    
-   // BCC/BRA/RET
+   /**
+    BCC/BRA/RET
+    -----------
+    This signal controls the associated muxes for BRANCH, DELAY and
+    LINK operations.
+    */
+   
    reg                  rMXDLY,rMXLNK,xMXDLY,xMXLNK;
    reg [1:0]    rMXBRA,xMXBRA;
    always @(/*AUTOSENSE*/fBCC or fBRU or fRET or frun or wRA or wRD)
@@ -201,7 +220,13 @@
        // End of automatics
      end // else: !if(frun)
    
-   // LD ST
+   /**
+    LD/ST
+    -----
+    This signal controls the mux that controls the LOAD and STORE
+    operations.
+    */
+   
    reg [1:0]     rMXLDST,xMXLDST;
    always @(/*AUTOSENSE*/fLD or fST or frun)
      if (frun) begin
@@ -216,10 +241,15 @@
        // End of automatics
      end // else: !if(frun)
    
-   // SRC/TGT - incorporates forwarding   
+   /** 
+    SRC/TGT
+    -------
+    Controls the muxes that select the appropriate sources for the A,
+    B and D operands. All data hazards are resolved here.
+    */
+   
    reg [1:0]     rMXSRC, rMXTGT, rMXALT, xMXSRC,xMXTGT,xMXALT;
    wire          fRWE = (rRD != 5'd0) & (rMXBRA != 2'o3);
-   //wire        fFWDBCC = (rMXBRA != 2'o3);
    
    always @(/*AUTOSENSE*/fBCC or fBRU or fRWE or frun or rMXLDST
            or rRD or wOPC or wRA or wRB)
@@ -248,7 +278,13 @@
        // End of automatics
      end // else: !if(frun)
        
-   // IMM processing
+   /**
+    IMM Latching
+    ------------
+    The logic to generate either a full 32-bit or sign extended 32-bit
+    immediate is done here.
+    */
+   
    reg [31:0]   rSIMM, xSIMM;
    reg [15:0]   rIMMHI, xIMMHI;   
    reg                  rFIMM, xFIMM;
@@ -267,11 +303,16 @@
        // End of automatics
      end // else: !if(frun)
 
-   // CC
-   // COMPARATOR
-   //wire [31:0] wREGA = rREGA;
+   /**
+    COMPARATOR
+    ----------
+    This performs the comparison for conditional branches. It handles
+    the necessary data hazards. It generates a branch flag that is
+    used by the execution stage.
+    */
+   
    wire [31:0] wREGA =
-              (rMXALT == 2'o3) ? wWBDAT :
+              (rMXALT == 2'o3) ? sDWBDAT :
               (rMXALT == 2'o2) ? rRESULT :
               rREGA;   
    
@@ -295,7 +336,13 @@
        default: rBCC <= 1'b0;
      endcase // case (rRD[2:0])
 
-   // Branch Signal
+   /**
+    Branch Signals
+    --------------
+    This controls the generation of the BRANCH, DELAY and LINK
+    signals.
+    */
+   
    reg                rBRA, rDLY, rLNK, xBRA, xDLY, xLNK;
    always @(/*AUTOSENSE*/drun or rBCC or rMXBRA or rMXDLY or rMXLNK)
      if (drun) begin
@@ -324,9 +371,14 @@
        // End of automatics
      end // else: !if(drun)
    
-   // MXRWE
+   /**
+    MXRWE
+    -----
+    This signal controls the flag that determines whether a D register
+    is open for writing.
+    */
    reg                  rRWE, xRWE;
-   wire         wRWE = (rRD != 5'd0);   
+   wire         wRWE = |rRD;   
    always @(/*AUTOSENSE*/drun or rMXBRA or rMXLDST or wRWE)
      if (drun) begin
        case (rMXBRA)
@@ -341,7 +393,13 @@
        // End of automatics
      end // else: !if(drun)
 
-   // DWB logic
+   /**
+    Data WISHBONE Bus
+    -----------------
+    The STB and WE signals for the DWB are decoded here depending on
+    the LOAD/STORE control signal.    
+    */
+   
    reg rDWBSTB, rDWBWE, xDWBSTB, xDWBWE;
    assign dwb_stb_o = rDWBSTB;
    assign dwb_we_o = rDWBWE;
@@ -358,10 +416,6 @@
        // End of automatics
      end
    
-   // WB other signals
-   assign iwb_stb_o = rIWBSTB;
-   assign rIWBSTB = 1'b1;   
-
    // PIPELINE REGISTERS ///////////////////////////////////////////////
 
    always @(negedge nclk or negedge nrst)
@@ -369,9 +423,14 @@
        rOPC <= 6'o40;  
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
+       rBRA <= 1'h0;
+       rDLY <= 1'h0;
+       rDWBSTB <= 1'h0;
+       rDWBWE <= 1'h0;
        rFIMM <= 1'h0;
        rIMM <= 16'h0;
        rIMMHI <= 16'h0;
+       rLNK <= 1'h0;
        rMXALT <= 2'h0;
        rMXALU <= 2'h0;
        rMXBRA <= 2'h0;
@@ -383,6 +442,7 @@
        rRA <= 5'h0;
        rRB <= 5'h0;
        rRD <= 5'h0;
+       rRWE <= 1'h0;
        rSIMM <= 32'h0;
        // End of automatics
      end else if (nrun) begin // if (!nrst)
@@ -405,29 +465,14 @@
        rSIMM <= #1 xSIMM;
        rFIMM <= #1 xFIMM;
        rIMMHI <= #1 xIMMHI;    
-     end // if (nrun)
 
-   always @(negedge nclk or negedge nrst)
-     if (!nrst) begin
-       /*AUTORESET*/
-       // Beginning of autoreset for uninitialized flops
-       rBRA <= 1'h0;
-       rDLY <= 1'h0;
-       rDWBSTB <= 1'h0;
-       rDWBWE <= 1'h0;
-       rLNK <= 1'h0;
-       rRD_ <= 5'h0;
-       rRWE <= 1'h0;
-       // End of automatics
-     end else if (nrun) begin // if (!nrst)
-       rRD_ <= #1 xRD_;
        rBRA <= #1 xBRA;
        rDLY <= #1 xDLY;
        rLNK <= #1 xLNK;
        rRWE <= #1 xRWE;
        rDWBSTB <= #1 xDWBSTB;
        rDWBWE <= #1 xDWBWE;    
-     end
+     end // if (nrun)
    
 endmodule // aeMB_decode
 

Modified: 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_fetch.v
===================================================================
--- 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_fetch.v   
    2007-04-27 01:13:38 UTC (rev 5139)
+++ 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_fetch.v   
    2007-04-27 01:24:56 UTC (rev 5140)
@@ -1,28 +1,34 @@
 /*
- * $Id: aeMB_fetch.v,v 1.3 2007/04/11 04:30:43 sybreon Exp $
+ * $Id: aeMB_fetch.v,v 1.4 2007/04/27 00:23:55 sybreon Exp $
  * 
  * AEMB Instruction Fetch
- * Copyright (C) 2006 Shawn Tan Ser Ngiap <address@hidden>
+ * Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <address@hidden>
  *  
- * This library is free software; you can redistribute it and/or modify it 
- * under the terms of the GNU Lesser General Public License as published by 
- * the Free Software Foundation; either version 2.1 of the License, 
- * or (at your option) any later version.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
  * 
- * This library is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
- * License for more details.
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
  * 
- * You should have received a copy of the GNU Lesser General Public License 
- * along with this library; if not, write to the Free Software Foundation, 
Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
  *
  * DESCRIPTION
- * Controls the instruction side of AEMB.
+ * Controls the instruction side of AEMB. Instruction cache and branch
+ * prediction can be incorporated if needed.
  *
  * HISTORY
  * $Log: aeMB_fetch.v,v $
+ * Revision 1.4  2007/04/27 00:23:55  sybreon
+ * Added code documentation.
+ * Improved size & speed of rtl/verilog/aeMB_aslu.v
+ *
  * Revision 1.3  2007/04/11 04:30:43  sybreon
  * Added pipeline stalling from incomplete bus cycles.
  * Separated sync and async portions of code.
@@ -35,11 +41,9 @@
  *
  */
 
-// address@hidden
-
 module aeMB_fetch (/*AUTOARG*/
    // Outputs
-   iwb_adr_o, rPC,
+   iwb_adr_o, iwb_stb_o, rPC, rIWBSTB,
    // Inputs
    iwb_dat_i, nclk, nrst, nrun, rFSM, rBRA, rRESULT
    );
@@ -47,23 +51,30 @@
 
    // Instruction WB I/F
    output [ISIZ-1:0] iwb_adr_o;
+   output           iwb_stb_o;   
    input [31:0]      iwb_dat_i;
-
+ 
    // System
    input            nclk, nrst, nrun;   
    
    // Internal
    output [31:0]     rPC;
-   //output [31:0]     rPCNXT;   
+   output           rIWBSTB;   
    input [1:0]              rFSM;   
    input            rBRA;
    input [31:0]      rRESULT;
       
-   // WB ADR signal
+   /**
+    Instruction WISHBONE bus
+    ------------------------
+    Signals for the instruction side of the bus.
+    */
+   
    reg [31:0]       rIWBADR, rPC, xIWBADR, xPC;
-   
    wire [31:0]              wPCNXT = {(rIWBADR[ISIZ-1:2] + 1'b1),2'b00};   
    assign           iwb_adr_o = {rIWBADR[ISIZ-1:2],2'b00}; // Word Aligned
+   assign           iwb_stb_o = 1'b1;
+   assign           rIWBSTB = 1'b1;      
    
    always @(/*AUTOSENSE*/rBRA or rFSM or rIWBADR or rRESULT or wPCNXT)
      begin     

Modified: 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_regfile.v
===================================================================
--- 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_regfile.v 
    2007-04-27 01:13:38 UTC (rev 5139)
+++ 
gnuradio/branches/developers/matt/u2f/opencores/aemb/rtl/verilog/aeMB_regfile.v 
    2007-04-27 01:24:56 UTC (rev 5140)
@@ -1,30 +1,39 @@
 /*
- * $Id: aeMB_regfile.v,v 1.10 2007/04/25 22:52:53 sybreon Exp $
+ * $Id: aeMB_regfile.v,v 1.12 2007/04/27 00:23:55 sybreon Exp $
  * 
  * AEMB Register File
- * Copyright (C) 2006 Shawn Tan Ser Ngiap <address@hidden>
+ * Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <address@hidden>
  *  
- * This library is free software; you can redistribute it and/or modify it 
- * under the terms of the GNU Lesser General Public License as published by 
- * the Free Software Foundation; either version 2.1 of the License, 
- * or (at your option) any later version.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
  * 
- * This library is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
- * License for more details.
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
  * 
- * You should have received a copy of the GNU Lesser General Public License 
- * along with this library; if not, write to the Free Software Foundation, 
Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
  *
  * DESCRIPTION
- * Implements the 32 registers as registers. Some registers require
- * special actions during hardware exception/interrupts. Data forwarding
- * is also taken care of inside here to simplify decode logic.
+ * Implements the 32 registers as memory. Some registers require
+ * special actions during hardware exception/interrupts. Data
+ * forwarding is also taken care of inside here to simplify decode
+ * logic.
  *
  * HISTORY
  * $Log: aeMB_regfile.v,v $
+ * Revision 1.12  2007/04/27 00:23:55  sybreon
+ * Added code documentation.
+ * Improved size & speed of rtl/verilog/aeMB_aslu.v
+ *
+ * Revision 1.11  2007/04/26 14:29:53  sybreon
+ * Made minor performance optimisations.
+ *
  * Revision 1.10  2007/04/25 22:52:53  sybreon
  * Fixed minor simulation bug.
  *
@@ -59,144 +68,169 @@
  *
  */
 
-// address@hidden - REG
-// address@hidden - RAM
 module aeMB_regfile(/*AUTOARG*/
    // Outputs
    dwb_dat_o, rREGA, rREGB, sDWBDAT,
    // Inputs
-   dwb_dat_i, rDWBSTB, rDWBWE, rRA, rRB, rRD, rRD_, rRESULT, rFSM,
-   rPC, rOPC, rDWBSEL, rLNK, rRWE, nclk, nrst, drun, nrun
+   dwb_dat_i, rDWBSTB, rDWBWE, rRA, rRB, rRD, rRESULT, rFSM, rPC,
+   rOPC, rDWBSEL, rLNK, rRWE, nclk, nrst, drun, nrun
    );
-   // Data WB bus width
+   // Data WB address bus width
    parameter DSIZ = 32;
 
-   // Data WB I/F
+   // Data WB Signals
    output [31:0] dwb_dat_o;
    input [31:0]  dwb_dat_i;
    
-   // Internal I/F
+   // Internal Signals
    output [31:0] rREGA, rREGB;
-   output [31:0] sDWBDAT;
-   
+   output [31:0] sDWBDAT;   
    input        rDWBSTB, rDWBWE;   
-   input [4:0]          rRA, rRB, rRD, rRD_;   
+   input [4:0]          rRA, rRB, rRD;   
    input [31:0]  rRESULT;
    input [1:0]          rFSM;   
    input [31:0]  rPC;
    input [5:0]          rOPC;   
    input [3:0]          rDWBSEL;   
-   //, rPCNXT;
    input        rLNK, rRWE;
    input        nclk, nrst, drun, nrun;   
-   
-   // Register File
-   reg [31:0]   r00,r01,r02,r03,r04,r05,r06,r07;
-   reg [31:0]   r08,r09,r0A,r0B,r0C,r0D,r0E,r0F;
-   reg [31:0]   r10,r11,r12,r13,r14,r15,r16,r17;
-   reg [31:0]   r18,r19,r1A,r1B,r1C,r1D,r1E,r1F;                
 
-   // FLAGS
-   wire fWE = rRWE & ~rDWBWE;
-   wire fLNK = rLNK;
-   wire fLD = rDWBSTB ^ rDWBWE;   
+   // ASYNCHRONOUS 
////////////////////////////////////////////////////////////////////
 
-   // PC Latch
-   reg [31:0]   rPC_;
-   always @(negedge nclk or negedge nrst)
-     if (!nrst) begin
-       /*AUTORESET*/
-       // Beginning of autoreset for uninitialized flops
-       rPC_ <= 32'h0;
-       // End of automatics
-     end else if (nrun) begin
-       rPC_ <= #1 rPC; 
-     end
+   wire [31:0]          wRESULT;
+   wire         fWE = rRWE & !rDWBWE;
+   wire         fLNK = rLNK;
+   wire         fLD = rDWBSTB ^ rDWBWE;   
+   wire         fDFWD = !(rRD ^ rRD_) & fWE;
+   wire         fMFWD = rDWBSTB & !rDWBWE;   
    
-   // DWB data - Endian Correction
+   /**
+    Delay Latches
+    ----------
+    The PC and RD are latched internally as it will be needed for
+    linking and interrupt handling.
+    
+    FIXME: May need to be blocked (drun).
+    */
+   
+   reg [31:2]   rPC_, xPC_;
+   reg [4:0]    rRD_, xRD_;
+   
+   always @(/*AUTOSENSE*/rPC or rRD) begin
+      xPC_ <= rPC[31:2];
+      xRD_ <= rRD;      
+   end
+   
+   /**
+    Data WISHBONE Bus
+    -----------------
+    The data word that is read or written between the core and the
+    external bus may need to be re-ordered.
+    
+    FIXME: Endian correction!
+    */
+   
    wire [31:0]          wDWBDAT;
    reg [31:0]   sDWBDAT;   
    reg [31:0]   rDWBDAT;
    assign       dwb_dat_o = 
{rDWBDAT[7:0],rDWBDAT[15:8],rDWBDAT[23:16],rDWBDAT[31:24]};   
    assign       wDWBDAT = 
{dwb_dat_i[7:0],dwb_dat_i[15:8],dwb_dat_i[23:16],dwb_dat_i[31:24]};   
 
-   always @(/*AUTOSENSE*/rDWBSEL or wDWBDAT)
-     case (rDWBSEL)      
-       4'hF: sDWBDAT <= wDWBDAT;
-       4'hC: sDWBDAT <= {16'd0,wDWBDAT[31:16]};
-       4'h3: sDWBDAT <= {16'd0,wDWBDAT[15:0]};
-       4'h8: sDWBDAT <= {24'd0,wDWBDAT[31:24]};
-       4'h4: sDWBDAT <= {24'd0,wDWBDAT[23:16]};
-       4'h2: sDWBDAT <= {24'd0,wDWBDAT[15:8]};
-       4'h1: sDWBDAT <= {24'd0,wDWBDAT[7:0]};      
-       default: sDWBDAT <= 32'h0;       
-     endcase // case (rDWBSEL)
+   /**
+    RAM Based Register File
+    -----------------------
+    This approach was chosen for implementing the register file as it
+    was easier to implement and resulted in a higher speed than a pure
+    register based implementation. A comparison was made using
+    synthesis data obtained from Xilinx ISE:
+    Reg : 1284 slices @ 78 MHz 
+    RAM : 227 slices @ 141 MHz
+    */
    
-   // Forwarding Control
-   wire         fDFWD = (rRD == rRD_) & fWE;
-   wire         fMFWD = rDWBSTB & ~rDWBWE;   
-   wire [31:0]          wRESULT = (fMFWD) ? sDWBDAT : rRESULT;   
-      
-   // Alternative Design
    reg [31:0]  rMEMA[0:31], rMEMB[0:31], rMEMD[0:31];
    wire [31:0] wDDAT, wREGA, wREGB, wREGD, wWBDAT;   
    wire        wDWE = (fLD | fLNK | fWE) & |rRD_ & nrun;
    assign      wDDAT = (fLD) ? sDWBDAT :
-                      (fLNK) ? rPC_ : rRESULT;                
+                      (fLNK) ? {rPC_,2'd0} :
+                      rRESULT;                
    assign      wWBDAT = (fDFWD) ? wRESULT : wREGD;   
+   assign      wRESULT = (fMFWD) ? sDWBDAT : rRESULT;   
    
-   assign      wREGA = rMEMA[rRA];
-   assign      wREGB = rMEMB[rRB];
+   assign      rREGA = rMEMA[rRA];
+   assign      rREGB = rMEMB[rRB];
    assign      wREGD = rMEMD[rRD];
    
    always @(negedge nclk)
-     if (wDWE) begin
+     if (wDWE | !nrst) begin
        rMEMA[rRD_] <= wDDAT;
        rMEMB[rRD_] <= wDDAT;
        rMEMD[rRD_] <= wDDAT;    
      end
 
-   // Resize
+   /**
+    Memory Resizer
+    --------------
+    This moves the appropriate bytes around depending on the size of
+    the operation. There is no checking for invalid size selection.    
+    */
+   
    reg [31:0] sWBDAT;
    always @(/*AUTOSENSE*/rOPC or wWBDAT)
      case (rOPC[1:0])
-       2'o0: sWBDAT <= {(4){wWBDAT[7:0]}};       
+       // 8-bit
+       2'o0: sWBDAT <= {(4){wWBDAT[7:0]}};
+       // 16-bit
        2'o1: sWBDAT <= {(2){wWBDAT[15:0]}};
+       // 32-bit
        default: sWBDAT <= wWBDAT;       
      endcase // case (rOPC[1:0])
-   
+
+   always @(/*AUTOSENSE*/rDWBSEL or wDWBDAT)
+     case (rDWBSEL)
+       // 8-bit
+       4'h8: sDWBDAT <= {24'd0,wDWBDAT[31:24]};
+       4'h4: sDWBDAT <= {24'd0,wDWBDAT[23:16]};
+       4'h2: sDWBDAT <= {24'd0,wDWBDAT[15:8]};
+       4'h1: sDWBDAT <= {24'd0,wDWBDAT[7:0]};
+       // 16-bit
+       4'hC: sDWBDAT <= {16'd0,wDWBDAT[31:16]};
+       4'h3: sDWBDAT <= {16'd0,wDWBDAT[15:0]};
+       // 32-bit
+       default: sDWBDAT <= wDWBDAT;
+     endcase // case (rDWBSEL)
+
    // PIPELINE REGISTERS //////////////////////////////////////////////////
-
-   reg [31:0] rREGA, rREGB;   
-   always @(/*AUTOSENSE*/wREGA or wREGB)
-     begin
-       rREGA <= #1 wREGA;
-       rREGB <= #1 wREGB;      
-     end
    
    always @(negedge nclk or negedge nrst)
      if (!nrst) begin
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        rDWBDAT <= 32'h0;
+       rPC_ <= 30'h0;
+       rRD_ <= 5'h0;
        // End of automatics
      end else if (nrun) begin
-       rDWBDAT <= #1 sWBDAT;   
+       rDWBDAT <= #1 sWBDAT;
+       rPC_ <= xPC_;
+       rRD_ <= xRD_;   
      end
 
    // SIMULATION ONLY ///////////////////////////////////////////////////
+   /**
+    The register file is initialised with random values to reflect a
+    realistic situation where the values are undefined at power-up.
+    */
    integer i;
    initial begin
       for (i=0;i<31;i=i+1) begin
-        rMEMA[i] <= 0;
-        rMEMB[i] <= 0;
-        rMEMD[i] <= 0;  
+        rMEMA[i] <= $random;
+        rMEMB[i] <= $random;
+        rMEMD[i] <= $random;    
       end
    end
    
 endmodule // aeMB_regfile
 
-
 // Local Variables:
 // verilog-library-directories:(".")
 // verilog-library-files:("")





reply via email to

[Prev in Thread] Current Thread [Next in Thread]