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 23

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

Line No. Rev Author Line
1 3 sybreon
/*
2 23 sybreon
 * $Id: aeMB_regfile.v,v 1.10 2007-04-25 22:52: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 23 sybreon
 * Revision 1.9  2007/04/25 22:15:04  sybreon
29
 * Added support for 8-bit and 16-bit data types.
30
 *
31 22 sybreon
 * Revision 1.8  2007/04/12 20:21:33  sybreon
32
 * Moved testbench into /sim/verilog.
33
 * Simulation cleanups.
34
 *
35 18 sybreon
 * Revision 1.7  2007/04/11 16:30:06  sybreon
36
 * Cosmetic changes
37
 *
38 17 sybreon
 * Revision 1.6  2007/04/11 04:30:43  sybreon
39
 * Added pipeline stalling from incomplete bus cycles.
40
 * Separated sync and async portions of code.
41
 *
42 16 sybreon
 * Revision 1.5  2007/04/04 14:08:34  sybreon
43
 * Added initial interrupt/exception support.
44
 *
45 14 sybreon
 * Revision 1.4  2007/04/04 06:11:47  sybreon
46
 * Fixed memory read-write data hazard
47
 *
48 8 sybreon
 * Revision 1.3  2007/04/03 14:46:26  sybreon
49
 * Fixed endian correction issues on data bus.
50
 *
51 5 sybreon
 * Revision 1.2  2007/03/26 12:21:31  sybreon
52
 * Fixed a minor bug where RD is trashed by a STORE instruction. Spotted by Joon Lee.
53
 *
54 4 sybreon
 * Revision 1.1  2007/03/09 17:52:17  sybreon
55
 * initial import
56 3 sybreon
 *
57
 */
58
 
59 16 sybreon
// 1284@78 - REG
60
// 227@141 - RAM
61 3 sybreon
module aeMB_regfile(/*AUTOARG*/
62
   // Outputs
63 22 sybreon
   dwb_dat_o, rREGA, rREGB, sDWBDAT,
64 3 sybreon
   // Inputs
65
   dwb_dat_i, rDWBSTB, rDWBWE, rRA, rRB, rRD, rRD_, rRESULT, rFSM,
66 22 sybreon
   rPC, rOPC, rDWBSEL, rLNK, rRWE, nclk, nrst, drun, nrun
67 3 sybreon
   );
68
   // Data WB bus width
69
   parameter DSIZ = 32;
70
 
71
   // Data WB I/F
72
   output [31:0] dwb_dat_o;
73
   input [31:0]  dwb_dat_i;
74
 
75
   // Internal I/F
76
   output [31:0] rREGA, rREGB;
77 22 sybreon
   output [31:0] sDWBDAT;
78
 
79 3 sybreon
   input         rDWBSTB, rDWBWE;
80
   input [4:0]    rRA, rRB, rRD, rRD_;
81
   input [31:0]  rRESULT;
82
   input [1:0]    rFSM;
83 16 sybreon
   input [31:0]  rPC;
84 22 sybreon
   input [5:0]    rOPC;
85
   input [3:0]    rDWBSEL;
86 16 sybreon
   //, rPCNXT;
87 3 sybreon
   input         rLNK, rRWE;
88 16 sybreon
   input         nclk, nrst, drun, nrun;
89 3 sybreon
 
90
   // Register File
91
   reg [31:0]     r00,r01,r02,r03,r04,r05,r06,r07;
92
   reg [31:0]     r08,r09,r0A,r0B,r0C,r0D,r0E,r0F;
93
   reg [31:0]     r10,r11,r12,r13,r14,r15,r16,r17;
94
   reg [31:0]     r18,r19,r1A,r1B,r1C,r1D,r1E,r1F;
95
 
96
   // FLAGS
97 4 sybreon
   wire fWE = rRWE & ~rDWBWE;
98 3 sybreon
   wire fLNK = rLNK;
99
   wire fLD = rDWBSTB ^ rDWBWE;
100 4 sybreon
 
101 3 sybreon
   // PC Latch
102
   reg [31:0]     rPC_;
103
   always @(negedge nclk or negedge nrst)
104
     if (!nrst) begin
105
        /*AUTORESET*/
106
        // Beginning of autoreset for uninitialized flops
107
        rPC_ <= 32'h0;
108
        // End of automatics
109 16 sybreon
     end else if (nrun) begin
110 3 sybreon
        rPC_ <= #1 rPC;
111
     end
112
 
113
   // DWB data - Endian Correction
114 22 sybreon
   wire [31:0]    wDWBDAT;
115
   reg [31:0]     sDWBDAT;
116
   reg [31:0]     rDWBDAT;
