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

Subversion Repositories or1k

[/] [or1k/] [tags/] [rel_29/] [or1200/] [rtl/] [verilog/] [or1200_qmem_top.v] - Blame information for rev 1268

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

Line No. Rev Author Line
1 1268 lampret
//////////////////////////////////////////////////////////////////////
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.1.2.4  2004/01/11 22:45:46  andreje
51
// Separate instruction and data QMEM decoders, QMEM acknowledge and byte-select added
52
//
53
// Revision 1.1.2.3  2003/12/17 13:36:58  simons
54
// Qmem mbist signals fixed.
55
//
56
// Revision 1.1.2.2  2003/12/09 11:46:48  simons
57
// Mbist nameing changed, Artisan ram instance signal names fixed, some synthesis waning fixed.
58
//
59
// Revision 1.1.2.1  2003/07/08 15:45:26  lampret
60
// Added embedded memory QMEM.
61
//
62
//
63
 
64
// synopsys translate_off
65
`include "timescale.v"
66
// synopsys translate_on
67
`include "or1200_defines.v"
68
 
69
`define OR1200_QMEMFSM_IDLE     3'd0
70
`define OR1200_QMEMFSM_STORE    3'd1
71
`define OR1200_QMEMFSM_LOAD     3'd2
72
`define OR1200_QMEMFSM_FETCH    3'd3
73
 
74
//
75
// Embedded memory
76
//
77
module or1200_qmem_top(
78
        // Rst, clk and clock control
79
        clk, rst,
80
 
81
`ifdef OR1200_BIST
82
        // RAM BIST
83
        mbist_si_i, mbist_so_o, mbist_ctrl_i,
84
`endif
85
 
86
        // QMEM and CPU/IMMU
87
        qmemimmu_adr_i,
88
        qmemimmu_cycstb_i,
89
        qmemimmu_ci_i,
90
        qmemicpu_sel_i,
91
        qmemicpu_tag_i,
92
        qmemicpu_dat_o,
93
        qmemicpu_ack_o,
94
        qmemimmu_rty_o,
95
        qmemimmu_err_o,
96
        qmemimmu_tag_o,
97
 
98
        // QMEM and IC
99
        icqmem_adr_o,
100
        icqmem_cycstb_o,
101
        icqmem_ci_o,
102
        icqmem_sel_o,
103
        icqmem_tag_o,
104
        icqmem_dat_i,
105
        icqmem_ack_i,
106
        icqmem_rty_i,
107
        icqmem_err_i,
108
        icqmem_tag_i,
109
 
110
        // QMEM and CPU/DMMU
111
        qmemdmmu_adr_i,
112
        qmemdmmu_cycstb_i,
113
        qmemdmmu_ci_i,
114
        qmemdcpu_we_i,
115
        qmemdcpu_sel_i,
116
        qmemdcpu_tag_i,
117
        qmemdcpu_dat_i,
118
        qmemdcpu_dat_o,
119
        qmemdcpu_ack_o,
120
        qmemdcpu_rty_o,
121
        qmemdmmu_err_o,
122
        qmemdmmu_tag_o,
123
 
124
        // QMEM and DC
125
        dcqmem_adr_o, dcqmem_cycstb_o, dcqmem_ci_o,
126
        dcqmem_we_o, dcqmem_sel_o, dcqmem_tag_o, dcqmem_dat_o,
127
        dcqmem_dat_i, dcqmem_ack_i, dcqmem_rty_i, dcqmem_err_i, dcqmem_tag_i
128
 
129
);
130
 
