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 22

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

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

powered by: WebSVN 2.1.0

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