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

Subversion Repositories or1200_hp

[/] [or1200_hp/] [trunk/] [rtl/] [rtl_cm4/] [verilog/] [or1200_qmem_top.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 tobil
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  OR1200's Embedded Memory                                    ////
4
////                                                              ////
5
////  This file is part of the OpenRISC 1200 project              ////
6
////  http://www.opencores.org/cores/or1k/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Embedded Memory               .                             ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////   - QMEM and IC/DC muxes can be removed except for cycstb    ////
13
////     (now are is there for easier debugging)                  ////
14
////   - currently arbitration is slow and stores take 2 clocks   ////
15
////     (final debugged version will be faster)                  ////
16
////                                                              ////
17
////  Author(s):                                                  ////
18
////      - Damjan Lampret, lampret@opencores.org                 ////
19
////                                                              ////
20
//////////////////////////////////////////////////////////////////////
21
////                                                              ////
22
//// Copyright (C) 2003 Authors and OPENCORES.ORG                 ////
23
////                                                              ////
24
//// This source file may be used and distributed without         ////
25
//// restriction provided that this copyright statement is not    ////
26
//// removed from the file and that any derivative work contains  ////
27
//// the original copyright notice and the associated disclaimer. ////
28
////                                                              ////
29
//// This source file is free software; you can redistribute it   ////
30
//// and/or modify it under the terms of the GNU Lesser General   ////
31
//// Public License as published by the Free Software Foundation; ////
32
//// either version 2.1 of the License, or (at your option) any   ////
33
//// later version.                                               ////
34
////                                                              ////
35
//// This source is distributed in the hope that it will be       ////
36
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
37
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
38
//// PURPOSE.  See the GNU Lesser General Public License for more ////
39
//// details.                                                     ////
40
////                                                              ////
41
//// You should have received a copy of the GNU Lesser General    ////
42
//// Public License along with this source; if not, download it   ////
43
//// from http://www.opencores.org/lgpl.shtml                     ////
44
////                                                              ////
45
//////////////////////////////////////////////////////////////////////
46
//
47
// CVS Revision History
48
//
49
// $Log: not supported by cvs2svn $
50
// Revision 1.2  2004/04/05 08:40:26  lampret
51
// Merged branch_qmem into main tree.
52
//
53
// Revision 1.1.2.4  2004/01/11 22:45:46  andreje
54
// Separate instruction and data QMEM decoders, QMEM acknowledge and byte-select added
55
//
56
// Revision 1.1.2.3  2003/12/17 13:36:58  simons
57
// Qmem mbist signals fixed.
58
//
59
// Revision 1.1.2.2  2003/12/09 11:46:48  simons
60
// Mbist nameing changed, Artisan ram instance signal names fixed, some synthesis waning fixed.
61
//
62
// Revision 1.1.2.1  2003/07/08 15:45:26  lampret
63
// Added embedded memory QMEM.
64
//
65
//
66
 
67
// synopsys translate_off
68
`include "timescale.v"
69
// synopsys translate_on
70
`include "or1200_defines.v"
71
 
72
`define OR1200_QMEMFSM_IDLE     3'd0
73
`define OR1200_QMEMFSM_STORE    3'd1
74
`define OR1200_QMEMFSM_LOAD     3'd2
75
`define OR1200_QMEMFSM_FETCH    3'd3
76
 
77
//
78
// Embedded memory
79
//
80
module or1200_qmem_top_cm4(
81
                clk_i_cml_1,
82
                clk_i_cml_2,
83
                clk_i_cml_3,
84
 
85
        // Rst, clk and clock control
86
        clk, rst,
87
 
88
`ifdef OR1200_BIST
89
        // RAM BIST
90
        mbist_si_i, mbist_so_o, mbist_ctrl_i,
91
`endif
92
 
93
        // QMEM and CPU/IMMU
94
        qmemimmu_adr_i,
95
        qmemimmu_cycstb_i,
96
        qmemimmu_ci_i,
97
        qmemicpu_sel_i,
98
        qmemicpu_tag_i,
99
        qmemicpu_dat_o,
100
        qmemicpu_ack_o,
101
        qmemimmu_rty_o,
102
        qmemimmu_err_o,
103
        qmemimmu_tag_o,
104
 
105
        // QMEM and IC
106
        icqmem_adr_o,
107
        icqmem_cycstb_o,
108
        icqmem_ci_o,
109
        icqmem_sel_o,
110
        icqmem_tag_o,
111
        icqmem_dat_i,
112
        icqmem_ack_i,
113
        icqmem_rty_i,
114
        icqmem_err_i,
115
        icqmem_tag_i,
116
 
117
        // QMEM and CPU/DMMU
118
        qmemdmmu_adr_i,
119
        qmemdmmu_cycstb_i,
120
        qmemdmmu_ci_i,
121
        qmemdcpu_we_i,
122
        qmemdcpu_sel_i,
123
        qmemdcpu_tag_i,
124
        qmemdcpu_dat_i,
125
        qmemdcpu_dat_o,
126
        qmemdcpu_ack_o,
127
        qmemdcpu_rty_o,
128
        qmemdmmu_err_o,
129
        qmemdmmu_tag_o,
130
 
131
        // QMEM and DC
132
        dcqmem_adr_o, dcqmem_cycstb_o, dcqmem_ci_o,
133
        dcqmem_we_o, dcqmem_sel_o, dcqmem_tag_o, dcqmem_dat_o,
134
        dcqmem_dat_i, dcqmem_ack_i, dcqmem_rty_i, dcqmem_err_i, dcqmem_tag_i
135
 
136
);
137
 
138
 
139
input clk_i_cml_1;
140
input clk_i_cml_2;
141
input clk_i_cml_3;
142
reg [ 31 : 0 ] qmemimmu_adr_i_cml_3;
143
reg  icqmem_err_i_cml_1;
144
reg  qmemdcpu_we_i_cml_3;
145
reg  qmemdcpu_we_i_cml_2;
146
reg  qmemdcpu_we_i_cml_1;
147
reg [ 3 : 0 ] qmemdcpu_sel_i_cml_3;
148
reg [ 3 : 0 ] qmemdcpu_sel_i_cml_2;
149
 
150
 
151
 
152
parameter dw = `OR1200_OPERAND_WIDTH;
153
 
154
//
155
// I/O
156
//
157
 
158
//
159
// Clock and reset
160
//
161
input                           clk;
162
input                           rst;
163
 
164
`ifdef OR1200_BIST
165
//
166
// RAM BIST
167
//
168
input mbist_si_i;
169
input [`OR1200_MBIST_CTRL_WIDTH - 1:0] mbist_ctrl_i;
170
output mbist_so_o;
171
`endif
172
 
173
//
174
// QMEM and CPU/IMMU
175
//
176
input   [31:0]                   qmemimmu_adr_i;
177
input                           qmemimmu_cycstb_i;
178
input                           qmemimmu_ci_i;
179
input   [3:0]                    qmemicpu_sel_i;
180
input   [3:0]                    qmemicpu_tag_i;
181
output  [31:0]                   qmemicpu_dat_o;
182
output                          qmemicpu_ack_o;
183
output                          qmemimmu_rty_o;
184
output                          qmemimmu_err_o;
185
output  [3:0]                    qmemimmu_tag_o;
186
 
187
//
188
// QMEM and IC
189
//
190
output  [31:0]                   icqmem_adr_o;
191
output                          icqmem_cycstb_o;
192
output                          icqmem_ci_o;
193
output  [3:0]                    icqmem_sel_o;
194
output  [3:0]                    icqmem_tag_o;
195
input   [31:0]                   icqmem_dat_i;
196
input                           icqmem_ack_i;
197
input                           icqmem_rty_i;
198
input                           icqmem_err_i;
199
input   [3:0]                    icqmem_tag_i;
200
 
201
//
202
// QMEM and CPU/DMMU
203
//
204
input   [31:0]                   qmemdmmu_adr_i;
205
input                           qmemdmmu_cycstb_i;
206
input                           qmemdmmu_ci_i;
207
input                           qmemdcpu_we_i;
208
input   [3:0]                    qmemdcpu_sel_i;
209
input   [3:0]                    qmemdcpu_tag_i;
210
input   [31:0]                   qmemdcpu_dat_i;
211
output  [31:0]                   qmemdcpu_dat_o;
212
output                          qmemdcpu_ack_o;
213
output                          qmemdcpu_rty_o;
214
output                          qmemdmmu_err_o;
215
output  [3:0]                    qmemdmmu_tag_o;
216
 
217
//
218
// QMEM and DC
219
//
220
output  [31:0]                   dcqmem_adr_o;
221
output                          dcqmem_cycstb_o;
222
output                          dcqmem_ci_o;
223
output                          dcqmem_we_o;
224
output  [3:0]                    dcqmem_sel_o;
225
output  [3:0]                    dcqmem_tag_o;
226
output  [dw-1:0]         dcqmem_dat_o;
227
input   [dw-1:0]         dcqmem_dat_i;
228
input                           dcqmem_ack_i;
229
input                           dcqmem_rty_i;
230
input                           dcqmem_err_i;
231
input   [3:0]                    dcqmem_tag_i;
232
 
233
`ifdef OR1200_QMEM_IMPLEMENTED
234
 
235
//
236
// Internal regs and wires
237
//
238
wire                            iaddr_qmem_hit;
239
wire                            daddr_qmem_hit;
240
reg     [2:0]                    state;
241
reg                             qmem_dack;
242
reg                             qmem_iack;
243
wire    [31:0]                   qmem_di;
244
wire    [31:0]                   qmem_do;
245
wire                            qmem_en;
246
wire                            qmem_we;
247
`ifdef OR1200_QMEM_BSEL
248
wire  [3:0]       qmem_sel;
249
`endif
250
wire    [31:0]                   qmem_addr;
251
`ifdef OR1200_QMEM_ACK
252
wire              qmem_ack;
253
`else
254
wire              qmem_ack = 1'b1;
255
`endif
256
 
257
//
258
// QMEM and CPU/IMMU
259
//
260
assign qmemicpu_dat_o = qmem_iack ? qmem_do : icqmem_dat_i;
261
assign qmemicpu_ack_o = qmem_iack ? 1'b1 : icqmem_ack_i;
262
assign qmemimmu_rty_o = qmem_iack ? 1'b0 : icqmem_rty_i;
263
assign qmemimmu_err_o = qmem_iack ? 1'b0 : icqmem_err_i;
264
assign qmemimmu_tag_o = qmem_iack ? 4'h0 : icqmem_tag_i;
265
 
266
//
267
// QMEM and IC
268
//
269
assign icqmem_adr_o = iaddr_qmem_hit ? 32'h0000_0000 : qmemimmu_adr_i;
270
assign icqmem_cycstb_o = iaddr_qmem_hit ? 1'b0 : qmemimmu_cycstb_i;
271
assign icqmem_ci_o = iaddr_qmem_hit ? 1'b0 : qmemimmu_ci_i;
272
assign icqmem_sel_o = iaddr_qmem_hit ? 4'h0 : qmemicpu_sel_i;
273
assign icqmem_tag_o = iaddr_qmem_hit ? 4'h0 : qmemicpu_tag_i;
274
 
275
//
276
// QMEM and CPU/DMMU
277
//
278
assign qmemdcpu_dat_o = daddr_qmem_hit ? qmem_do : dcqmem_dat_i;
279
assign qmemdcpu_ack_o = daddr_qmem_hit ? qmem_dack : dcqmem_ack_i;
280
assign qmemdcpu_rty_o = daddr_qmem_hit ? ~qmem_dack : dcqmem_rty_i;
281
assign qmemdmmu_err_o = daddr_qmem_hit ? 1'b0 : dcqmem_err_i;
282
assign qmemdmmu_tag_o = daddr_qmem_hit ? 4'h0 : dcqmem_tag_i;
283
 
284
//
285
// QMEM and DC
286
//
287
assign dcqmem_adr_o = daddr_qmem_hit ? 32'h0000_0000 : qmemdmmu_adr_i;
288
assign dcqmem_cycstb_o = daddr_qmem_hit ? 1'b0 : qmemdmmu_cycstb_i;
289
assign dcqmem_ci_o = daddr_qmem_hit ? 1'b0 : qmemdmmu_ci_i;
290
assign dcqmem_we_o = daddr_qmem_hit ? 1'b0 : qmemdcpu_we_i;
291
assign dcqmem_sel_o = daddr_qmem_hit ? 4'h0 : qmemdcpu_sel_i;
292
assign dcqmem_tag_o = daddr_qmem_hit ? 4'h0 : qmemdcpu_tag_i;
293
assign dcqmem_dat_o = daddr_qmem_hit ? 32'h0000_0000 : qmemdcpu_dat_i;
294
 
295
//
296
// Address comparison whether QMEM was hit
297
//
298
`ifdef OR1200_QMEM_IADDR
299
assign iaddr_qmem_hit = (qmemimmu_adr_i & `OR1200_QMEM_IMASK) == `OR1200_QMEM_IADDR;
300
`else
301
assign iaddr_qmem_hit = 1'b0;
302
`endif
303
 
304
`ifdef OR1200_QMEM_DADDR
305
assign daddr_qmem_hit = (qmemdmmu_adr_i & `OR1200_QMEM_DMASK) == `OR1200_QMEM_DADDR;
306
`else
307
assign daddr_qmem_hit = 1'b0;
308
`endif
309
 
310
//
311
//
312
//
313
assign qmem_en = iaddr_qmem_hit & qmemimmu_cycstb_i | daddr_qmem_hit & qmemdmmu_cycstb_i;
314
assign qmem_we = qmemdmmu_cycstb_i & daddr_qmem_hit & qmemdcpu_we_i;
315
`ifdef OR1200_QMEM_BSEL
316
assign qmem_sel = (qmemdmmu_cycstb_i & daddr_qmem_hit) ? qmemdcpu_sel_i : qmemicpu_sel_i;
317
`endif
318
assign qmem_di = qmemdcpu_dat_i;
319
assign qmem_addr = (qmemdmmu_cycstb_i & daddr_qmem_hit) ? qmemdmmu_adr_i : qmemimmu_adr_i;
320
 
321
//
322
// QMEM control FSM
323
//
324
always @(posedge rst or posedge clk)
325
        if (rst) begin
326
                state <= #1 `OR1200_QMEMFSM_IDLE;
327
                qmem_dack <= #1 1'b0;
328
                qmem_iack <= #1 1'b0;
329
        end
330
        else case (state)       // synopsys parallel_case
331
                `OR1200_QMEMFSM_IDLE: begin
332
                        if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmemdcpu_we_i & qmem_ack) begin
333
                                state <= #1 `OR1200_QMEMFSM_STORE;
334
                                qmem_dack <= #1 1'b1;
335
                                qmem_iack <= #1 1'b0;
336
                        end
337
                        else if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmem_ack) begin
338
                                state <= #1 `OR1200_QMEMFSM_LOAD;
339
                                qmem_dack <= #1 1'b1;
340
                                qmem_iack <= #1 1'b0;
341
                        end
342
                        else if (qmemimmu_cycstb_i & iaddr_qmem_hit & qmem_ack) begin
343
                                state <= #1 `OR1200_QMEMFSM_FETCH;
344
                                qmem_iack <= #1 1'b1;
345
                                qmem_dack <= #1 1'b0;
346
                        end
347
                end
348
                `OR1200_QMEMFSM_STORE: begin
349
                        if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmemdcpu_we_i & qmem_ack) begin
350
                                state <= #1 `OR1200_QMEMFSM_STORE;
351
                                qmem_dack <= #1 1'b1;
352
                                qmem_iack <= #1 1'b0;
353
                        end
354
                        else if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmem_ack) begin
