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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v7/] [rtl/] [twoway/] [FT64_regfile1w4r_oc.v] - Blame information for rev 60

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 60 robfinch
`timescale 1ns / 1ps
2
// ============================================================================
3
//        __
4
//   \\__/ o\    (C) 2018  Robert Finch, Waterloo
5
//    \  __ /    All rights reserved.
6
//     \/_//     robfinch<remove>@finitron.ca
7
//       ||
8
//
9
// This source file is free software: you can redistribute it and/or modify 
10
// it under the terms of the GNU Lesser General Public License as published 
11
// by the Free Software Foundation, either version 3 of the License, or     
12
// (at your option) any later version.                                      
13
//                                                                          
14
// This source file is distributed in the hope that it will be useful,      
15
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
16
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
17
// GNU General Public License for more details.                             
18
//                                                                          
19
// You should have received a copy of the GNU General Public License        
20
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
21
//
22
//
23
// Register file with two write ports and six read ports.
24
// ============================================================================
25
//
26
`include "FT64_config.vh"
27
 
28
module FT64_regfileRam_sim_oc(clka, ena, wea, addra, dina, clkb, enb, addrb, doutb);
29
parameter WID=64;
30
parameter RBIT = 11;
31
input clka;
32
input ena;
33
input [7:0] wea;
34
input [RBIT:0] addra;
35
input [WID-1:0] dina;
36
input clkb;
37
input enb;
38
input [RBIT:0] addrb;
39
output [WID-1:0] doutb;
40
 
41
integer n;
42
(* RAM_STYLE="BLOCK" *)
43
reg [64:0] mem [0:4095];
44
reg [RBIT:0] raddrb;
45
 
46
initial begin
47
        for (n = 0; n < 4096; n = n + 1)
48
                mem[n] = 0;
49
end
50
 
51
always @(posedge clka) if (ena & wea[0]) mem[addra][7:0] <= dina[7:0];
52
always @(posedge clka) if (ena & wea[1]) mem[addra][15:8] <= dina[15:8];
53
always @(posedge clka) if (ena & wea[2]) mem[addra][23:16] <= dina[23:16];
54
always @(posedge clka) if (ena & wea[3]) mem[addra][31:24] <= dina[31:24];
55
always @(posedge clka) if (ena & wea[4]) mem[addra][39:32] <= dina[39:32];
56
always @(posedge clka) if (ena & wea[5]) mem[addra][47:40] <= dina[47:40];
57
always @(posedge clka) if (ena & wea[6]) mem[addra][55:48] <= dina[55:48];
58
always @(posedge clka) if (ena & wea[7]) mem[addra][63:56] <= dina[63:56];
59
 
60
always @(posedge clkb)
61
        raddrb <= addrb;
62
assign doutb = mem[raddrb];
63
 
64
endmodule
65
 
66
module FT64_regfile1w4r_oc(clk, wr0, we0, wa0, i0,
67
        rclk, ra0, ra1, ra2, ra3, o0, o1, o2, o3);
68
parameter WID=64;
69
parameter RBIT = 11;
70
input clk;
71
input wr0;
72
input [7:0] we0;
73
input [RBIT:0] wa0;
74
input [WID-1:0] i0;
75
input rclk;
76
input [RBIT:0] ra0;
77
input [RBIT:0] ra1;
78
input [RBIT:0] ra2;
79
input [RBIT:0] ra3;
80
output [WID-1:0] o0;
81
output [WID-1:0] o1;
82
output [WID-1:0] o2;
83
output [WID-1:0] o3;
84
 
85
reg wr;
86
reg [RBIT:0] wa;
87
reg [WID-1:0] i;
88
reg [7:0] we;
89
wire [WID-1:0] o00, o01, o02, o03;
90
 
91
integer n;
92
 
