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

Subversion Repositories mpmc8

[/] [mpmc8/] [trunk/] [rtl/] [mpmc10/] [mpmc10_wb.sv] - Blame information for rev 10

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

Line No. Rev Author Line
1 5 robfinch
`timescale 1ns / 1ps
2
// ============================================================================
3
//        __
4
//   \\__/ o\    (C) 2015-2022  Robert Finch, Waterloo
5
//    \  __ /    All rights reserved.
6
//     \/_//     robfinch@finitron.ca
7
//       ||
8
//
9
// BSD 3-Clause License
10
// Redistribution and use in source and binary forms, with or without
11
// modification, are permitted provided that the following conditions are met:
12
//
13
// 1. Redistributions of source code must retain the above copyright notice, this
14
//    list of conditions and the following disclaimer.
15
//
16
// 2. Redistributions in binary form must reproduce the above copyright notice,
17
//    this list of conditions and the following disclaimer in the documentation
18
//    and/or other materials provided with the distribution.
19
//
20
// 3. Neither the name of the copyright holder nor the names of its
21
//    contributors may be used to endorse or promote products derived from
22
//    this software without specific prior written permission.
23
//
24
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
//
35
// 16000 LUTs, 130 BRAM (64kB cache)
36
//
37
// Read channels always wait until there is valid data in the cache.
38
// ============================================================================
39
//
40
//`define RED_SCREEN    1'b1
41
 
42
import wishbone_pkg::*;
43
import mpmc10_pkg::*;
44
 
45
module mpmc10_wb(
46
input rst,
47
input clk100MHz,
48
input mem_ui_rst,
49
input mem_ui_clk,
50 7 robfinch
input calib_complete,
51 5 robfinch
output reg rstn,
52
output [31:0] app_waddr,
53
input app_rdy,
54
output app_en,
55
output [2:0] app_cmd,
56
output [28:0] app_addr,
57
input app_rd_data_valid,
58
output [15:0] app_wdf_mask,
59
output reg [127:0] app_wdf_data,
60
input app_wdf_rdy,
61
output app_wdf_wren,
62
output app_wdf_end,
63
input [127:0] app_rd_data,
64
input app_rd_data_end,
65
input ch0clk, ch1clk, ch2clk, ch3clk, ch4clk, ch5clk, ch6clk, ch7clk,
66
input wb_write_request128_t ch0i,
67
output wb_read_response128_t ch0o,
68
input wb_write_request128_t ch1i,
69
output wb_read_response128_t ch1o,
70
input wb_write_request128_t ch2i,
71
output wb_read_response128_t ch2o,
72
input wb_write_request128_t ch3i,
73
output wb_read_response128_t ch3o,
74
input wb_write_request128_t ch4i,
75
output wb_read_response128_t ch4o,
76
input wb_write_request128_t ch5i,
77
output wb_read_response128_t ch5o,
78
input wb_write_request128_t ch6i,
79
output wb_read_response128_t ch6o,
80
input wb_write_request128_t ch7i,
81
output wb_read_response128_t ch7o,
82 7 robfinch
output mpmc10_state_t state
83 5 robfinch
);
84
parameter NAR = 2;                      // Number of address reservations
85
parameter CL = 3'd4;            // Cache read latency
86
parameter STREAM0 = TRUE;
87
parameter STREAM1 = FALSE;
88
parameter STREAM2 = FALSE;
89
parameter STREAM3 = FALSE;
90
parameter STREAM4 = FALSE;
91
parameter STREAM5 = TRUE;
92
parameter STREAM6 = FALSE;
93
parameter STREAM7 = FALSE;
94
 
95
wb_write_request128_t ch0is;
96
wb_write_request128_t ch0is2;
97
wb_write_request128_t ch1is;
98
wb_write_request128_t ch1is2;
99
wb_write_request128_t ch2is;
100
wb_write_request128_t ch2is2;
101
wb_write_request128_t ch3is;
102
wb_write_request128_t ch3is2;
103
wb_write_request128_t ch4is;
104
wb_write_request128_t ch4is2;
105
wb_write_request128_t ch5is;
106
wb_write_request128_t ch5is2;
107
wb_write_request128_t ch6is;
108
wb_write_request128_t ch6is2;
109
wb_write_request128_t ch7is;
110
wb_write_request128_t ch7is2;
111
 
112
wb_read_response128_t ch0oa, ch0ob;
113
wb_read_response128_t ch1oa, ch1ob;
114
wb_read_response128_t ch2oa, ch2ob;
115
wb_read_response128_t ch3oa, ch3ob;
116
wb_read_response128_t ch4oa, ch4ob;
117
wb_read_response128_t ch5oa, ch5ob;
118
wb_read_response128_t ch6oa, ch6ob;
119
wb_read_response128_t ch7oa, ch7ob;
120
 