131
parameter dw = `OR1200_OPERAND_WIDTH;
132
 
133
//
134
// I/O
135
//
136
 
137
//
138
// Clock and reset
139
//
140
input                           clk;
141
input                           rst;
142
 
143
`ifdef OR1200_BIST
144
//
145
// RAM BIST
146
//
147
input mbist_si_i;
148
input [`OR1200_MBIST_CTRL_WIDTH - 1:0] mbist_ctrl_i;
149
output mbist_so_o;
150
`endif
151
 
152
//
153
// QMEM and CPU/IMMU
154
//
155
input   [31:0]                   qmemimmu_adr_i;
156
input                           qmemimmu_cycstb_i;
157
input                           qmemimmu_ci_i;
158
input   [3:0]                    qmemicpu_sel_i;
159
input   [3:0]                    qmemicpu_tag_i;
160
output  [31:0]                   qmemicpu_dat_o;
161
output                          qmemicpu_ack_o;
162
output                          qmemimmu_rty_o;
163
output                          qmemimmu_err_o;
164
output  [3:0]                    qmemimmu_tag_o;
165
 
166
//
167
// QMEM and IC
168
//
169
output  [31:0]                   icqmem_adr_o;
170
output                          icqmem_cycstb_o;
171
output                          icqmem_ci_o;
172
output  [3:0]                    icqmem_sel_o;
173
output  [3:0]                    icqmem_tag_o;
174
input   [31:0]                   icqmem_dat_i;
175
input                           icqmem_ack_i;
176
input                           icqmem_rty_i;
177
input                           icqmem_err_i;
178
input   [3:0]                    icqmem_tag_i;
179
 
180
//
181
// QMEM and CPU/DMMU
182
//
183
input   [31:0]                   qmemdmmu_adr_i;
184
input                           qmemdmmu_cycstb_i;
185
input                           qmemdmmu_ci_i;
186
input                           qmemdcpu_we_i;
187
input   [3:0]                    qmemdcpu_sel_i;
188
input   [3:0]                    qmemdcpu_tag_i;
189
input   [31:0]                   qmemdcpu_dat_i;
190
output  [31:0]                   qmemdcpu_dat_o;
191
output                          qmemdcpu_ack_o;
192
output                          qmemdcpu_rty_o;
193
output                          qmemdmmu_err_o;
194
output  [3:0]                    qmemdmmu_tag_o;
195
 
196
//
197
// QMEM and DC
198
//
199
output  [31:0]                   dcqmem_adr_o;
200
output                          dcqmem_cycstb_o;
201
output                          dcqmem_ci_o;
202
output                          dcqmem_we_o;
203
output  [3:0]                    dcqmem_sel_o;
204
output  [3:0]                    dcqmem_tag_o;
205
output  [dw-1:0]         dcqmem_dat_o;
206
input   [dw-1:0]         dcqmem_dat_i;
207
input                           dcqmem_ack_i;
208
input                           dcqmem_rty_i;
209
input                           dcqmem_err_i;
210
input   [3:0]                    dcqmem_tag_i;
211
 
212
`ifdef OR1200_QMEM_IMPLEMENTED
213
 
214
//
215
// Internal regs and wires
216
//
217
wire                            iaddr_qmem_hit;
218
wire                            daddr_qmem_hit;
219
reg     [2:0]                    state;
220
reg                             qmem_dack;
221
reg                             qmem_iack;
222
wire    [31:0]                   qmem_di;
223
wire    [31:0]                   qmem_do;
224
wire                            qmem_en;
225
wire                            qmem_we;
226
`ifdef OR1200_QMEM_BSEL
227
wire  [3:0]       qmem_sel;
228
`endif
229
wire    [31:0]                   qmem_addr;
230
`ifdef OR1200_QMEM_ACK
231
wire              qmem_ack;
232
`else
233
wire              qmem_ack = 1'b1;
234
`endif
235
 
236
//
237
// QMEM and CPU/IMMU
238
//
239
assign qmemicpu_dat_o = qmem_iack ? qmem_do : icqmem_dat_i;
240
assign qmemicpu_ack_o = qmem_iack ? 1'b1 : icqmem_ack_i;
241
assign qmemimmu_rty_o = qmem_iack ? 1'b0 : icqmem_rty_i;
242
assign qmemimmu_err_o = qmem_iack ? 1'b0 : icqmem_err_i;
243
assign qmemimmu_tag_o = qmem_iack ? 4'h0 : icqmem_tag_i;
244
 
245
//
246
// QMEM and IC
247
//
248
assign icqmem_adr_o = iaddr_qmem_hit ? 32'h0000_0000 : qmemimmu_adr_i;
249
assign icqmem_cycstb_o = iaddr_qmem_hit ? 1'b0 : qmemimmu_cycstb_i;
250
assign icqmem_ci_o = iaddr_qmem_hit ? 1'b0 : qmemimmu_ci_i;
251
assign icqmem_sel_o = iaddr_qmem_hit ? 4'h0 : qmemicpu_sel_i;
252
assign icqmem_tag_o = iaddr_qmem_hit ? 4'h0 : qmemicpu_tag_i;
253
 
254
//
255
// QMEM and CPU/DMMU
256
//
257
assign qmemdcpu_dat_o = daddr_qmem_hit ? qmem_do : dcqmem_dat_i;
258
assign qmemdcpu_ack_o = daddr_qmem_hit ? qmem_dack : dcqmem_ack_i;
259
assign qmemdcpu_rty_o = daddr_qmem_hit ? ~qmem_dack : dcqmem_rty_i;
260
assign qmemdmmu_err_o = daddr_qmem_hit ? 1'b0 : dcqmem_err_i;
261
assign qmemdmmu_tag_o = daddr_qmem_hit ? 4'h0 : dcqmem_tag_i;
262
 
263
//
264
// QMEM and DC
265
//
266
assign dcqmem_adr_o = daddr_qmem_hit ? 32'h0000_0000 : qmemdmmu_adr_i;
267
assign dcqmem_cycstb_o = daddr_qmem_hit ? 1'b0 : qmemdmmu_cycstb_i;
268
assign dcqmem_ci_o = daddr_qmem_hit ? 1'b0 : qmemdmmu_ci_i;
269
assign dcqmem_we_o = daddr_qmem_hit ? 1'b0 : qmemdcpu_we_i;
270
assign dcqmem_sel_o = daddr_qmem_hit ? 4'h0 : qmemdcpu_sel_i;
271
assign dcqmem_tag_o = daddr_qmem_hit ? 4'h0 : qmemdcpu_tag_i;
272
assign dcqmem_dat_o = daddr_qmem_hit ? 32'h0000_0000 : qmemdcpu_dat_i;
273
 
274
//
275
// Address comparison whether QMEM was hit
276
//
277
`ifdef OR1200_QMEM_IADDR
278
assign iaddr_qmem_hit = (qmemimmu_adr_i & `OR1200_QMEM_IMASK) == `OR1200_QMEM_IADDR;
279
`else
280
assign iaddr_qmem_hit = 1'b0;
281
`endif
282
 
283
`ifdef OR1200_QMEM_DADDR
284
assign daddr_qmem_hit = (qmemdmmu_adr_i & `OR1200_QMEM_DMASK) == `OR1200_QMEM_DADDR;
285
`else
286
assign daddr_qmem_hit = 1'b0;
287
`endif
288
 
289
//
290
//
291
//
292
assign qmem_en = iaddr_qmem_hit & qmemimmu_cycstb_i | daddr_qmem_hit & qmemdmmu_cycstb_i;
293
assign qmem_we = qmemdmmu_cycstb_i & daddr_qmem_hit & qmemdcpu_we_i;
294
`ifdef OR1200_QMEM_BSEL
295
assign qmem_sel = (qmemdmmu_cycstb_i & daddr_qmem_hit) ? qmemdcpu_sel_i : qmemicpu_sel_i;
296
`endif
297
assign qmem_di = qmemdcpu_dat_i;
298
assign qmem_addr = (qmemdmmu_cycstb_i & daddr_qmem_hit) ? qmemdmmu_adr_i : qmemimmu_adr_i;
299
 
300
//
301
// QMEM control FSM
302
//
303
always @(posedge rst or posedge clk)
304
        if (rst) begin
305
                state <= #1 `OR1200_QMEMFSM_IDLE;
306
                qmem_dack <= #1 1'b0;
307
                qmem_iack <= #1 1'b0;
308
        end
309
        else case (state)       // synopsys parallel_case
310
                `OR1200_QMEMFSM_IDLE: begin
311
                        if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmemdcpu_we_i & qmem_ack) begin
312
                                state <= #1 `OR1200_QMEMFSM_STORE;
313
                                qmem_dack <= #1 1'b1;
314
                                qmem_iack <= #1 1'b0;
315
                        end
316
                        else if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmem_ack) begin
