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

Subversion Repositories aemb

[/] [aemb/] [trunk/] [rtl/] [verilog/] [aeMB2_gprf.v] - Blame information for rev 131

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

Line No. Rev Author Line
1 131 sybreon
/* $Id: aeMB2_gprf.v,v 1.3 2008-04-26 01:09:06 sybreon Exp $
2 118 sybreon
**
3
** AEMB2 EDK 6.2 COMPATIBLE CORE
4
** Copyright (C) 2004-2008 Shawn Tan <shawn.tan@aeste.net>
5
**
6
** This file is part of AEMB.
7
**
8
** AEMB is free software: you can redistribute it and/or modify it
9
** under the terms of the GNU Lesser General Public License as
10
** published by the Free Software Foundation, either version 3 of the
11
** License, or (at your option) any later version.
12
**
13
** AEMB is distributed in the hope that it will be useful, but WITHOUT
14
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
** or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
16
** Public License for more details.
17
**
18
** You should have received a copy of the GNU Lesser General Public
19
** License along with AEMB. If not, see <http:**www.gnu.org/licenses/>.
20
*/
21
/**
22
 * General Purpose Register File
23
 * @aeMB2_gprf.v
24
 
25
 * Dual set of 32 general purpose registers for the core. These are
26
   R0-R31. A zero is written to R0 for both sets during reset and
27
   maintained after that.
28
 
29
 */
30
 
31
module aeMB2_gprf (/*AUTOARG*/
32
   // Outputs
33
   opa_if, opb_if, opd_if,
34
   // Inputs
35
   mux_of, mux_ex, ich_dat, rd_of, rd_ex, sel_mx, rpc_mx, xwb_mx,
36
   dwb_mx, alu_mx, sfr_mx, mul_mx, bsf_mx, gclk, grst, dena, gpha
37
   );
38
   parameter AEMB_HTX = 1;
39
 
40
   // INTERNAL
41
   output [31:0] opa_if,
42
                 opb_if,
43
                 opd_if;
44
 
45
   input [2:0]    mux_of,
46
                 mux_ex;
47
   input [31:0]  ich_dat;
48
   input [4:0]    rd_of,
49
                 rd_ex;
50
 
51
   // DATA SOURCSE
52
   input [3:0]    sel_mx;
53
   input [31:2]  rpc_mx;
54
   input [31:0]  xwb_mx,
55
                 dwb_mx,
56
                 alu_mx,
57
                 sfr_mx,
58
                 mul_mx,
59
                 bsf_mx;
60
 
61
   // SYSTEM
62
   input         gclk,
63
                 grst,
64
                 dena,
65
                 gpha;
66
 
67
   /*AUTOWIRE*/
68
   /*AUTOREG*/
69
 
70
   wire [31:0]    opd_wr;
71
   reg [31:0]     rMEMA[63:0],
72
                 rMEMB[63:0],
73
                 rMEMD[63:0];
74
   reg [31:0]     mem_mx;
75
   reg [31:0]     regd;
76
   reg           wrb_fb;
77
   reg [4:0]      rd_mx;
78
   reg [2:0]      mux_mx;
79
 
80 131 sybreon
   // PIPELINE
81 118 sybreon
   always @(posedge gclk)
82
     if (grst) begin
83
        /*AUTORESET*/
84
        // Beginning of autoreset for uninitialized flops
85
        mux_mx <= 3'h0;
86
        rd_mx <= 5'h0;
87
        wrb_fb <= 1'h0;
88
        // End of automatics
89
     end else if (dena) begin
90
        wrb_fb <= #1 |rd_ex & |mux_ex; // FIXME: check mux
91
 
92
        rd_mx <= #1 rd_ex;
93
        mux_mx <= #1 mux_ex;
94
     end
95
 
96
   // LOAD SIZER   
97 120 sybreon
   always @(/*AUTOSENSE*/dwb_mx or sel_mx) begin
