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

Subversion Repositories or1200_hp

[/] [or1200_hp/] [trunk/] [rtl/] [rtl_cm3/] [verilog/] [or1200_rf.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 tobil
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  OR1200's register file inside CPU                           ////
4
////                                                              ////
5
////  This file is part of the OpenRISC 1200 project              ////
6
////  http://www.opencores.org/cores/or1k/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Instantiation of register file memories                     ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////   - make it smaller and faster                               ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Damjan Lampret, lampret@opencores.org                 ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
// CVS Revision History
45
//
46
// $Log: not supported by cvs2svn $
47
// Revision 1.2  2002/06/08 16:19:09  lampret
48
// Added generic flip-flop based memory macro instantiation.
49
//
50
// Revision 1.1  2002/01/03 08:16:15  lampret
51
// New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs.
52
//
53
// Revision 1.13  2001/11/20 18:46:15  simons
54
// Break point bug fixed
55
//
56
// Revision 1.12  2001/11/13 10:02:21  lampret
57
// Added 'setpc'. Renamed some signals (except_flushpipe into flushpipe etc)
58
//
59
// Revision 1.11  2001/11/12 01:45:40  lampret
60
// Moved flag bit into SR. Changed RF enable from constant enable to dynamic enable for read ports.
61
//
62
// Revision 1.10  2001/11/10 03:43:57  lampret
63
// Fixed exceptions.
64
//
65
// Revision 1.9  2001/10/21 17:57:16  lampret
66
// Removed params from generic_XX.v. Added translate_off/on in sprs.v and id.v. Removed spr_addr from dc.v and ic.v. Fixed CR+LF.
67
//
68
// Revision 1.8  2001/10/14 13:12:10  lampret
69
// MP3 version.
70
//
71
// Revision 1.1.1.1  2001/10/06 10:18:36  igorm
72
// no message
73
//
74
// Revision 1.3  2001/08/09 13:39:33  lampret
75
// Major clean-up.
76
//
77
// Revision 1.2  2001/07/22 03:31:54  lampret
78
// Fixed RAM's oen bug. Cache bypass under development.
79
//
80
// Revision 1.1  2001/07/20 00:46:21  lampret
81
// Development version of RTL. Libraries are missing.
82
//
83
//
84
 
85
// synopsys translate_off
86
`include "timescale.v"
87
// synopsys translate_on
88
`include "or1200_defines.v"
89
 
90
module or1200_rf_cm3(
91
                clk_i_cml_1,
92
                clk_i_cml_2,
93
                cmls,
94
 
95
        // Clock and reset
96
        clk, rst,
97
 
98
        // Write i/f
99
        supv, wb_freeze, addrw, dataw, we, flushpipe,
100
 
101
        // Read i/f
102
        id_freeze, addra, addrb, dataa, datab, rda, rdb,
103
 
104
        // Debug
105
        spr_cs, spr_write, spr_addr, spr_dat_i, spr_dat_o
106
);
107
 
108
 
109
input clk_i_cml_1;
110
input clk_i_cml_2;
111
input [1:0] cmls;
112
reg  wb_freeze_cml_2;
113
reg [ 5 - 1 : 0 ] addrw_cml_1;
114
reg [ 32 - 1 : 0 ] dataw_cml_2;
115
reg  spr_write_cml_2;
116
reg [ 31 : 0 ] spr_addr_cml_2;
117
reg [ 31 : 0 ] spr_addr_cml_1;
118
reg [ 31 : 0 ] spr_dat_i_cml_2;
119
reg [ 31 : 0 ] spr_dat_i_cml_1;
120
reg [ 32 - 1 : 0 ] from_rfa_cml_2;
121
reg [ 32 : 0 ] dataa_saved_cml_2;
122
reg [ 32 : 0 ] dataa_saved_cml_1;
123
reg [ 32 : 0 ] datab_saved_cml_2;
124
reg [ 32 : 0 ] datab_saved_cml_1;
125
reg [ 5 - 1 : 0 ] rf_addrw_cml_2;
126
reg  spr_valid_cml_2;
127
reg  rf_we_allow_cml_2;
128
reg  rf_we_allow_cml_1;
129
reg [ 32 - 1 : 0 ] from_rfa_int_cml_1;
130
reg [ 32 - 1 : 0 ] from_rfb_int_cml_2;
131
reg [ 32 - 1 : 0 ] from_rfb_int_cml_1;
132
reg [ 4 : 0 ] rf_addra_reg_cml_2;
133
reg [ 4 : 0 ] rf_addra_reg_cml_1;
134
reg [ 4 : 0 ] rf_addrb_reg_cml_2;
135
reg [ 4 : 0 ] rf_addrb_reg_cml_1;
136
 
137
 
138
 
139
parameter dw = `OR1200_OPERAND_WIDTH;
140
parameter aw = `OR1200_REGFILE_ADDR_WIDTH;
141
 
142
//
143
// I/O
144
//
145
 
146
//
147
// Clock and reset
148
//
149
input                           clk;
150
input                           rst;
151
 
152
//
153
// Write i/f
154
//
155
input                           supv;
156
input                           wb_freeze;
157
input   [aw-1:0]         addrw;
158
input   [dw-1:0]         dataw;
159
input                           we;
160
input                           flushpipe;
161
 
162
//
163
// Read i/f
164
//
165
input                           id_freeze;
166
input   [aw-1:0]         addra;
167
input   [aw-1:0]         addrb;
168
output  [dw-1:0]         dataa;
169
output  [dw-1:0]         datab;
170
input                           rda;
171
input                           rdb;
172
 
173
//
174
// SPR access for debugging purposes
175
//
176
input                           spr_cs;
177
input                           spr_write;
178
input   [31:0]                   spr_addr;
179
input   [31:0]                   spr_dat_i;
180
output  [31:0]                   spr_dat_o;
181
 
182
//
183
// Internal wires and regs
184
//
185
wire    [dw-1:0]         from_rfa;
186
wire    [dw-1:0]         from_rfb;
187
reg     [dw:0]                   dataa_saved;
188
reg     [dw:0]                   datab_saved;
189
wire    [aw-1:0]         rf_addra;
190
wire    [aw-1:0]         rf_addrw;
191
wire    [dw-1:0]         rf_dataw;
192
wire                            rf_we;
193
wire                            spr_valid;
194
wire                            rf_ena;
195
wire                            rf_enb;
196
reg                             rf_we_allow;
197
 
198
//
199
// SPR access is valid when spr_cs is asserted and
200
// SPR address matches GPR addresses
201
//
202
 
203
// SynEDA CoreMultiplier
204
// assignment(s): spr_valid
205
// replace(s): spr_addr
206
assign spr_valid = spr_cs & (spr_addr_cml_1[10:5] == `OR1200_SPR_RF);
207
 
208
//
209
// SPR data output is always from RF A
210
//
211
assign spr_dat_o = from_rfa;
212
 
213
//
214
// Operand A comes from RF or from saved A register
215
//
216
 
217
// SynEDA CoreMultiplier
218
// assignment(s): dataa
219
// replace(s): from_rfa, dataa_saved
220
assign dataa = (dataa_saved_cml_2[32]) ? dataa_saved_cml_2[31:0] : from_rfa_cml_2;
221
 
222
//
223
// Operand B comes from RF or from saved B register
224
//
225
 
226
// SynEDA CoreMultiplier
227
// assignment(s): datab
228
// replace(s): datab_saved
229
assign datab = (datab_saved_cml_2[32]) ? datab_saved_cml_2[31:0] : from_rfb;
230
 
231
//
232
// RF A read address is either from SPRS or normal from CPU control
233
//
234
 
235
// SynEDA CoreMultiplier
236
// assignment(s): rf_addra
237
// replace(s): spr_write, spr_addr, spr_valid
238
assign rf_addra = (spr_valid_cml_2 & !spr_write_cml_2) ? spr_addr_cml_2[4:0] : addra;
239
 
240
//
241
// RF write address is either from SPRS or normal from CPU control
242
//
243
 
244
// SynEDA CoreMultiplier
245
// assignment(s): rf_addrw
246
// replace(s): addrw, spr_addr
247
assign rf_addrw = (spr_valid & spr_write) ? spr_addr_cml_1[4:0] : addrw_cml_1;
248
 
249
//
250
// RF write data is either from SPRS or normal from CPU datapath
251
//
252
 
253
// SynEDA CoreMultiplier
254
// assignment(s): rf_dataw
255
// replace(s): dataw, spr_write, spr_dat_i, spr_valid
256
assign rf_dataw = (spr_valid_cml_2 & spr_write_cml_2) ? spr_dat_i_cml_2 : dataw_cml_2;
257
 
258
//
259
// RF write enable is either from SPRS or normal from CPU control
260
//
261
 
262
// SynEDA CoreMultiplier
263
// assignment(s): rf_we_allow
264
// replace(s): wb_freeze, rf_we_allow
265
always @(posedge rst or posedge clk)
266
        if (rst)
267
                rf_we_allow <= #1 1'b1;
268
        else begin  rf_we_allow <= rf_we_allow_cml_2; if (~wb_freeze_cml_2)
269
                rf_we_allow <= #1 ~flushpipe; end
270
 
271
 
272
// SynEDA CoreMultiplier
273
// assignment(s): rf_we
274
// replace(s): wb_freeze, spr_write, rf_addrw, spr_valid, rf_we_allow
275
assign rf_we = ((spr_valid_cml_2 & spr_write_cml_2) | (we & ~wb_freeze_cml_2)) & rf_we_allow_cml_2 & (supv | (|rf_addrw_cml_2));
276
 
277
//
278
// CS RF A asserted when instruction reads operand A and ID stage
279
// is not stalled
280
//
281
 
282
// SynEDA CoreMultiplier
283
// assignment(s): rf_ena
284
// replace(s): spr_valid
285
assign rf_ena = rda & ~id_freeze | spr_valid_cml_2;     // probably works with fixed binutils
286
// assign rf_ena = 1'b1;                        // does not work with single-stepping
287
//assign rf_ena = ~id_freeze | spr_valid;       // works with broken binutils 
288
 
289
//
290
// CS RF B asserted when instruction reads operand B and ID stage
291
// is not stalled
292
//
293
 
294
// SynEDA CoreMultiplier
295
// assignment(s): rf_enb
296
// replace(s): spr_valid
297
assign rf_enb = rdb & ~id_freeze | spr_valid_cml_2;
298
// assign rf_enb = 1'b1;
299
//assign rf_enb = ~id_freeze | spr_valid;       // works with broken binutils 
300
 
301
//
302
// Stores operand from RF_A into temp reg when pipeline is frozen
303
//
304
 
305
// SynEDA CoreMultiplier
306
// assignment(s): dataa_saved
307
// replace(s): from_rfa, dataa_saved
308
always @(posedge clk or posedge rst)
309
        if (rst) begin
310
                dataa_saved <= #1 33'b0;
311
        end
312
        else begin  dataa_saved <= dataa_saved_cml_2; if (id_freeze & !dataa_saved_cml_2[32]) begin
313
                dataa_saved <= #1 {1'b1, from_rfa_cml_2};
314
        end
315
        else if (!id_freeze)
316
                dataa_saved <= #1 33'b0; end
317
 
318
//
319
// Stores operand from RF_B into temp reg when pipeline is frozen
320
//
321
 
322
// SynEDA CoreMultiplier
323
// assignment(s): datab_saved
324
// replace(s): datab_saved
325
always @(posedge clk or posedge rst)
326
        if (rst) begin
327
                datab_saved <= #1 33'b0;
328
        end
329
        else begin  datab_saved <= datab_saved_cml_2; if (id_freeze & !datab_saved_cml_2[32]) begin
330
                datab_saved <= #1 {1'b1, from_rfb};
331
        end
332
        else if (!id_freeze)
333
                datab_saved <= #1 33'b0; end
334
 
335
`ifdef OR1200_RFRAM_TWOPORT
336
 
337
//
338
// Instantiation of register file two-port RAM A
339
//
340
or1200_tpram_32x32 rf_a(
341
        // Port A
342
        .clk_a(clk),
343
        .rst_a(rst),
344
        .ce_a(rf_ena),
345
        .we_a(1'b0),
346
        .oe_a(1'b1),
347
        .addr_a(rf_addra),
348
        .di_a(32'h0000_0000),
349
        .do_a(from_rfa),
350
 
351
        // Port B
352
        .clk_b(clk),
353
        .rst_b(rst),
354
        .ce_b(rf_we),
355
        .we_b(rf_we),
356
        .oe_b(1'b0),
357
        .addr_b(rf_addrw),
358
        .di_b(rf_dataw),
359
        .do_b()
360
);
361
 
362
//
363
// Instantiation of register file two-port RAM B
364
//
365
or1200_tpram_32x32 rf_b(
366
        // Port A
367
        .clk_a(clk),
368
        .rst_a(rst),
369
        .ce_a(rf_enb),
370
        .we_a(1'b0),
371
        .oe_a(1'b1),
372
        .addr_a(addrb),
373
        .di_a(32'h0000_0000),
374
        .do_a(from_rfb),
375
 
376
        // Port B
377
        .clk_b(clk),
378
        .rst_b(rst),
379
        .ce_b(rf_we),
380
        .we_b(rf_we),
381
        .oe_b(1'b0),
382
        .addr_b(rf_addrw),
383
        .di_b(rf_dataw),
384
        .do_b()
385
);
386
 
387
`else
388
 
389
`ifdef OR1200_RFRAM_DUALPORT
390
 
391
//
392
// Instantiation of register file two-port RAM A
393
//
394
or1200_dpram_32x32 rf_a(
395
        // Port A
396
        .clk_a(clk),
397
        .rst_a(rst),
398
        .ce_a(rf_ena),
399
        .oe_a(1'b1),
400
        .addr_a(rf_addra),
401
        .do_a(from_rfa),
402
 
403
        // Port B
404
        .clk_b(clk),
405
        .rst_b(rst),
406
        .ce_b(rf_we),
407
        .we_b(rf_we),
408
        .addr_b(rf_addrw),
409
        .di_b(rf_dataw)
410
);
411
 
412
//
413
// Instantiation of register file two-port RAM B
414
//
415
or1200_dpram_32x32 rf_b(
416
        // Port A
417
        .clk_a(clk),
418
        .rst_a(rst),
419
        .ce_a(rf_enb),
420
        .oe_a(1'b1),
421
        .addr_a(addrb),
422
        .do_a(from_rfb),
423
 
424
        // Port B
425
        .clk_b(clk),
426
        .rst_b(rst),
427
        .ce_b(rf_we),
428
        .we_b(rf_we),
429
        .addr_b(rf_addrw),
430
        .di_b(rf_dataw)
431
);
432
 
433
`else
434
 
435
`ifdef OR1200_RFRAM_GENERIC
436
 
437
//
438
// Instantiation of generic (flip-flop based) register file
439
//
440
or1200_rfram_generic rf_a(
441
        // Clock and reset
442
        .clk(clk),
443
        .rst(rst),
444
 
445
        // Port A
446
        .ce_a(rf_ena),
447
        .addr_a(rf_addra),
448
        .do_a(from_rfa),
449
 
450
        // Port B
451
        .ce_b(rf_enb),
452
        .addr_b(addrb),
453
        .do_b(from_rfb),
454
 
455
        // Port W
456
        .ce_w(rf_we),
457
        .we_w(rf_we),
458
        .addr_w(rf_addrw),
459
        .di_w(rf_dataw)
460
);
461
 
462
`else
463
 
464
 
465
`ifdef OR1200_RAM_MODELS_VIRTEX
466
 
467
//
468
//      Non-generic FPGA model instantiations
469
//
470
 
471
//      write port: no add-reg
472
//      read port: add-reg
473
 
474
//      write port
475
//      a -> rf_addrw
476
//      d -> rf_dataw
477
//      we -> rf_we
478
//      spo -> open
479
 
480
//      read port
481
//      dpra -> rf_addra_reg registered
482
//      dpo -> from_rfa_int
483
 
484
wire    [dw-1:0]         from_rfa_int;
485
wire    [dw-1:0]         from_rfb_int;
486
 
487
reg     [4:0]    rf_addra_reg;           // RAM address a registered
488
reg     [4:0]    rf_addrb_reg;           // RAM address b registered
489
 
490
 
491
// SynEDA CoreMultiplier
492
// assignment(s): rf_addra_reg
493
// replace(s): rf_addra_reg
494
always @(posedge clk or posedge rst)
495
        if (rst)
496
                rf_addra_reg <= #1 {32{1'b0}};
497
        else begin  rf_addra_reg <= rf_addra_reg_cml_2; if (rf_ena)
498
                rf_addra_reg <= #1 rf_addra; end
499
 
500
 
501
 
502
// SynEDA CoreMultiplier
503
// assignment(s): rf_addrb_reg
504
// replace(s): rf_addrb_reg
505
always @(posedge clk or posedge rst)
506
        if (rst)
507
                rf_addrb_reg <= #1 {32{1'b0}};
508
        else begin  rf_addrb_reg <= rf_addrb_reg_cml_2; if (rf_enb)
509
                rf_addrb_reg <= #1 addrb; end
510
 
511
rf_sub_cm3_22 rf_sub_ia(
512
                .clk_i_cml_2(clk_i_cml_2),
513
                .cmls(cmls),
514
        .a(rf_addrw),
515
        .d(rf_dataw),
516
        .dpra(rf_addra_reg),
517
        .clk(clk),
518
        .we(rf_we),
519
        .spo(),
520
        .dpo(from_rfa_int));
521
 
522
rf_sub_cm3_24 rf_sub_ib(
523
                .clk_i_cml_2(clk_i_cml_2),
524
                .cmls(cmls),
525
        .a(rf_addrw),
526
        .d(rf_dataw),
527
        .dpra(rf_addrb_reg),
528
        .clk(clk),
529
        .we(rf_we),
530
        .spo(),
531
        .dpo(from_rfb_int));
532
 
533
 
534
// SynEDA CoreMultiplier
535
// assignment(s): from_rfa
536
// replace(s): from_rfa_int, rf_addra_reg
537
assign from_rfa = (rf_addra_reg_cml_1 == 5'h00) ? 32'h00000000 : from_rfa_int_cml_1;
538
 
539
// SynEDA CoreMultiplier
540
// assignment(s): from_rfb
541
// replace(s): from_rfb_int, rf_addrb_reg
542
assign from_rfb = (rf_addrb_reg_cml_2 == 5'h00) ? 32'h00000000 : from_rfb_int_cml_2;
543
 
544
`else
545
 
546
//
547
// RFRAM type not specified
548
//
549
initial begin
550
        $display("Define RFRAM type.");
551
        $finish;
552
end
553
 
554
`endif
555
`endif
556
`endif
557
`endif
558
 
559
 
560
always @ (posedge clk_i_cml_1) begin
561
addrw_cml_1 <= addrw;
562
spr_addr_cml_1 <= spr_addr;
563
spr_dat_i_cml_1 <= spr_dat_i;
564
dataa_saved_cml_1 <= dataa_saved;
565
datab_saved_cml_1 <= datab_saved;
566
rf_we_allow_cml_1 <= rf_we_allow;
567
from_rfa_int_cml_1 <= from_rfa_int;
568
from_rfb_int_cml_1 <= from_rfb_int;
569
rf_addra_reg_cml_1 <= rf_addra_reg;
570
rf_addrb_reg_cml_1 <= rf_addrb_reg;
571
end
572
always @ (posedge clk_i_cml_2) begin
573
wb_freeze_cml_2 <= wb_freeze;
574
dataw_cml_2 <= dataw;
575
spr_write_cml_2 <= spr_write;
576
spr_addr_cml_2 <= spr_addr_cml_1;
577
spr_dat_i_cml_2 <= spr_dat_i_cml_1;
578
from_rfa_cml_2 <= from_rfa;
579
dataa_saved_cml_2 <= dataa_saved_cml_1;
580
datab_saved_cml_2 <= datab_saved_cml_1;
581
rf_addrw_cml_2 <= rf_addrw;
582
spr_valid_cml_2 <= spr_valid;
583
rf_we_allow_cml_2 <= rf_we_allow_cml_1;
584
from_rfb_int_cml_2 <= from_rfb_int_cml_1;
585
rf_addra_reg_cml_2 <= rf_addra_reg_cml_1;
586
rf_addrb_reg_cml_2 <= rf_addrb_reg_cml_1;
587
end
588
endmodule
589
 

powered by: WebSVN 2.1.0

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