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

Subversion Repositories aemb

[/] [aemb/] [tags/] [AEMB_7_05/] [rtl/] [verilog/] [aeMB_regfile.v] - Blame information for rev 24

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 sybreon
/*
2 24 sybreon
 * $Id: aeMB_regfile.v,v 1.11 2007-04-26 14:29:53 sybreon Exp $
3 3 sybreon
 *
4 8 sybreon
 * AEMB Register File
5 3 sybreon
 * Copyright (C) 2006 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
6
 *
7
 * This library is free software; you can redistribute it and/or modify it
8
 * under the terms of the GNU Lesser General Public License as published by
9
 * the Free Software Foundation; either version 2.1 of the License,
10
 * or (at your option) any later version.
11
 *
12
 * This library is distributed in the hope that it will be useful, but
13
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15
 * License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public License
18
 * along with this library; if not, write to the Free Software Foundation, Inc.,
19
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
 *
21
 * DESCRIPTION
22
 * Implements the 32 registers as registers. Some registers require
23
 * special actions during hardware exception/interrupts. Data forwarding
24
 * is also taken care of inside here to simplify decode logic.
25
 *
26
 * HISTORY
27
 * $Log: not supported by cvs2svn $
28 24 sybreon
 * Revision 1.10  2007/04/25 22:52:53  sybreon
29
 * Fixed minor simulation bug.
30
 *
31 23 sybreon
 * Revision 1.9  2007/04/25 22:15:04  sybreon
32
 * Added support for 8-bit and 16-bit data types.
33
 *
34 22 sybreon
 * Revision 1.8  2007/04/12 20:21:33  sybreon
35
 * Moved testbench into /sim/verilog.
36
 * Simulation cleanups.
37
 *
38 18 sybreon
 * Revision 1.7  2007/04/11 16:30:06  sybreon
39
 * Cosmetic changes
40
 *
41 17 sybreon
 * Revision 1.6  2007/04/11 04:30:43  sybreon
42
 * Added pipeline stalling from incomplete bus cycles.
43
 * Separated sync and async portions of code.
44
 *
45 16 sybreon
 * Revision 1.5  2007/04/04 14:08:34  sybreon
46
 * Added initial interrupt/exception support.
47
 *
48 14 sybreon
 * Revision 1.4  2007/04/04 06:11:47  sybreon
49
 * Fixed memory read-write data hazard
50
 *
51 8 sybreon
 * Revision 1.3  2007/04/03 14:46:26  sybreon
52
 * Fixed endian correction issues on data bus.
53
 *
54 5 sybreon
 * Revision 1.2  2007/03/26 12:21:31  sybreon
55
 * Fixed a minor bug where RD is trashed by a STORE instruction. Spotted by Joon Lee.
56
 *
57 4 sybreon
 * Revision 1.1  2007/03/09 17:52:17  sybreon
58
 * initial import
59 3 sybreon
 *
60
 */
61
 
62 16 sybreon
// 1284@78 - REG
63
// 227@141 - RAM
64 3 sybreon
module aeMB_regfile(/*AUTOARG*/
65
   // Outputs
66 22 sybreon
   dwb_dat_o, rREGA, rREGB, sDWBDAT,
67 3 sybreon
   // Inputs
68
   dwb_dat_i, rDWBSTB, rDWBWE, rRA, rRB, rRD, rRD_, rRESULT, rFSM,
69 22 sybreon
   rPC, rOPC, rDWBSEL, rLNK, rRWE, nclk, nrst, drun, nrun
70 3 sybreon
   );
71
   // Data WB bus width
72
   parameter DSIZ = 32;
73
 
74
   // Data WB I/F
75
   output [31:0] dwb_dat_o;
76
   input [31:0]  dwb_dat_i;
77
 
78
   // Internal I/F
79
   output [31:0] rREGA, rREGB;
80 22 sybreon
   output [31:0] sDWBDAT;
81
 
82 3 sybreon
   input         rDWBSTB, rDWBWE;
83
   input [4:0]    rRA, rRB, rRD, rRD_;
84
   input [31:0]  rRESULT;
85
   input [1:0]    rFSM;
86 16 sybreon
   input [31:0]  rPC;
87 22 sybreon
   input [5:0]    rOPC;
88
   input [3:0]    rDWBSEL;
89 16 sybreon
   //, rPCNXT;
90 3 sybreon
   input         rLNK, rRWE;
91 16 sybreon
   input         nclk, nrst, drun, nrun;
92 3 sybreon
 
93
   // Register File
94
   reg [31:0]     r00,r01,r02,r03,r04,r05,r06,r07;
95
   reg [31:0]     r08,r09,r0A,r0B,r0C,r0D,r0E,r0F;
96
   reg [31:0]     r10,r11,r12,r13,r14,r15,r16,r17;
97
   reg [31:0]     r18,r19,r1A,r1B,r1C,r1D,r1E,r1F;
98
 
99
   // FLAGS
100 4 sybreon
   wire fWE = rRWE & ~rDWBWE;
101 3 sybreon
   wire fLNK = rLNK;
102
   wire fLD = rDWBSTB ^ rDWBWE;
103 4 sybreon
 
104 3 sybreon
   // PC Latch
105
   reg [31:0]     rPC_;