98 118 sybreon
      case (sel_mx)
99
        // 8'bits
100
        4'h8: mem_mx <= #1 {24'd0, dwb_mx[31:24]};
101
        4'h4: mem_mx <= #1 {24'd0, dwb_mx[23:16]};
102
        4'h2: mem_mx <= #1 {24'd0, dwb_mx[15:8]};
103
        4'h1: mem_mx <= #1 {24'd0, dwb_mx[7:0]};
104
        // 16'bits
105
        4'hC: mem_mx <= #1 {16'd0, dwb_mx[31:16]};
106
        4'h3: mem_mx <= #1 {16'd0, dwb_mx[15:0]};
107
        // 32'bits
108
        4'hF: mem_mx <= #1 dwb_mx;
109 120 sybreon
        //4'h0: mem_mx <= #1 xwb_mx;
110 118 sybreon
        default: mem_mx <= 32'hX;
111
      endcase // case (sel_mx)
112
   end // always @ (...
113
 
114
   // SELECT SOURCE
115
   localparam [2:0] MUX_ALU = 3'o7,
116
                    MUX_SFR = 3'o5,
117
                    MUX_BSF = 3'o4,
118
                    MUX_MUL = 3'o3,
119
                    MUX_MEM = 3'o2,
120
                    MUX_RPC = 3'o1,
121
                    MUX_NOP = 3'o0;
122
 
123
   always @(/*AUTOSENSE*/alu_mx or bsf_mx or mem_mx or mul_mx
124
            or mux_mx or rpc_mx or sfr_mx)
125
     case (mux_mx)
126
       MUX_ALU: regd <= #1 alu_mx; // ALU
127
       MUX_RPC: regd <= #1 {rpc_mx[31:2], 2'o0}; // PC Link
128
       MUX_MEM: regd <= #1 mem_mx; // RAM/FSL
129
       MUX_MUL: regd <= #1 mul_mx; // MULTIPLIER
130
       MUX_BSF: regd <= #1 bsf_mx; // SHIFTER
131
       MUX_NOP: regd <= #1 32'h0;
132
       MUX_SFR: regd <= #1 sfr_mx;
133
       default: regd <= #1 32'hX;
134
     endcase // case (mux_rd)
135
 
136
 
137
   // REGISTER FILE - Infer LUT memory
138
   wire [5:0]     wRD = {gpha, ich_dat[25:21]};
139
   wire [5:0]     wRA = {gpha, ich_dat[20:16]};
140
   wire [5:0]     wRB = {gpha, ich_dat[15:11]};
141
   wire [5:0]     wRW = {!gpha, rd_mx};
142
 
143
   assign        opd_wr = rMEMD[wRW];
144
   assign        opa_if = rMEMA[wRA];
145
   assign        opb_if = rMEMB[wRB];
146
   assign        opd_if = rMEMD[wRD];
147
 
148
   always @(posedge gclk)
149
     if (grst | (dena & wrb_fb)) begin
150
        rMEMA[wRW] <= #1 regd;
151
        rMEMB[wRW] <= #1 regd;
152
        rMEMD[wRW] <= #1 regd;
153
     end
154
 
155
   // synopsys translate_off
156
   // initialise RAM to random contents for simulation only
157
   integer       i;
158
   initial begin
159
      for (i=0;i<64;i=i+1) begin
160
         rMEMA[i] <= $random;
161
         rMEMB[i] <= $random;
162
         rMEMD[i] <= $random;
163
      end
164
   end
165
   // synopsys translate_on
166
 
167
endmodule // aeMB2_gprf
168
 
169 131 sybreon
/*
170
 $Log: not supported by cvs2svn $
171
 Revision 1.2  2008/04/20 16:34:32  sybreon
172
 Basic version with some features left out.
173
 
174
 Revision 1.1  2008/04/18 00:21:52  sybreon
175
 Initial import.
176
*/

powered by: WebSVN 2.1.0

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