121
assign ch0o = STREAM0 ? ch0ob : ch0oa;
122
assign ch1o = STREAM1 ? ch1ob : ch1oa;
123
assign ch2o = STREAM2 ? ch2ob : ch2oa;
124
assign ch3o = STREAM3 ? ch3ob : ch3oa;
125
assign ch4o = STREAM4 ? ch4ob : ch4oa;
126
assign ch5o = STREAM5 ? ch5ob : ch5oa;
127
assign ch6o = STREAM6 ? ch6ob : ch6oa;
128
assign ch7o = STREAM7 ? ch7ob : ch7oa;
129
 
130
wb_write_request128_t req_fifoi;
131
wb_write_request128_t req_fifoo;
132
wb_write_request128_t ld;
133 7 robfinch
wb_write_request128_t fifo_mask;
134
wb_write_request128_t fifoo = req_fifoo & fifo_mask;
135 5 robfinch
 
136
genvar g;
137 7 robfinch
integer n1,n2,n3;
138 5 robfinch
wire almost_full;
139
wire [4:0] cnt;
140
reg wr_fifo;
141 7 robfinch
mpmc10_state_t prev_state;
142 5 robfinch
wire rd_fifo;   // from state machine
143
reg [5:0] num_strips;   // from fifo
144
wire [5:0] req_strip_cnt;
145
wire [5:0] resp_strip_cnt;
146
wire [15:0] tocnt;
147
wire [31:0] app_waddr;
148
reg [31:0] adr;
149
reg [3:0] uch;          // update channel
150
wire [15:0] wmask;
151
wire [15:0] mem_wdf_mask2;
152
reg [127:0] dat128;
153 7 robfinch
wire [127:0] dat256;
154 5 robfinch
wire [3:0] resv_ch [0:NAR-1];
155
wire [31:0] resv_adr [0:NAR-1];
156
wire rb1;
157
reg [7:0] req;
158
reg [127:0] rd_data_r;
159
reg rd_data_valid_r;
160
 
161
wire ch0_hit_s, ch1_hit_s, ch2_hit_s, ch3_hit_s;
162
wire ch4_hit_s, ch5_hit_s, ch6_hit_s, ch7_hit_s;
163
wire ch0_hit_ne, ch5_hit_ne;
164
 
165
always_ff @(posedge mem_ui_clk)
166 10 robfinch
if (app_rd_data_valid)
167 5 robfinch
        rd_data_r <= app_rd_data;
168
always_ff @(posedge mem_ui_clk)
169
        rd_data_valid_r <= app_rd_data_valid;
170
 
171
reg [19:0] rst_ctr;
172
always @(posedge clk100MHz)
173
if (rst)
174
        rst_ctr <= 24'd0;
175
else begin
176
        if (!rst_ctr[15])
177
                rst_ctr <= rst_ctr + 2'd1;
178
        rstn <= rst_ctr[15];
179
end
180
 
181
reg [7:0] stb [0:7];
182
always_comb stb[0] = ch0is.stb;
183
always_comb stb[1] = ch1is.stb;
184
always_comb stb[2] = ch2is.stb;
185
always_comb stb[3] = ch3is.stb;
186
always_comb stb[4] = ch4is.stb;
187
always_comb stb[5] = ch5is.stb;
188
always_comb stb[6] = ch6is.stb;
189
always_comb stb[7] = ch7is.stb;
190
 
191
reg [2:0] chcnt [0:7];
192
always_ff @(posedge mem_ui_clk)
193
if (rst) begin
194
        for (n2 = 0; n2 < 8; n2 = n2 + 1)
195
                chcnt[n2] <= 'd0;
196
end
197
else begin
198
        for (n2 = 0; n2 < 8; n2 = n2 + 1)
199
                if (stb[n2]) begin
200
                        if (chcnt[n2] < CL)
201
                                chcnt[n2] <= chcnt[n2] + 2'd1;
202
                end
203
                else
204
                        chcnt[n2] <= 'd0;
205
end
206
 
207 7 robfinch
wire [7:0] pe_req;
208 5 robfinch
reg [7:0] chack;
209
always_comb chack[0] = ch0o.ack;
210
always_comb chack[1] = ch1o.ack;
211
always_comb chack[2] = ch2o.ack;
212
always_comb chack[3] = ch3o.ack;
213
always_comb chack[4] = ch4o.ack;
214
always_comb chack[5] = ch5o.ack;
215
always_comb chack[6] = ch6o.ack;
216
always_comb chack[7] = ch7o.ack;
217
 