117 5 sybreon
   assign        dwb_dat_o = {rDWBDAT[7:0],rDWBDAT[15:8],rDWBDAT[23:16],rDWBDAT[31:24]};
118 22 sybreon
   assign        wDWBDAT = {dwb_dat_i[7:0],dwb_dat_i[15:8],dwb_dat_i[23:16],dwb_dat_i[31:24]};
119 8 sybreon
 
120 22 sybreon
   always @(/*AUTOSENSE*/rDWBSEL or wDWBDAT)
121
     case (rDWBSEL)
122
       4'hF: sDWBDAT <= wDWBDAT;
123 23 sybreon
       4'hC: sDWBDAT <= {16'd0,wDWBDAT[31:16]};
124
       4'h3: sDWBDAT <= {16'd0,wDWBDAT[15:0]};
125
       4'h8: sDWBDAT <= {24'd0,wDWBDAT[31:24]};
126
       4'h4: sDWBDAT <= {24'd0,wDWBDAT[23:16]};
127
       4'h2: sDWBDAT <= {24'd0,wDWBDAT[15:8]};
128
       4'h1: sDWBDAT <= {24'd0,wDWBDAT[7:0]};
129 22 sybreon
       default: sDWBDAT <= 32'h0;
130
     endcase // case (rDWBSEL)
131
 
132 8 sybreon
   // Forwarding Control
133
   wire          fDFWD = (rRD == rRD_) & fWE;
134
   wire          fMFWD = rDWBSTB & ~rDWBWE;
135 22 sybreon
   wire [31:0]    wRESULT = (fMFWD) ? sDWBDAT : rRESULT;
136
 
137 17 sybreon
   // Alternative Design
138
   reg [31:0]  rMEMA[0:31], rMEMB[0:31], rMEMD[0:31];
139 16 sybreon
   wire [31:0] wDDAT, wREGA, wREGB, wREGD, wWBDAT;
140
   wire        wDWE = (fLD | fLNK | fWE) & |rRD_ & nrun;
141 22 sybreon
   assign      wDDAT = (fLD) ? sDWBDAT :
142 16 sybreon
                       (fLNK) ? rPC_ : rRESULT;
143
   assign      wWBDAT = (fDFWD) ? wRESULT : wREGD;
144
 
145 17 sybreon
   assign      wREGA = rMEMA[rRA];
146
   assign      wREGB = rMEMB[rRB];
147
   assign      wREGD = rMEMD[rRD];
148 16 sybreon
 
149 17 sybreon
   always @(negedge nclk)
150
     if (wDWE) begin
151
        rMEMA[rRD_] <= wDDAT;
152
        rMEMB[rRD_] <= wDDAT;
153
        rMEMD[rRD_] <= wDDAT;
154
     end
155 22 sybreon
 
156
   // Resize
157
   reg [31:0] sWBDAT;
158
   always @(/*AUTOSENSE*/rOPC or wWBDAT)
159
     case (rOPC[1:0])
160
       2'o0: sWBDAT <= {(4){wWBDAT[7:0]}};
161
       2'o1: sWBDAT <= {(2){wWBDAT[15:0]}};
162
       default: sWBDAT <= wWBDAT;
163
     endcase // case (rOPC[1:0])
164 16 sybreon
 
165
   // PIPELINE REGISTERS //////////////////////////////////////////////////
166
 
167 17 sybreon
   reg [31:0] rREGA, rREGB;
168
   always @(/*AUTOSENSE*/wREGA or wREGB)
169
     begin
170
        rREGA <= #1 wREGA;
171
        rREGB <= #1 wREGB;
172
     end
173
 
174 16 sybreon
   always @(negedge nclk or negedge nrst)
175
     if (!nrst) begin
176
        /*AUTORESET*/
177
        // Beginning of autoreset for uninitialized flops
178
        rDWBDAT <= 32'h0;
179
        // End of automatics
180
     end else if (nrun) begin
181 22 sybreon
        rDWBDAT <= #1 sWBDAT;
182 16 sybreon
     end
183
 
184 17 sybreon
   // SIMULATION ONLY ///////////////////////////////////////////////////
185
   integer i;
186
   initial begin
187
      for (i=0;i<31;i=i+1) begin
188
         rMEMA[i] <= 0;
189
         rMEMB[i] <= 0;
190
         rMEMD[i] <= 0;
191
      end
192
   end
193 16 sybreon
 
194 3 sybreon
endmodule // aeMB_regfile
195
 
196 16 sybreon
 
197 3 sybreon
// Local Variables:
198
// verilog-library-directories:(".")
199
// verilog-library-files:("")
200
// End:

powered by: WebSVN 2.1.0

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