355
                                state <= #1 `OR1200_QMEMFSM_LOAD;
356
                                qmem_dack <= #1 1'b1;
357
                                qmem_iack <= #1 1'b0;
358
                        end
359
                        else if (qmemimmu_cycstb_i & iaddr_qmem_hit & qmem_ack) begin
360
                                state <= #1 `OR1200_QMEMFSM_FETCH;
361
                                qmem_iack <= #1 1'b1;
362
                                qmem_dack <= #1 1'b0;
363
                        end
364
                        else begin
365
                                state <= #1 `OR1200_QMEMFSM_IDLE;
366
                                qmem_dack <= #1 1'b0;
367
                                qmem_iack <= #1 1'b0;
368
                        end
369
                end
370
                `OR1200_QMEMFSM_LOAD: begin
371
                        if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmemdcpu_we_i & qmem_ack) begin
372
                                state <= #1 `OR1200_QMEMFSM_STORE;
373
                                qmem_dack <= #1 1'b1;
374
                                qmem_iack <= #1 1'b0;
375
                        end
376
                        else if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmem_ack) begin
377
                                state <= #1 `OR1200_QMEMFSM_LOAD;
378
                                qmem_dack <= #1 1'b1;
379
                                qmem_iack <= #1 1'b0;
380
                        end
