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

Subversion Repositories aemb

[/] [aemb/] [tags/] [AEMB_7_05/] [rtl/] [verilog/] [aeMB_regfile.v] - Diff between revs 34 and 36

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

Rev 34 Rev 36
Line 1... Line 1...
/*
/*
 * $Id: aeMB_regfile.v,v 1.16 2007-05-15 22:44:57 sybreon Exp $
 * $Id: aeMB_regfile.v,v 1.17 2007-05-17 09:08:21 sybreon Exp $
 *
 *
 * AEMB Register File
 * AEMB Register File
 * Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
 * Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
 *
 *
 * This library is free software; you can redistribute it and/or
 * This library is free software; you can redistribute it and/or
Line 25... Line 25...
 * forwarding is also taken care of inside here to simplify decode
 * forwarding is also taken care of inside here to simplify decode
 * logic.
 * logic.
 *
 *
 * HISTORY
 * HISTORY
 * $Log: not supported by cvs2svn $
 * $Log: not supported by cvs2svn $
 
 * Revision 1.16  2007/05/15 22:44:57  sybreon
 
 * Corrected speed issues after rev 1.9 update.
 
 *
 * Revision 1.15  2007/04/30 15:56:50  sybreon
 * Revision 1.15  2007/04/30 15:56:50  sybreon
 * Removed byte acrobatics.
 * Removed byte acrobatics.
 *
 *
 * Revision 1.14  2007/04/27 15:15:49  sybreon
 * Revision 1.14  2007/04/27 15:15:49  sybreon
 * Fixed simulation bug.
 * Fixed simulation bug.
Line 80... Line 83...
module aeMB_regfile(/*AUTOARG*/
module aeMB_regfile(/*AUTOARG*/
   // Outputs
   // Outputs
   dwb_dat_o, rREGA, rREGB, sDWBDAT,
   dwb_dat_o, rREGA, rREGB, sDWBDAT,
   // Inputs
   // Inputs
   dwb_dat_i, rDWBSTB, rDWBWE, rRA, rRB, rRD, rRESULT, rFSM, rPC,
   dwb_dat_i, rDWBSTB, rDWBWE, rRA, rRB, rRD, rRESULT, rFSM, rPC,
   rOPC, rDWBSEL, rLNK, rRWE, nclk, nrst, drun, nrun
   rOPC, rDWBSEL, rLNK, rRWE, nclk, prst, drun, prun
   );
   );
   // FIXME: This parameter is not used here.
   // FIXME: This parameter is not used here.
   parameter DSIZ = 32;
   parameter DSIZ = 32;
 
 
   // Data WB Signals
   // Data WB Signals
Line 100... Line 103...
   input [1:0]    rFSM;
   input [1:0]    rFSM;
   input [31:0]  rPC;
   input [31:0]  rPC;
   input [5:0]    rOPC;
   input [5:0]    rOPC;
   input [3:0]    rDWBSEL;
   input [3:0]    rDWBSEL;
   input         rLNK, rRWE;
   input         rLNK, rRWE;
   input         nclk, nrst, drun, nrun;
   input         nclk, prst, drun, prun;
 
 
   /**
   /**
    Delay Latches
    Delay Latches
    ----------
    ----------
    The PC and RD are latched internally as it will be needed for
    The PC and RD are latched internally as it will be needed for
Line 160... Line 163...
    RAM : 227 slices @ 141 MHz
    RAM : 227 slices @ 141 MHz
    */
    */
 
 
   reg [31:0]  rMEMA[0:31], rMEMB[0:31], rMEMD[0:31];
   reg [31:0]  rMEMA[0:31], rMEMB[0:31], rMEMD[0:31];
   wire [31:0] wDDAT, wREGA, wREGB, wREGD, wWBDAT;
   wire [31:0] wDDAT, wREGA, wREGB, wREGD, wWBDAT;
   wire        wDWE = (fLD | fLNK | fWE) & |rRD_ & nrun;
   wire        wDWE = (fLD | fLNK | fWE) & |rRD_ & prun;
   assign      wDDAT = (fLD) ? sDWBDAT :
   assign      wDDAT = (fLD) ? sDWBDAT :
                       (fLNK) ? {rPC_,2'd0} :
                       (fLNK) ? {rPC_,2'd0} :
                       rRESULT;
                       rRESULT;
   //assign      wWBDAT = (fDFWD) ? wRESULT : wREGD;   
 
   //assign      wRESULT = (fMFWD) ? sDWBDAT : rRESULT;   
 
 
 
   assign      rREGA = rMEMA[rRA];
   assign      rREGA = rMEMA[rRA];
   assign      rREGB = rMEMB[rRB];
   assign      rREGB = rMEMB[rRB];
   assign      wREGD = rMEMD[rRD];
   assign      wREGD = rMEMD[rRD];
 
 
   always @(negedge nclk)
   always @(negedge nclk)
     if (wDWE | !nrst) begin
     if (wDWE | prst) begin
        rMEMA[rRD_] <= wDDAT;
        rMEMA[rRD_] <= wDDAT;
        rMEMB[rRD_] <= wDDAT;
        rMEMB[rRD_] <= wDDAT;
        rMEMD[rRD_] <= wDDAT;
        rMEMD[rRD_] <= wDDAT;
     end
     end
 
 
Line 198... Line 199...
       3'o1: xDWBDAT <= {(2){wREGD[15:0]}};
       3'o1: xDWBDAT <= {(2){wREGD[15:0]}};
       3'o5: xDWBDAT <= {(2){rRESULT[15:0]}};
       3'o5: xDWBDAT <= {(2){rRESULT[15:0]}};
       // 32-bit
       // 32-bit
       3'o2, 3'o3: xDWBDAT <= wREGD;
       3'o2, 3'o3: xDWBDAT <= wREGD;
       3'o6, 3'o7: xDWBDAT <= rRESULT;
       3'o6, 3'o7: xDWBDAT <= rRESULT;
     endcase // case (rOPC[1:0])
     endcase // case ({fDFWD,rOPC[1:0]})
 
 
   always @(/*AUTOSENSE*/rDWBSEL or wDWBDAT)
   always @(/*AUTOSENSE*/rDWBSEL or wDWBDAT)
     case (rDWBSEL)
     case (rDWBSEL)
       // 8-bit
       // 8-bit
       4'h8: sDWBDAT <= {24'd0,wDWBDAT[31:24]};
       4'h8: sDWBDAT <= {24'd0,wDWBDAT[31:24]};
Line 216... Line 217...
       default: sDWBDAT <= wDWBDAT;
       default: sDWBDAT <= wDWBDAT;
     endcase // case (rDWBSEL)
     endcase // case (rDWBSEL)
 
 
   // PIPELINE REGISTERS //////////////////////////////////////////////////
   // PIPELINE REGISTERS //////////////////////////////////////////////////
 
 
   always @(negedge nclk or negedge nrst)
   always @(negedge nclk)
     if (!nrst) begin
     if (prst) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        rDWBDAT <= 32'h0;
        rDWBDAT <= 32'h0;
        rPC_ <= 30'h0;
        rPC_ <= 30'h0;
        rRD_ <= 5'h0;
        rRD_ <= 5'h0;
        // End of automatics
        // End of automatics
     end else if (nrun) begin
     end else if (prun) begin
        rDWBDAT <= #1 xDWBDAT;
        rDWBDAT <= #1 xDWBDAT;
        rPC_ <= xPC_;
        rPC_ <= xPC_;
        rRD_ <= xRD_;
        rRD_ <= xRD_;
     end
     end
 
 

powered by: WebSVN 2.1.0

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