317
                                state <= #1 `OR1200_QMEMFSM_LOAD;
318
                                qmem_dack <= #1 1'b1;
319
                                qmem_iack <= #1 1'b0;
320
                        end
321
                        else if (qmemimmu_cycstb_i & iaddr_qmem_hit & qmem_ack) begin
322
                                state <= #1 `OR1200_QMEMFSM_FETCH;
323
                                qmem_iack <= #1 1'b1;
324
                                qmem_dack <= #1 1'b0;
325
                        end
326
                end
327
                `OR1200_QMEMFSM_STORE: begin
328
                        if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmemdcpu_we_i & qmem_ack) begin
329
                                state <= #1 `OR1200_QMEMFSM_STORE;
330
                                qmem_dack <= #1 1'b1;
331
                                qmem_iack <= #1 1'b0;
332
                        end
333
                        else if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmem_ack) begin
334
                                state <= #1 `OR1200_QMEMFSM_LOAD;
335
                                qmem_dack <= #1 1'b1;
336
                                qmem_iack <= #1 1'b0;
337
                        end
338
                        else if (qmemimmu_cycstb_i & iaddr_qmem_hit & qmem_ack) begin
339
                                state <= #1 `OR1200_QMEMFSM_FETCH;
340
                                qmem_iack <= #1 1'b1;