381
                        else if (qmemimmu_cycstb_i & iaddr_qmem_hit & qmem_ack) begin
382
                                state <= #1 `OR1200_QMEMFSM_FETCH;
383
                                qmem_iack <= #1 1'b1;
384
                                qmem_dack <= #1 1'b0;
385
                        end
386
                        else begin
387
                                state <= #1 `OR1200_QMEMFSM_IDLE;
388
                                qmem_dack <= #1 1'b0;
389
                                qmem_iack <= #1 1'b0;
390
                        end
391
                end
392
                `OR1200_QMEMFSM_FETCH: begin
393
                        if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmemdcpu_we_i & qmem_ack) begin
394
                                state <= #1 `OR1200_QMEMFSM_STORE;
395
                                qmem_dack <= #1 1'b1;
396
                                qmem_iack <= #1 1'b0;
397
                        end
398
                        else if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmem_ack) begin
399
                                state <= #1 `OR1200_QMEMFSM_LOAD;
400
                                qmem_dack <= #1 1'b1;
401
                                qmem_iack <= #1 1'b0;
402
                        end
403
                        else if (qmemimmu_cycstb_i & iaddr_qmem_hit & qmem_ack) begin
404
                                state <= #1 `OR1200_QMEMFSM_FETCH;
405
                                qmem_iack <= #1 1'b1;