93
`ifdef SIM
94
FT64_regfileRam_sim_oc urf10 (
95
  .clka(clk),
96
  .ena(wr),
97
  .wea(we),
98
  .addra(wa),
99
  .dina(i),
100
  .clkb(rclk),
101
  .enb(1'b1),
102
  .addrb(ra0),
103
  .doutb(o00)
104
);
105
 
106
FT64_regfileRam_sim_oc urf11 (
107
  .clka(clk),
108
  .ena(wr),
109
  .wea(we),
110
  .addra(wa),
111
  .dina(i),
112
  .clkb(rclk),
113
  .enb(1'b1),
114
  .addrb(ra1),
115
  .doutb(o01)
116
);
117
 
118
FT64_regfileRam_sim_oc urf12 (
119
  .clka(clk),
120
  .ena(wr),
121
  .wea(we),
122
  .addra(wa),
123
  .dina(i),
124
  .clkb(rclk),
125
  .enb(1'b1),
126
  .addrb(ra2),
127
  .doutb(o02)
128
);
129
 
130
FT64_regfileRam_sim_oc urf13 (
131
  .clka(clk),
132
  .ena(wr),
133
  .wea(we),
134
  .addra(wa),
135
  .dina(i),
136
  .clkb(rclk),
137
  .enb(1'b1),
138
  .addrb(ra3),
139
  .doutb(o03)
140
);
141
 
142
`else
143
FT64_regfileRam urf10 (
144
  .clka(clk),
145
  .ena(wr),
146
  .wea(we),
147
  .addra(wa),
148
  .dina(i),
149
  .douta(),
150
  .clkb(rclk),
151
  .enb(1'b1),
152
  .web(8'b0),
153
  .addrb(ra0),
154
  .dinb(64'h00),
155
  .doutb(o00)
156
);
157
 
158
FT64_regfileRam urf11 (
159
  .clka(clk),
160
  .ena(wr),
161
  .wea(we),
162
  .addra(wa),
163
  .dina(i),
164
  .douta(),
165
  .clkb(rclk),
166
  .enb(1'b1),
167
  .web(8'b0),
168
  .addrb(ra1),
169
  .dinb(64'h00),
170
  .doutb(o01)
171
);
172
 
173
FT64_regfileRam urf12 (
174
  .clka(clk),
175
  .ena(wr),
176
  .wea(we),
177
  .addra(wa),
178
  .dina(i),
179
  .douta(),
180
  .clkb(rclk),
181
  .enb(1'b1),
182
  .web(8'b0),
183
  .addrb(ra2),
184
  .dinb(64'h00),
185
  .doutb(o02)
186
);
187
 
188
FT64_regfileRam urf13 (
189
  .clka(clk),
190
  .ena(wr),
191
  .wea(we),
192
  .addra(wa),
193
  .dina(i),
194
  .douta(),
195
  .clkb(rclk),
196
  .enb(1'b1),
197
  .web(8'b0),
198
  .addrb(ra3),
199
  .dinb(64'h00),
200
  .doutb(o03)
201
);
202
 
203
`endif
204
 
205
always @*
206
begin
207
        wr <= wr0;
208
        we <= we0;
209
        wa <= wa0;
210
        i <= i0;
211
end
212
 
213
assign o0[7:0] = ra0[4:0]==5'd0 ? {8{1'b0}} :
214
        (wr0 && we0[0] && (ra0==wa0)) ? i0[7:0] : o00[7:0];
215
assign o0[15:8] = ra0[4:0]==5'd0 ? {8{1'b0}} :
216
        (wr0 && we0[1] && (ra0==wa0)) ? i0[15:8] : o00[15:8];
217
assign o0[23:16] = ra0[4:0]==5'd0 ? {8{1'b0}} :
218
        (wr0 && we0[2] && (ra0==wa0)) ? i0[23:16] : o00[23:16];
219
assign o0[31:24] = ra0[4:0]==5'd0 ? {8{1'b0}} :
220
        (wr0 && we0[3] && (ra0==wa0)) ? i0[31:24] : o00[31:24];
221
assign o0[39:32] = ra0[4:0]==5'd0 ? {8{1'b0}} :
222
        (wr0 && we0[4] && (ra0==wa0)) ? i0[39:32] : o00[39:32];
223
assign o0[47:40] = ra0[4:0]==5'd0 ? {8{1'b0}} :
224
        (wr0 && we0[5] && (ra0==wa0)) ? i0[47:40] : o00[47:40];
225
assign o0[55:48] = ra0[4:0]==5'd0 ? {8{1'b0}} :
226
        (wr0 && we0[6] && (ra0==wa0)) ? i0[55:48] : o00[55:48];
227
assign o0[63:56] = ra0[4:0]==5'd0 ? {8{1'b0}} :
228
        (wr0 && we0[7] && (ra0==wa0)) ? i0[63:56] : o00[63:56];
229
 
230
assign o1[7:0] = ra1[4:0]==5'd0 ? {8{1'b0}} :
231
        (wr0 && we0[0] && (ra1==wa0)) ? i0[7:0] : o01[7:0];
232
assign o1[15:8] = ra1[4:0]==5'd0 ? {8{1'b0}} :
233
        (wr0 && we0[1] && (ra1==wa0)) ? i0[15:8] : o01[15:8];
234
assign o1[23:16] = ra1[4:0]==5'd0 ? {8{1'b0}} :
235
        (wr0 && we0[2] && (ra1==wa0)) ? i0[23:16] : o01[23:16];
236
assign o1[31:24] = ra1[4:0]==5'd0 ? {8{1'b0}} :
237
        (wr0 && we0[3] && (ra1==wa0)) ? i0[31:24] : o01[31:24];
238
assign o1[39:32] = ra1[4:0]==5'd0 ? {8{1'b0}} :
239
        (wr0 && we0[4] && (ra1==wa0)) ? i0[39:32] : o01[39:32];
240
assign o1[47:40] = ra1[4:0]==5'd0 ? {8{1'b0}} :
241
        (wr0 && we0[5] && (ra1==wa0)) ? i0[47:40] : o01[47:40];
242
assign o1[55:48] = ra1[4:0]==5'd0 ? {8{1'b0}} :
243
        (wr0 && we0[6] && (ra1==wa0)) ? i0[55:48] : o01[55:48];
244
assign o1[63:56] = ra1[4:0]==5'd0 ? {8{1'b0}} :
245
        (wr0 && we0[7] && (ra1==wa0)) ? i0[63:56] : o01[63:56];
246
 
247
assign o2[7:0] = ra2[4:0]==5'd0 ? {8{1'b0}} :
248
        (wr0 && we0[0] && (ra2==wa0)) ? i0[7:0] : o02[7:0];
249
assign o2[15:8] = ra2[4:0]==5'd0 ? {8{1'b0}} :
250
        (wr0 && we0[1] && (ra2==wa0)) ? i0[15:8] : o02[15:8];
251
assign o2[23:16] = ra2[4:0]==5'd0 ? {8{1'b0}} :
252
        (wr0 && we0[2] && (ra2==wa0)) ? i0[23:16] : o02[23:16];
253
assign o2[31:24] = ra2[4:0]==5'd0 ? {8{1'b0}} :
254
        (wr0 && we0[3] && (ra2==wa0)) ? i0[31:24] : o02[31:24];
255
assign o2[39:32] = ra2[4:0]==5'd0 ? {8{1'b0}} :
256
        (wr0 && we0[4] && (ra2==wa0)) ? i0[39:32] : o02[39:32];
257
assign o2[47:40] = ra2[4:0]==5'd0 ? {8{1'b0}} :
258
        (wr0 && we0[5] && (ra2==wa0)) ? i0[47:40] : o02[47:40];
259
assign o2[55:48] = ra2[4:0]==5'd0 ? {8{1'b0}} :
260
        (wr0 && we0[6] && (ra2==wa0)) ? i0[55:48] : o02[55:48];
261
assign o2[63:56] = ra2[4:0]==5'd0 ? {8{1'b0}} :
262
        (wr0 && we0[7] && (ra2==wa0)) ? i0[63:56] : o02[63:56];
263
 
264
assign o3[7:0] = ra3[4:0]==5'd0 ? {8{1'b0}} :
265
        (wr0 && we0[0] && (ra3==wa0)) ? i0[7:0] : o03[7:0];
266
assign o3[15:8] = ra3[4:0]==5'd0 ? {8{1'b0}} :
267
        (wr0 && we0[1] && (ra3==wa0)) ? i0[15:8] : o03[15:8];
268
assign o3[23:16] = ra3[4:0]==5'd0 ? {8{1'b0}} :
269
        (wr0 && we0[2] && (ra3==wa0)) ? i0[23:16] : o03[23:16];
270
assign o3[31:24] = ra3[4:0]==5'd0 ? {8{1'b0}} :
271
        (wr0 && we0[3] && (ra3==wa0)) ? i0[31:24] : o03[31:24];
272
assign o3[39:32] = ra3[4:0]==5'd0 ? {8{1'b0}} :
273
        (wr0 && we0[4] && (ra3==wa0)) ? i0[39:32] : o03[39:32];
274
assign o3[47:40] = ra3[4:0]==5'd0 ? {8{1'b0}} :
275
        (wr0 && we0[5] && (ra3==wa0)) ? i0[47:40] : o03[47:40];
276
assign o3[55:48] = ra3[4:0]==5'd0 ? {8{1'b0}} :
277
        (wr0 && we0[6] && (ra3==wa0)) ? i0[55:48] : o03[55:48];
278
assign o3[63:56] = ra3[4:0]==5'd0 ? {8{1'b0}} :
279
        (wr0 && we0[7] && (ra3==wa0)) ? i0[63:56] : o03[63:56];
280
 
281
endmodule
282
 

powered by: WebSVN 2.1.0

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