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

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [soc/] [rtl/] [or1200/] [rtl/] [verilog/] [or1200_qmem_top.v] - Blame information for rev 12

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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