341
                                qmem_dack <= #1 1'b0;
342
                        end
343
                        else begin
344
                                state <= #1 `OR1200_QMEMFSM_IDLE;
345
                                qmem_dack <= #1 1'b0;
346
                                qmem_iack <= #1 1'b0;
347
                        end
348
                end
349
                `OR1200_QMEMFSM_LOAD: begin
350
                        if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmemdcpu_we_i & qmem_ack) begin
351
                                state <= #1 `OR1200_QMEMFSM_STORE;
352
                                qmem_dack <= #1 1'b1;
353
                                qmem_iack <= #1 1'b0;
354
                        end
355
                        else if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmem_ack) begin
356
                                state <= #1 `OR1200_QMEMFSM_LOAD;
357
                                qmem_dack <= #1 1'b1;
358
                                qmem_iack <= #1 1'b0;
359
                        end
360
                        else if (qmemimmu_cycstb_i & iaddr_qmem_hit & qmem_ack) begin
361
                                state <= #1 `OR1200_QMEMFSM_FETCH;
362
                                qmem_iack <= #1 1'b1;
363
                                qmem_dack <= #1 1'b0;
364
                        end
365
                        else begin
366
                                state <= #1 `OR1200_QMEMFSM_IDLE;
367
                                qmem_dack <= #1 1'b0;
368
                                qmem_iack <= #1 1'b0;
369
                        end
370
                end
371
                `OR1200_QMEMFSM_FETCH: begin
372
                        if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmemdcpu_we_i & qmem_ack) begin
373
                                state <= #1 `OR1200_QMEMFSM_STORE;
374
                                qmem_dack <= #1 1'b1;
375
                                qmem_iack <= #1 1'b0;
