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
|
|
|