106
   always @(negedge nclk or negedge nrst)
107
     if (!nrst) begin
108
        /*AUTORESET*/
109
        // Beginning of autoreset for uninitialized flops
110
        rPC_ <= 32'h0;
111
        // End of automatics
112 16 sybreon
     end else if (nrun) begin
113 3 sybreon
        rPC_ <= #1 rPC;
114
     end
115
 
116
   // DWB data - Endian Correction
117 22 sybreon
   wire [31:0]    wDWBDAT;
118
   reg [31:0]     sDWBDAT;
119
   reg [31:0]     rDWBDAT;
120 5 sybreon
   assign        dwb_dat_o = {rDWBDAT[7:0],rDWBDAT[15:8],rDWBDAT[23:16],rDWBDAT[31:24]};
121 22 sybreon
   assign        wDWBDAT = {dwb_dat_i[7:0],dwb_dat_i[15:8],dwb_dat_i[23:16],dwb_dat_i[31:24]};
122 8 sybreon
 
123 22 sybreon
   always @(/*AUTOSENSE*/rDWBSEL or wDWBDAT)
124
     case (rDWBSEL)
125 24 sybreon
       default: sDWBDAT <= wDWBDAT;
126 23 sybreon
       4'hC: sDWBDAT <= {16'd0,wDWBDAT[31:16]};
127
       4'h3: sDWBDAT <= {16'd0,wDWBDAT[15:0]};
128
       4'h8: sDWBDAT <= {24'd0,wDWBDAT[31:24]};
129
       4'h4: sDWBDAT <= {24'd0,wDWBDAT[23:16]};
130
       4'h2: sDWBDAT <= {24'd0,wDWBDAT[15:8]};
131
       4'h1: sDWBDAT <= {24'd0,wDWBDAT[7:0]};
132 24 sybreon
       //default: sDWBDAT <= 32'h0;       
133 22 sybreon
     endcase // case (rDWBSEL)
134
 
135 8 sybreon
   // Forwarding Control
136
   wire          fDFWD = (rRD == rRD_) & fWE;
137
   wire          fMFWD = rDWBSTB & ~rDWBWE;
138 22 sybreon
   wire [31:0]    wRESULT = (fMFWD) ? sDWBDAT : rRESULT;
139
 
140 17 sybreon
   // Alternative Design
141
   reg [31:0]  rMEMA[0:31], rMEMB[0:31], rMEMD[0:31];
142 16 sybreon
   wire [31:0] wDDAT, wREGA, wREGB, wREGD, wWBDAT;
143
   wire        wDWE = (fLD | fLNK | fWE) & |rRD_ & nrun;
144 22 sybreon
   assign      wDDAT = (fLD) ? sDWBDAT :
145 16 sybreon
                       (fLNK) ? rPC_ : rRESULT;
146
   assign      wWBDAT = (fDFWD) ? wRESULT : wREGD;
147
 
148 17 sybreon
   assign      wREGA = rMEMA[rRA];
149
   assign      wREGB = rMEMB[rRB];
150
   assign      wREGD = rMEMD[rRD];
151 16 sybreon
 
152 17 sybreon
   always @(negedge nclk)
153
     if (wDWE) begin
154
        rMEMA[rRD_] <= wDDAT;
155
        rMEMB[rRD_] <= wDDAT;
156
        rMEMD[rRD_] <= wDDAT;
157
     end
158 22 sybreon
 
159
   // Resize
160
   reg [31:0] sWBDAT;
161
   always @(/*AUTOSENSE*/rOPC or wWBDAT)
162
     case (rOPC[1:0])
163
       2'o0: sWBDAT <= {(4){wWBDAT[7:0]}};
164
       2'o1: sWBDAT <= {(2){wWBDAT[15:0]}};
165
       default: sWBDAT <= wWBDAT;
166
     endcase // case (rOPC[1:0])
167 16 sybreon
 
168
   // PIPELINE REGISTERS //////////////////////////////////////////////////
169
 
170 17 sybreon
   reg [31:0] rREGA, rREGB;
171
   always @(/*AUTOSENSE*/wREGA or wREGB)
172
     begin
173
        rREGA <= #1 wREGA;
174
        rREGB <= #1 wREGB;
175
     end
176
 
177 16 sybreon
   always @(negedge nclk or negedge nrst)
178
     if (!nrst) begin
179
        /*AUTORESET*/
180
        // Beginning of autoreset for uninitialized flops
181
        rDWBDAT <= 32'h0;
182
        // End of automatics
183
     end else if (nrun) begin
184 22 sybreon
        rDWBDAT <= #1 sWBDAT;
185 16 sybreon
     end
186
 
187 17 sybreon
   // SIMULATION ONLY ///////////////////////////////////////////////////
188
   integer i;
189
   initial begin
190
      for (i=0;i<31;i=i+1) begin
191
         rMEMA[i] <= 0;
192
         rMEMB[i] <= 0;
193
         rMEMD[i] <= 0;
194
      end
195
   end
196 16 sybreon
 
197 3 sybreon
endmodule // aeMB_regfile
198
 
199 16 sybreon
 
200 3 sybreon
// Local Variables:
201
// verilog-library-directories:(".")
202
// verilog-library-files:("")
203
// End:

powered by: WebSVN 2.1.0

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