218 7 robfinch
reg [7:0] reqa;
219
always_comb reqa[1] = (!ch1o.ack && ch1is.stb && !ch1is.we && chcnt[1]==CL) || (ch1is.we && ch1is.stb);
220
always_comb reqa[5] = (!ch5o.ack && ch5is.stb && !ch5is.we && chcnt[5]==CL) || (ch5is.we && ch5is.stb);
221
 
222
wire rste = mem_ui_rst||rst||!calib_complete;
223
 
224 5 robfinch
edge_det edch0 (
225 7 robfinch
        .rst(rste),
226 5 robfinch
        .clk(mem_ui_clk),
227
        .ce(1'b1),
228
        .i((!ch0o.ack && ch0is.stb && !ch0is.we && chcnt[0]==CL) || (ch0is.we && ch0is.stb)),
229
        .pe(pe_req[0]),
230
        .ne(),
231
        .ee()
232
);
233
edge_det edch1 (
234 7 robfinch
        .rst(rste),
235 5 robfinch
        .clk(mem_ui_clk),
236
        .ce(1'b1),
237 7 robfinch
        .i(reqa[1]),
238 5 robfinch
        .pe(pe_req[1]),
239
        .ne(),
240
        .ee()
241
);
242
edge_det edch2 (
243 7 robfinch
        .rst(rste),
244 5 robfinch
        .clk(mem_ui_clk),
245
        .ce(1'b1),
246
        .i((!ch2o.ack && ch2is.stb && !ch2is.we && chcnt[2]==CL) || (ch2is.we && ch2is.stb)),
247
        .pe(pe_req[2]),
248
        .ne(),
249
        .ee()
250
);
251
edge_det edch3 (
252 7 robfinch
        .rst(rste),
253 5 robfinch
        .clk(mem_ui_clk),
254
        .ce(1'b1),
255
        .i((!ch3o.ack && ch3is.stb && !ch3is.we && chcnt[3]==CL) || (ch3is.we && ch3is.stb)),
256
        .pe(pe_req[3]),
257
        .ne(),
258
        .ee()
259
);
260
edge_det edch4 (
261 7 robfinch
        .rst(rste),
262 5 robfinch
        .clk(mem_ui_clk),
263
        .ce(1'b1),
264
        .i((!ch4o.ack && ch4is.stb && !ch4is.we && chcnt[4]==CL) || (ch4is.we && ch4is.stb)),
265
        .pe(pe_req[4]),
266
        .ne(),
267
        .ee()
268
);
269
edge_det edch5 (
270 7 robfinch
        .rst(rste),
271 5 robfinch
        .clk(mem_ui_clk),
272
        .ce(1'b1),
273 7 robfinch
        .i(reqa[5]),
274 5 robfinch
        .pe(pe_req[5]),
275
        .ne(),
276
        .ee()
277
);
278
edge_det edch6 (
279 7 robfinch
        .rst(rste),
280 5 robfinch
        .clk(mem_ui_clk),
281
        .ce(1'b1),
282
        .i((!ch6o.ack && ch6is.stb && !ch6is.we && chcnt[6]==CL) || (ch6is.we && ch6is.stb)),
283
        .pe(pe_req[6]),
284
        .ne(),
285
        .ee()
286
);
287
edge_det edch7 (
288 7 robfinch
        .rst(rste),
289 5 robfinch
        .clk(mem_ui_clk),
290
        .ce(1'b1),
291
        .i((!ch7o.ack && ch7is.stb && !ch7is.we && chcnt[7]==CL) || (ch7is.we && ch7is.stb)),
292
        .pe(pe_req[7]),
293
        .ne(),
294
        .ee()
295
);
296
wire [3:0] req_sel;
297 7 robfinch
always_ff @(posedge mem_ui_clk)
298
        for (n3 = 0; n3 < 8; n3 = n3 + 1)
299
                if (pe_req[n3])
300
                        req[n3] <= 1'b1;
301
                else if ((req_sel==n3[3:0]) || chack[n3])
302
                        req[n3] <= 1'b0;
303 5 robfinch
 
304
// Register signals onto mem_ui_clk domain
305
mpmc10_sync128_wb usyn0
306
(
307
        .clk(mem_ui_clk),
308
        .i(ch0i),
309
        .o(ch0is)
310
);
311
mpmc10_sync128_wb usyn1
312
(
313
        .clk(mem_ui_clk),
314
        .i(ch1i),
315
        .o(ch1is)
316
);
317
mpmc10_sync128_wb usyn2
318
(
319
        .clk(mem_ui_clk),
320
        .i(ch2i),
321
        .o(ch2is)
322
);
323
mpmc10_sync128_wb usyn3
324
(
325
        .clk(mem_ui_clk),
326
        .i(ch3i),
327
        .o(ch3is)
328
);
329
mpmc10_sync128_wb usyn4
330
(
331
        .clk(mem_ui_clk),
332
        .i(ch4i),
333
        .o(ch4is)
334
);
335
mpmc10_sync128_wb usyn5
336
(
337
        .clk(mem_ui_clk),
338
        .i(ch5i),
339
        .o(ch5is)
340
);
341
mpmc10_sync128_wb usyn6
342
(
343
        .clk(mem_ui_clk),
344
        .i(ch6i),
345
        .o(ch6is)
346
);
347
mpmc10_sync128_wb usyn7
348
(
349
        .clk(mem_ui_clk),
350
        .i(ch7i),
351
        .o(ch7is)
352
);
353
 
354
// Streaming channels have a burst length of 64. Round the address to the burst
355
// length.
356
always_comb
357
begin
358
        ch0is2 <= ch0is;
359
        ch0is2.adr <= {ch0is.adr[31:10],10'b0};
360
end
361
always_comb
362
begin
363
        ch1is2 <= ch1is;
364
        ch1is2.adr <= {ch1is.adr[31:10],10'b0};
365
end
366
always_comb
367
begin
368
        ch2is2 <= ch2is;
369
        ch2is2.adr <= {ch2is.adr[31:10],10'b0};
370
end
371
always_comb
372
begin
373
        ch3is2 <= ch3is;
374
        ch3is2.adr <= {ch3is.adr[31:10],10'b0};
375
end
376
always_comb
377
begin
378
        ch4is2 <= ch4is;
379
        ch4is2.adr <= {ch4is.adr[31:10],10'b0};
380
end
381
always_comb
382
begin
383
        ch5is2 <= ch5is;
384
        ch5is2.adr <= {ch5is.adr[31:10],10'b0};
385
end
386
always_comb
387
begin
388
        ch6is2 <= ch6is;
389
        ch6is2.adr <= {ch6is.adr[31:10],10'b0};
390
end
391
always_comb
392
begin
393
        ch7is2 <= ch7is;
394
        ch7is2.adr <= {ch7is.adr[31:10],10'b0};
395
end
396
 
397
always_comb
398
begin
399
        ld.bte <= wishbone_pkg::LINEAR;
400
        ld.cti <= wishbone_pkg::CLASSIC;
401
        ld.blen <= 'd0;
402 10 robfinch
        ld.cyc <= fifoo.cyc && !fifoo.we && rd_data_valid_r && (uch!=4'd0 && uch!=4'd5 && uch!=4'd15);
403 7 robfinch
        ld.stb <= fifoo.stb && !fifoo.we && rd_data_valid_r && (uch!=4'd0 && uch!=4'd5 && uch!=4'd15);
404 5 robfinch
        ld.we <= 1'b0;
405
        ld.adr <= {app_waddr[31:4],4'h0};
406 10 robfinch
        ld.dat <= rd_data_r;
407
        ld.sel <= {16{1'b1}};           // update all bytes
408 5 robfinch
end
409
 
410
reg ch0wack;
411
reg ch1wack;
412
reg ch2wack;
413
reg ch3wack;
414
reg ch4wack;
415
reg ch5wack;
416
reg ch6wack;
417
reg ch7wack;
418
 
419
always_ff @(posedge mem_ui_clk)
420
begin
421
        if (!ch0i.stb)  ch0wack <= 1'b0;
422
        if (!ch1i.stb)  ch1wack <= 1'b0;
423
        if (!ch2i.stb)  ch2wack <= 1'b0;
424
        if (!ch3i.stb)  ch3wack <= 1'b0;
425
        if (!ch4i.stb)  ch4wack <= 1'b0;
426
        if (!ch5i.stb)  ch5wack <= 1'b0;
427
        if (!ch6i.stb)  ch6wack <= 1'b0;
428
        if (!ch7i.stb)  ch7wack <= 1'b0;
429
        if (state==WRITE_DATA3)
430
                case(uch)
431
                4'd0:   ch0wack <= 1'b1;
432
                4'd1: ch1wack <= 1'b1;
433
                4'd2: ch2wack <= 1'b1;
434
                4'd3:   ch3wack <= 1'b1;
435
                4'd4:   ch4wack <= 1'b1;
436
                4'd5:   ch5wack <= 1'b1;
437
                4'd6:   ch6wack <= 1'b1;
438
                4'd7:   ch7wack <= 1'b1;
439
                default:        ;
440
                endcase
441
end
442
 
443
mpmc10_cache_wb ucache1
444
(
445
        .rst(mem_ui_rst),
446
        .wclk(mem_ui_clk),
447 7 robfinch
        .inv(1'b0),
448
        .wchi(fifoo),
449 5 robfinch
        .wcho(),
450
        .ld(ld),
451
        .ch0clk(STREAM0 ? 1'b0 : ch0clk),
452
        .ch1clk(STREAM1 ? 1'b0 : ch1clk),
453
        .ch2clk(STREAM2 ? 1'b0 : ch2clk),
454
        .ch3clk(STREAM3 ? 1'b0 : ch3clk),
455
        .ch4clk(STREAM4 ? 1'b0 : ch4clk),
456
        .ch5clk(STREAM5 ? 1'b0 : ch5clk),
457
        .ch6clk(STREAM6 ? 1'b0 : ch6clk),
458
        .ch7clk(STREAM7 ? 1'b0 : ch7clk),
459
        .ch0i(STREAM0 ? 'd0 : ch0is),
460
        .ch1i(STREAM1 ? 'd0 : ch1is),
461
        .ch2i(STREAM2 ? 'd0 : ch2is),
462
        .ch3i(STREAM3 ? 'd0 : ch3is),
463
        .ch4i(STREAM4 ? 'd0 : ch4is),
464
        .ch5i(STREAM5 ? 'd0 : ch5is),
465
        .ch6i(STREAM6 ? 'd0 : ch6is),
466
        .ch7i(STREAM7 ? 'd0 : ch7is),
467
        .ch0wack(ch0wack),
468
        .ch1wack(ch1wack),
469
        .ch2wack(ch2wack),
470
        .ch3wack(ch3wack),
471
        .ch4wack(ch4wack),
472
        .ch5wack(ch5wack),
473
        .ch6wack(ch6wack),
474
        .ch7wack(ch7wack),
475
        .ch0o(ch0oa),
476
        .ch1o(ch1oa),
477
        .ch2o(ch2oa),
478
        .ch3o(ch3oa),
479
        .ch4o(ch4oa),
480
        .ch5o(ch5oa),
481
        .ch6o(ch6oa),
482
        .ch7o(ch7oa)
483
);
484
 
485
mpmc10_strm_read_cache ustrm0
486
(
487
        .rst(rst),
488
        .wclk(mem_ui_clk),
489
        .wr(uch==4'd0 && rd_data_valid_r),
490
        .wadr({app_waddr[31:4],4'h0}),
491
        .wdat(rd_data_r),
492
//      .inv(1'b0),
493
        .rclk(mem_ui_clk),
494
        .rd(ch0is.stb & ~ch0is.we),
495
        .radr({ch0is.adr[31:4],4'h0}),
496
        .rdat(ch0ob.dat),
497
        .hit(ch0_hit_s)
498
);
499
 
500
mpmc10_strm_read_cache ustrm1
501
(
502
        .rst(rst),
503
        .wclk(mem_ui_clk),
504
        .wr(uch==4'd1 && rd_data_valid_r),
505
        .wadr({app_waddr[31:4],4'h0}),
506
        .wdat(rd_data_r),
507
//      .inv(1'b0),
508
        .rclk(mem_ui_clk),
509
        .rd(ch1is.stb & ~ch1is.we),
510
        .radr({ch1is.adr[31:4],4'h0}),
511
        .rdat(ch1ob.dat),
512
        .hit(ch1_hit_s)
513
);
514
 
515
mpmc10_strm_read_cache ustrm2
516
(
517
        .rst(rst),
518
        .wclk(mem_ui_clk),
519
        .wr(uch==4'd2 && rd_data_valid_r),
520
        .wadr({app_waddr[31:4],4'h0}),
521
        .wdat(rd_data_r),
522
//      .inv(1'b0),
523
        .rclk(mem_ui_clk),
524
        .rd(ch2is.stb & ~ch2is.we),
525
        .radr({ch2is.adr[31:4],4'h0}),
526
        .rdat(ch2ob.dat),
527
        .hit(ch2_hit_s)
528
);
529
 
530
mpmc10_strm_read_cache ustrm3
531
(
532
        .rst(rst),
533
        .wclk(mem_ui_clk),
534
        .wr(uch==4'd3 && rd_data_valid_r),
535
        .wadr({app_waddr[31:4],4'h0}),
536
        .wdat(rd_data_r),
537
//      .inv(1'b0),
538
        .rclk(mem_ui_clk),
539
        .rd(ch3is.stb & ~ch3is.we),
540
        .radr({ch3is.adr[31:4],4'h0}),
541
        .rdat(ch3ob.dat),
542
        .hit(ch3_hit_s)
543
);
544
 
545
mpmc10_strm_read_cache ustrm4
546
(
547
        .rst(rst),
548
        .wclk(mem_ui_clk),
549
        .wr(uch==4'd4 && rd_data_valid_r),
550
        .wadr({app_waddr[31:4],4'h0}),
551
        .wdat(rd_data_r),
552
//      .inv(1'b0),
553
        .rclk(mem_ui_clk),
554
        .rd(ch4is.stb & ~ch4is.we),
555
        .radr({ch4is.adr[31:4],4'h0}),
556
        .rdat(ch4ob.dat),
557
        .hit(ch4_hit_s)
558
);
559
 
560
mpmc10_strm_read_cache ustrm5
561
(
562
        .rst(rst),
563
        .wclk(mem_ui_clk),
564
        .wr(uch==4'd5 && rd_data_valid_r),
565
        .wadr({app_waddr[31:4],4'h0}),
566
        .wdat(rd_data_r),
567
//      .inv(1'b0),
568
        .rclk(mem_ui_clk),
569
        .rd(ch5is.stb & ~ch5is.we),
570
        .radr({ch5is.adr[31:4],4'h0}),
571
        .rdat(ch5ob.dat),
572
        .hit(ch5_hit_s)
573
);
574
 
575
mpmc10_strm_read_cache ustrm6
576
(
577
        .rst(rst),
578
        .wclk(mem_ui_clk),
579
        .wr(uch==4'd6 && rd_data_valid_r),
580
        .wadr({app_waddr[31:4],4'h0}),
581
        .wdat(rd_data_r),
582
//      .inv(1'b0),
583
        .rclk(mem_ui_clk),
584
        .rd(ch6is.stb & ~ch6is.we),
585
        .radr({ch6is.adr[31:4],4'h0}),
586
        .rdat(ch6ob.dat),
587
        .hit(ch6_hit_s)
588
);
589
 
590
mpmc10_strm_read_cache ustrm7
591
(
592
        .rst(rst),
593
        .wclk(mem_ui_clk),
594
        .wr(uch==4'd7 && rd_data_valid_r),
595
        .wadr({app_waddr[31:4],4'h0}),
596
        .wdat(rd_data_r),
597
//      .inv(1'b0),
598
        .rclk(mem_ui_clk),
599
        .rd(ch7is.stb & ~ch7is.we),
600
        .radr({ch7is.adr[31:4],4'h0}),
601
        .rdat(ch7ob.dat),
602
        .hit(ch7_hit_s)
603
);
604
 
605
always_comb     ch0ob.ack = ch0_hit_s & ch0i.stb;
606
always_comb     ch1ob.ack = ch1_hit_s & ch1i.stb;
607
always_comb     ch2ob.ack = ch2_hit_s & ch2i.stb;
608
always_comb     ch3ob.ack = ch3_hit_s & ch3i.stb;
609
always_comb     ch4ob.ack = ch4_hit_s & ch4i.stb;
610
always_comb     ch5ob.ack = ch5_hit_s & ch5i.stb;
611
always_comb     ch6ob.ack = ch6_hit_s & ch6i.stb;
612
always_comb     ch7ob.ack = ch7_hit_s & ch7i.stb;
613
 
614
wire [7:0] sel;
615
wire rd_rst_busy;
616
wire wr_rst_busy;
617
wire cd_sel;
618 7 robfinch
change_det #(.WID(8)) ucdsel (.rst(rst), .ce(1'b1), .clk(mem_ui_clk), .i(sel), .cd(cd_sel));
619 5 robfinch
 
620
always_comb     //ff @(posedge mem_ui_clk)
621
        wr_fifo = |sel & ~almost_full & ~wr_rst_busy & cd_sel;
622
 
623
roundRobin rr1
624
(
625
        .rst(rst),
626
        .clk(mem_ui_clk),
627
        .ce(1'b1),//~|req || chack[req_sel]),
628
        .req(req),
629
        .lock(8'h00),
630
        .sel(sel),
631
        .sel_enc(req_sel)
632
);
633
 
634
always_comb
635
        case(req_sel)
636
        4'd0:   req_fifoi <= STREAM0 ? ch0is2 : ch0is;
637
        4'd1:   req_fifoi <= STREAM1 ? ch1is2 : ch1is;
638
        4'd2:   req_fifoi <= STREAM2 ? ch2is2 : ch2is;
639
        4'd3:   req_fifoi <= STREAM3 ? ch3is2 : ch3is;
640
        4'd4:   req_fifoi <= STREAM4 ? ch4is2 : ch4is;
641
        4'd5:   req_fifoi <= STREAM5 ? ch5is2 : ch5is;
642
        4'd6:   req_fifoi <= STREAM6 ? ch6is2 : ch6is;
643
        4'd7:   req_fifoi <= STREAM7 ? ch7is2 : ch7is;
644 7 robfinch
        default:
645
                begin
646
                        req_fifoi <= 'd0;
647
                        req_fifoi.cid <= 4'd15;
648
                end
649 5 robfinch
        endcase
650
 
651
mpmc10_fifo ufifo1
652
(
653
        .rst(rst),
654
        .clk(mem_ui_clk),
655
        .rd_fifo(rd_fifo),
656
        .wr_fifo(wr_fifo),
657
        .req_fifoi(req_fifoi),
658
        .req_fifoo(req_fifoo),
659
        .v(v),
660
        .full(full),
661
        .empty(empty),
662
        .almost_full(almost_full),
663
        .rd_rst_busy(rd_rst_busy),
664
        .wr_rst_busy(wr_rst_busy),
665
        .cnt(cnt)
666
);
667
 
668
always_comb
669 7 robfinch
        uch <= fifoo.cid;
670 5 robfinch
always_comb
671 7 robfinch
        num_strips <= fifoo.blen;
672 5 robfinch
always_comb
673 7 robfinch
        adr <= fifoo.adr;
674 5 robfinch
 
675
wire [2:0] app_addr3;   // dummy to make up 32-bits
676
 
677
mpmc10_addr_gen uag1
678
(
679
        .rst(mem_ui_rst),
680
        .clk(mem_ui_clk),
681
        .state(state),
682
        .rdy(app_rdy),
683
        .num_strips(num_strips),
684
        .strip_cnt(req_strip_cnt),
685
        .addr_base(adr),
686
        .addr({app_addr3,app_addr})
687
);
688
 
689
mpmc10_waddr_gen uwag1
690
(
691
        .rst(mem_ui_rst),
692
        .clk(mem_ui_clk),
693
        .state(state),
694
        .valid(rd_data_valid_r),
695
        .num_strips(num_strips),
696
        .strip_cnt(resp_strip_cnt),
697
        .addr_base(adr),
698
        .addr(app_waddr)
699
);
700
 
701
mpmc10_mask_select unsks1
702
(
703
        .rst(mem_ui_rst),
704
        .clk(mem_ui_clk),
705
        .state(state),
706 10 robfinch
        .we(fifoo.we),
707
        .wmask(req_fifoo.sel[15:0]),
708 5 robfinch
        .mask(app_wdf_mask),
709
        .mask2(mem_wdf_mask2)
710
);
711
 
712
mpmc10_data_select #(.WID(128)) uds1
713
(
714
        .clk(mem_ui_clk),
715
        .state(state),
716
        .dati(req_fifoo.dat),
717
        .dato(dat256)
718
);
719
 
720
always_comb
721
        dat128 <= dat256;//req_strip_cnt[0] ? dat256[255:128] : dat256[127:0];
722
 
723
// Setting the data value. Unlike reads there is only a single strip involved.
724
// Force unselected byte lanes to $FF
725
reg [127:0] dat128x;
726
generate begin
727
        for (g = 0; g < 16; g = g + 1)
728
                always_comb
729
                        if (mem_wdf_mask2[g])
730
                                dat128x[g*8+7:g*8] = 8'hFF;
731
                        else
732
                                dat128x[g*8+7:g*8] = dat128[g*8+7:g*8];
733
end
734
endgenerate
735
 
736
always_ff @(posedge mem_ui_clk)
737
if (mem_ui_rst)
738
  app_wdf_data <= 128'd0;
739
else begin
740 7 robfinch
        if (state==PRESET3)
741 5 robfinch
                app_wdf_data <= dat128x;
742
//      else if (state==WRITE_TRAMP1)
743
//              app_wdf_data <= rmw_data;
744
end
745
 
746 7 robfinch
mpmc10_rd_fifo_gen urdf1
747
(
748
        .rst(rst|mem_ui_rst),
749
        .clk(mem_ui_clk),
750
        .state(state),
751
        .empty(empty),
752
        .rd_rst_busy(rd_rst_busy),
753
        .calib_complete(calib_complete),
754
        .rd(rd_fifo)
755
);
756 5 robfinch
 
757 7 robfinch
always_ff @(posedge mem_ui_clk)
758
if (rst)
759
        fifo_mask <= 'd0;
760
else begin
761
        if (rd_fifo)
762
                fifo_mask <= {$bits(fifo_mask){1'b1}};
763
        else if (state==IDLE)
764
                fifo_mask <= 'd0;
765
end
766
 
767 5 robfinch
mpmc10_state_machine_wb usm1
768
(
769
        .rst(rst|mem_ui_rst),
770
        .clk(mem_ui_clk),
771 7 robfinch
        .calib_complete(calib_complete),
772 5 robfinch
        .to(tocnt[9]),
773
        .rdy(app_rdy),
774
        .wdf_rdy(app_wdf_rdy),
775
        .fifo_empty(empty),
776
        .rd_rst_busy(rd_rst_busy),
777
        .fifo_out(req_fifoo),
778
        .state(state),
779
        .num_strips(num_strips),
780
        .req_strip_cnt(req_strip_cnt),
781
        .resp_strip_cnt(resp_strip_cnt),
782
        .rd_data_valid(rd_data_valid_r)
783
);
784
 
785
mpmc10_to_cnt utoc1
786
(
787
        .clk(mem_ui_clk),
788
        .state(state),
789
        .prev_state(prev_state),
790
        .to_cnt(tocnt)
791
);
792
 
793
mpmc10_prev_state upst1
794
(
795
        .clk(mem_ui_clk),
796
        .state(state),
797
        .prev_state(prev_state)
798
);
799
 
800
mpmc10_app_en_gen ueng1
801
(
802
        .clk(mem_ui_clk),
803
        .state(state),
804
        .rdy(app_rdy),
805
        .strip_cnt(req_strip_cnt),
806
        .num_strips(num_strips),
807
        .en(app_en)
808
);
809
 
810
mpmc10_app_cmd_gen ucg1
811
(
812
        .clk(mem_ui_clk),
813
        .state(state),
814
        .cmd(app_cmd)
815
);
816
 
817
mpmc10_app_wdf_wren_gen uwreng1
818
(
819
        .clk(mem_ui_clk),
820
        .state(state),
821
        .rdy(app_wdf_rdy),
822
        .wren(app_wdf_wren)
823
);
824
 
825
mpmc10_app_wdf_end_gen uwendg1
826
(
827
        .clk(mem_ui_clk),
828
        .state(state),
829
        .rdy(app_wdf_rdy),
830
        .strip_cnt(req_strip_cnt),
831
        .num_strips(num_strips),
832
        .wend(app_wdf_end)
833
);
834
 
835
mpmc10_req_strip_cnt ursc1
836
(
837
        .clk(mem_ui_clk),
838
        .state(state),
839
        .wdf_rdy(app_wdf_rdy),
840
        .rdy(app_rdy),
841
        .num_strips(num_strips),
842
        .strip_cnt(req_strip_cnt)
843
);
844
 
845
mpmc10_resp_strip_cnt urespsc1
846
(
847
        .clk(mem_ui_clk),
848
        .state(state),
849
        .valid(rd_data_valid_r),
850
        .num_strips(num_strips),
851
        .strip_cnt(resp_strip_cnt)
852
);
853
 
854
// Reservation status bit
855
mpmc10_resv_bit ursb1
856
(
857
        .clk(mem_ui_clk),
858
        .state(state),
859 7 robfinch
        .wch(fifoo.cid),
860
        .we(fifoo.stb & fifoo.we),
861
        .cr(fifoo.csr & fifoo.we),
862
        .adr(fifoo.adr),
863 5 robfinch
        .resv_ch(resv_ch),
864
        .resv_adr(resv_adr),
865
        .rb(rb1)
866
);
867
 
868
mpmc10_addr_resv_man #(.NAR(NAR)) ursvm1
869
(
870
        .rst(mem_ui_rst),
871
        .clk(mem_ui_clk),
872
        .state(state),
873
        .adr0(32'h0),
874
        .adr1(ch1is.adr),
875
        .adr2(ch2is.adr),
876
        .adr3(ch3is.adr),
877
        .adr4(ch4is.adr),
878
        .adr5(32'h0),
879
        .adr6(ch6is.adr),
880
        .adr7(ch7is.adr),
881
        .sr0(1'b0),
882
        .sr1(ch1is.csr & ch1is.stb & ~ch1is.we),
883
        .sr2(ch2is.csr & ch2is.stb & ~ch2is.we),
884
        .sr3(ch3is.csr & ch3is.stb & ~ch3is.we),
885
        .sr4(ch4is.csr & ch4is.stb & ~ch4is.we),
886
        .sr5(1'b0),
887
        .sr6(ch6is.csr & ch6is.stb & ~ch6is.we),
888
        .sr7(ch7is.csr & ch7is.stb & ~ch7is.we),
889 7 robfinch
        .wch(fifoo.stb ? fifoo.cid : 4'd15),
890
        .we(fifoo.stb & fifoo.we),
891
        .wadr(fifoo.adr),
892
        .cr(fifoo.csr & fifoo.stb & fifoo.we),
893 5 robfinch
        .resv_ch(resv_ch),
894
        .resv_adr(resv_adr)
895
);
896
 
897
endmodule

powered by: WebSVN 2.1.0

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