406
                                qmem_dack <= #1 1'b0;
407
                        end
408
                        else begin
409
                                state <= #1 `OR1200_QMEMFSM_IDLE;
410
                                qmem_dack <= #1 1'b0;
411
                                qmem_iack <= #1 1'b0;
412
                        end
413
                end
414
                default: begin
415
                        state <= #1 `OR1200_QMEMFSM_IDLE;
416
                        qmem_dack <= #1 1'b0;
417
                        qmem_iack <= #1 1'b0;
418
                end
419
        endcase
420
 
421
//
422
// Instantiation of embedded memory
423
//
424
or1200_spram_2048x32 or1200_qmem_ram(
425
        .clk(clk),
426
        .rst(rst),
427
`ifdef OR1200_BIST
428
        // RAM BIST
429
        .mbist_si_i(mbist_si_i),
430
        .mbist_so_o(mbist_so_o),
431
        .mbist_ctrl_i(mbist_ctrl_i),
432
`endif
433
        .addr(qmem_addr[12:2]),
434
`ifdef OR1200_QMEM_BSEL
435
        .sel(qmem_sel),
436
`endif
437
`ifdef OR1200_QMEM_ACK
438
  .ack(qmem_ack),
439
`endif
440
  .ce(qmem_en),
441
        .we(qmem_we),
442
        .oe(1'b1),
443
        .di(qmem_di),
444
        .doq(qmem_do)
445
);
446
 
447
`else  // OR1200_QMEM_IMPLEMENTED
448
 
449
//
450
// QMEM and CPU/IMMU
451
//
452
assign qmemicpu_dat_o = icqmem_dat_i;
453
assign qmemicpu_ack_o = icqmem_ack_i;
454
assign qmemimmu_rty_o = icqmem_rty_i;
455
 
456
// SynEDA CoreMultiplier
457
// assignment(s): qmemimmu_err_o
458
// replace(s): icqmem_err_i
459
assign qmemimmu_err_o = icqmem_err_i_cml_1;
460
assign qmemimmu_tag_o = icqmem_tag_i;
461
 
462
//
463
// QMEM and IC
464
//
465
 
466
// SynEDA CoreMultiplier
467
// assignment(s): icqmem_adr_o
468
// replace(s): qmemimmu_adr_i
469
assign icqmem_adr_o = qmemimmu_adr_i_cml_3;
470
assign icqmem_cycstb_o = qmemimmu_cycstb_i;
471
assign icqmem_ci_o = qmemimmu_ci_i;
472
assign icqmem_sel_o = qmemicpu_sel_i;
473
assign icqmem_tag_o = qmemicpu_tag_i;
474
 
475
//
476
// QMEM and CPU/DMMU
477
//
478
assign qmemdcpu_dat_o = dcqmem_dat_i;
479
assign qmemdcpu_ack_o = dcqmem_ack_i;
480
assign qmemdcpu_rty_o = dcqmem_rty_i;
481
assign qmemdmmu_err_o = dcqmem_err_i;
482
assign qmemdmmu_tag_o = dcqmem_tag_i;
483
 
484
//
485
// QMEM and DC
486
//
487
assign dcqmem_adr_o = qmemdmmu_adr_i;
488
assign dcqmem_cycstb_o = qmemdmmu_cycstb_i;
489
assign dcqmem_ci_o = qmemdmmu_ci_i;
490
 
491
// SynEDA CoreMultiplier
492
// assignment(s): dcqmem_we_o
493
// replace(s): qmemdcpu_we_i
494
assign dcqmem_we_o = qmemdcpu_we_i_cml_3;
495
 
496
// SynEDA CoreMultiplier
497
// assignment(s): dcqmem_sel_o
498
// replace(s): qmemdcpu_sel_i
499
assign dcqmem_sel_o = qmemdcpu_sel_i_cml_3;
500
assign dcqmem_tag_o = qmemdcpu_tag_i;
501
assign dcqmem_dat_o = qmemdcpu_dat_i;
502
 
503
`ifdef OR1200_BIST
504
assign mbist_so_o = mbist_si_i;
505
`endif
506
 
507
`endif
508
 
509
 
510
always @ (posedge clk_i_cml_1) begin
511
icqmem_err_i_cml_1 <= icqmem_err_i;
512
qmemdcpu_we_i_cml_1 <= qmemdcpu_we_i;
513
end
514
always @ (posedge clk_i_cml_2) begin
515
qmemdcpu_we_i_cml_2 <= qmemdcpu_we_i_cml_1;
516
qmemdcpu_sel_i_cml_2 <= qmemdcpu_sel_i;
517
end
518
always @ (posedge clk_i_cml_3) begin
519
qmemimmu_adr_i_cml_3 <= qmemimmu_adr_i;
520
qmemdcpu_we_i_cml_3 <= qmemdcpu_we_i_cml_2;
521
qmemdcpu_sel_i_cml_3 <= qmemdcpu_sel_i_cml_2;
522
end
523
endmodule
524
 

powered by: WebSVN 2.1.0

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