376
                        end
377
                        else if (qmemdmmu_cycstb_i & daddr_qmem_hit & qmem_ack) begin
378
                                state <= #1 `OR1200_QMEMFSM_LOAD;
379
                                qmem_dack <= #1 1'b1;
380
                                qmem_iack <= #1 1'b0;
381
                        end
382
                        else if (qmemimmu_cycstb_i & iaddr_qmem_hit & qmem_ack) begin
383
                                state <= #1 `OR1200_QMEMFSM_FETCH;
384
                                qmem_iack <= #1 1'b1;
385
                                qmem_dack <= #1 1'b0;
386
                        end
387
                        else begin
388
                                state <= #1 `OR1200_QMEMFSM_IDLE;
389
                                qmem_dack <= #1 1'b0;
390
                                qmem_iack <= #1 1'b0;
391
                        end
392
                end
393
        endcase
394
 
395
//
396
// Instantiation of embedded memory
397
//
398
or1200_spram_2048x32 or1200_qmem_ram(
399
        .clk(clk),
400
        .rst(rst),
401
`ifdef OR1200_BIST
402
        // RAM BIST
403
        .mbist_si_i(mbist_si_i),
404
        .mbist_so_o(mbist_so_o),
405
        .mbist_ctrl_i(mbist_ctrl_i),
406
`endif
407
        .addr(qmem_addr[12:2]),
408
`ifdef OR1200_QMEM_BSEL
409
        .sel(qmem_sel),
410
`endif
411
`ifdef OR1200_QMEM_ACK
412
  .ack(qmem_ack),
413
`endif
414
  .ce(qmem_en),
415
        .we(qmem_we),
416
        .oe(1'b1),
417
        .di(qmem_di),
418
        .do(qmem_do)
419
);
420
 
421
`else  // OR1200_QMEM_IMPLEMENTED
422
 
423
//
424
// QMEM and CPU/IMMU
425
//
426
assign qmemicpu_dat_o = icqmem_dat_i;
427
assign qmemicpu_ack_o = icqmem_ack_i;
428
assign qmemimmu_rty_o = icqmem_rty_i;
429
assign qmemimmu_err_o = icqmem_err_i;
430
assign qmemimmu_tag_o = icqmem_tag_i;
431
 
432
//
433
// QMEM and IC
434
//
435
assign icqmem_adr_o = qmemimmu_adr_i;
436
assign icqmem_cycstb_o = qmemimmu_cycstb_i;
437
assign icqmem_ci_o = qmemimmu_ci_i;
438
assign icqmem_sel_o = qmemicpu_sel_i;
439
assign icqmem_tag_o = qmemicpu_tag_i;
440
 
441
//
442
// QMEM and CPU/DMMU
443
//
444
assign qmemdcpu_dat_o = dcqmem_dat_i;
445
assign qmemdcpu_ack_o = dcqmem_ack_i;
446
assign qmemdcpu_rty_o = dcqmem_rty_i;
447
assign qmemdmmu_err_o = dcqmem_err_i;
448
assign qmemdmmu_tag_o = dcqmem_tag_i;
449
 
450
//
451
// QMEM and DC
452
//
453
assign dcqmem_adr_o = qmemdmmu_adr_i;
454
assign dcqmem_cycstb_o = qmemdmmu_cycstb_i;
455
assign dcqmem_ci_o = qmemdmmu_ci_i;
456
assign dcqmem_we_o = qmemdcpu_we_i;
457
assign dcqmem_sel_o = qmemdcpu_sel_i;
458
assign dcqmem_tag_o = qmemdcpu_tag_i;
459
assign dcqmem_dat_o = qmemdcpu_dat_i;
460
 
461
`ifdef OR1200_BIST
462
assign mbist_so_o = mbist_si_i;
463
`endif
464
 
465
`endif
466
 
467
endmodule

powered by: WebSVN 2.1.0

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