URL
https://opencores.org/ocsvn/mpmc8/mpmc8/trunk
Subversion Repositories mpmc8
Compare Revisions
- This comparison shows the changes necessary to convert path
/mpmc8
- from Rev 10 to Rev 11
- ↔ Reverse comparison
Rev 10 → Rev 11
/trunk/rtl/mpmc10/README.md
34,6 → 34,11
## Memory Access |
Memory is accessed in strips of 16 bytes which is the size that MIG interface uses. Specifying multiple strips for reading will use a burst of strips which is a much faster way to access memory. |
|
## Atomic Memory Operations |
The controller can perform several atomic memory operations including add, swap, |
and, or, eor, min, max, and shifts. It may also perform the compare-and-swap |
operation. |
|
## Address Reservations |
The controller supports address reservations on memory for imnplementation of semaphores. The CPU must output address reservation set and clear signals to support this. |
|
/trunk/rtl/mpmc10/mpcm10_cache_wb.sv
1,7 → 1,7
`timescale 1ns / 1ps |
// ============================================================================ |
// __ |
// \\__/ o\ (C) 2015-2022 Robert Finch, Waterloo |
// \\__/ o\ (C) 2015-2023 Robert Finch, Waterloo |
// \ __ / All rights reserved. |
// \/_// robfinch<remove>@finitron.ca |
// || |
39,9 → 39,9
import mpmc10_pkg::*; |
|
module mpmc10_cache_wb (input rst, wclk, inv, |
input wb_write_request128_t wchi, |
input wb_cmd_request128_t wchi, |
output wb_write_response_t wcho, |
input wb_write_request128_t ld, |
input wb_cmd_request128_t ld, |
input ch0clk, |
input ch1clk, |
input ch2clk, |
50,14 → 50,14
input ch5clk, |
input ch6clk, |
input ch7clk, |
input wb_write_request128_t ch0i, |
input wb_write_request128_t ch1i, |
input wb_write_request128_t ch2i, |
input wb_write_request128_t ch3i, |
input wb_write_request128_t ch4i, |
input wb_write_request128_t ch5i, |
input wb_write_request128_t ch6i, |
input wb_write_request128_t ch7i, |
input wb_cmd_request128_t ch0i, |
input wb_cmd_request128_t ch1i, |
input wb_cmd_request128_t ch2i, |
input wb_cmd_request128_t ch3i, |
input wb_cmd_request128_t ch4i, |
input wb_cmd_request128_t ch5i, |
input wb_cmd_request128_t ch6i, |
input wb_cmd_request128_t ch7i, |
input ch0wack, |
input ch1wack, |
input ch2wack, |
66,14 → 66,22
input ch5wack, |
input ch6wack, |
input ch7wack, |
output wb_read_response128_t ch0o, |
output wb_read_response128_t ch1o, |
output wb_read_response128_t ch2o, |
output wb_read_response128_t ch3o, |
output wb_read_response128_t ch4o, |
output wb_read_response128_t ch5o, |
output wb_read_response128_t ch6o, |
output wb_read_response128_t ch7o |
output wb_cmd_response128_t ch0o, |
output wb_cmd_response128_t ch1o, |
output wb_cmd_response128_t ch2o, |
output wb_cmd_response128_t ch3o, |
output wb_cmd_response128_t ch4o, |
output wb_cmd_response128_t ch5o, |
output wb_cmd_response128_t ch6o, |
output wb_cmd_response128_t ch7o, |
output reg ch0hit, |
output reg ch1hit, |
output reg ch2hit, |
output reg ch3hit, |
output reg ch4hit, |
output reg ch5hit, |
output reg ch6hit, |
output reg ch7hit |
); |
parameter DEP=1024; |
parameter LOBIT=4; |
133,16 → 141,16
reg stb7; |
reg [8:0] rstb; |
|
always_ff @(posedge ch0clk) radrr[0] <= ch0i.adr; |
always_ff @(posedge ch1clk) radrr[1] <= ch1i.adr; |
always_ff @(posedge ch2clk) radrr[2] <= ch2i.adr; |
always_ff @(posedge ch3clk) radrr[3] <= ch3i.adr; |
always_ff @(posedge ch4clk) radrr[4] <= ch4i.adr; |
always_ff @(posedge ch5clk) radrr[5] <= ch5i.adr; |
always_ff @(posedge ch6clk) radrr[6] <= ch6i.adr; |
always_ff @(posedge ch7clk) radrr[7] <= ch7i.adr; |
always_ff @(posedge wclk) radrr[8] <= ld.cyc ? ld.adr : wchi.adr; |
always_ff @(posedge wclk) wchi_adr1 <= wchi.adr; |
always_ff @(posedge ch0clk) radrr[0] <= ch0i.padr; |
always_ff @(posedge ch1clk) radrr[1] <= ch1i.padr; |
always_ff @(posedge ch2clk) radrr[2] <= ch2i.padr; |
always_ff @(posedge ch3clk) radrr[3] <= ch3i.padr; |
always_ff @(posedge ch4clk) radrr[4] <= ch4i.padr; |
always_ff @(posedge ch5clk) radrr[5] <= ch5i.padr; |
always_ff @(posedge ch6clk) radrr[6] <= ch6i.padr; |
always_ff @(posedge ch7clk) radrr[7] <= ch7i.padr; |
always_ff @(posedge wclk) radrr[8] <= ld.cyc ? ld.padr : wchi.padr; |
always_ff @(posedge wclk) wchi_adr1 <= wchi.padr; |
always_ff @(posedge wclk) wchi_adr <= wchi_adr1; |
|
always_ff @(posedge ch0clk) stb0 <= ch0i.stb; |
167,7 → 175,7
always_ff @(posedge wclk) wchi_stb_r <= wchi.stb; |
always_ff @(posedge wclk) wchi_stb <= wchi_stb_r; |
always_ff @(posedge wclk) wchi_sel <= wchi.sel; |
always_ff @(posedge wclk) wchi_dat <= wchi.dat; |
always_ff @(posedge wclk) wchi_dat <= wchi.data1; |
|
reg [8:0] rclkp; |
always_comb |
186,15 → 194,15
reg [HIBIT-LOBIT:0] radr [0:8]; |
always_comb |
begin |
radr[0] = ch0i.adr[HIBIT:LOBIT]; |
radr[1] = ch1i.adr[HIBIT:LOBIT]; |
radr[2] = ch2i.adr[HIBIT:LOBIT]; |
radr[3] = ch3i.adr[HIBIT:LOBIT]; |
radr[4] = ch4i.adr[HIBIT:LOBIT]; |
radr[5] = ch5i.adr[HIBIT:LOBIT]; |
radr[6] = ch6i.adr[HIBIT:LOBIT]; |
radr[7] = ch7i.adr[HIBIT:LOBIT]; |
radr[8] = ld.cyc ? ld.adr[HIBIT:LOBIT] : wchi.adr[HIBIT:LOBIT]; |
radr[0] = ch0i.padr[HIBIT:LOBIT]; |
radr[1] = ch1i.padr[HIBIT:LOBIT]; |
radr[2] = ch2i.padr[HIBIT:LOBIT]; |
radr[3] = ch3i.padr[HIBIT:LOBIT]; |
radr[4] = ch4i.padr[HIBIT:LOBIT]; |
radr[5] = ch5i.padr[HIBIT:LOBIT]; |
radr[6] = ch6i.padr[HIBIT:LOBIT]; |
radr[7] = ch7i.padr[HIBIT:LOBIT]; |
radr[8] = ld.cyc ? ld.padr[HIBIT:LOBIT] : wchi.padr[HIBIT:LOBIT]; |
end |
|
// xpm_memory_sdpram: Simple Dual Port RAM |
305,14 → 313,22
always_ff @(posedge ch7clk) hit7a[g] = (doutb[7].lines[g].tag==radrr[7][31:LOBIT]) && (vbito7a[g]==1'b1); |
always_ff @(posedge wclk) hit8a[g] = (doutb[8].lines[g].tag==radrr[8][31:LOBIT]) && (vbito8a[g]==1'b1); |
end |
always_comb ch0o.ack = (|hit0a & stb0) | (ch0wack & stb0); |
always_comb ch1o.ack = (|hit1a & stb1) | (ch1wack & stb1); |
always_comb ch2o.ack = (|hit2a & stb2) | (ch2wack & stb2); |
always_comb ch3o.ack = (|hit3a & stb3) | (ch3wack & stb3); |
always_comb ch4o.ack = (|hit4a & stb4) | (ch4wack & stb4); |
always_comb ch5o.ack = (|hit5a & stb5) | (ch5wack & stb5); |
always_comb ch6o.ack = (|hit6a & stb6) | (ch6wack & stb6); |
always_comb ch7o.ack = (|hit7a & stb7) | (ch7wack & stb7); |
always_comb ch0hit = |hit0a & stb0; |
always_comb ch1hit = |hit1a & stb1; |
always_comb ch2hit = |hit2a & stb2; |
always_comb ch3hit = |hit3a & stb3; |
always_comb ch4hit = |hit4a & stb4; |
always_comb ch5hit = |hit5a & stb5; |
always_comb ch6hit = |hit6a & stb6; |
always_comb ch7hit = |hit7a & stb7; |
always_comb ch0o.ack = (|hit0a && stb0 && (ch0i.cmd==CMD_LOAD||ch0i.cmd==CMD_LOADZ)) | (ch0wack & stb0); |
always_comb ch1o.ack = (|hit1a && stb1 && (ch1i.cmd==CMD_LOAD||ch1i.cmd==CMD_LOADZ)) | (ch1wack & stb1); |
always_comb ch2o.ack = (|hit2a && stb2 && (ch2i.cmd==CMD_LOAD||ch2i.cmd==CMD_LOADZ)) | (ch2wack & stb2); |
always_comb ch3o.ack = (|hit3a && stb3 && (ch3i.cmd==CMD_LOAD||ch3i.cmd==CMD_LOADZ)) | (ch3wack & stb3); |
always_comb ch4o.ack = (|hit4a && stb4 && (ch4i.cmd==CMD_LOAD||ch4i.cmd==CMD_LOADZ)) | (ch4wack & stb4); |
always_comb ch5o.ack = (|hit5a && stb5 && (ch5i.cmd==CMD_LOAD||ch5i.cmd==CMD_LOADZ)) | (ch5wack & stb5); |
always_comb ch6o.ack = (|hit6a && stb6 && (ch6i.cmd==CMD_LOAD||ch6i.cmd==CMD_LOADZ)) | (ch6wack & stb6); |
always_comb ch7o.ack = (|hit7a && stb7 && (ch7i.cmd==CMD_LOAD||ch7i.cmd==CMD_LOADZ)) | (ch7wack & stb7); |
always_comb ch0o.err = 1'b0; |
always_comb ch1o.err = 1'b0; |
always_comb ch2o.err = 1'b0; |
337,6 → 353,14
always_comb ch5o.cid = ch5i.cid; |
always_comb ch6o.cid = ch6i.cid; |
always_comb ch7o.cid = ch7i.cid; |
always_comb ch0o.tid = ch0i.tid; |
always_comb ch1o.tid = ch1i.tid; |
always_comb ch2o.tid = ch2i.tid; |
always_comb ch3o.tid = ch3i.tid; |
always_comb ch4o.tid = ch4i.tid; |
always_comb ch5o.tid = ch5i.tid; |
always_comb ch6o.tid = ch6i.tid; |
always_comb ch7o.tid = ch7i.tid; |
end |
endgenerate |
|
403,14 → 427,14
always_ff @(posedge wclk) |
begin |
if (ld.cyc) |
wadr <= ld.adr; |
wadr <= ld.padr; |
else if (wchi.stb) |
wadr <= wchi.adr; |
wadr <= wchi.padr; |
end |
always_ff @(posedge wclk) |
wadr2 <= wadr; |
always_ff @(posedge wclk) |
lddat1 <= ld.dat; |
lddat1 <= ld.data1; |
always_ff @(posedge wclk) |
lddat2 <= lddat1; |
always_ff @(posedge wclk) |
/trunk/rtl/mpmc10/mpmc10_addr_resv_man.sv
44,7 → 44,7
parameter NAR = 2; |
input rst; |
input clk; |
input [3:0] state; |
input mpmc10_state_t state; |
input [31:0] adr0; |
input [31:0] adr1; |
input [31:0] adr2; |
71,7 → 71,7
output reg [7:0] rack; // reservation acknowledged |
|
reg [19:0] resv_to_cnt; |
wire [2:0] enc; |
wire [3:0] enc; |
wire [7:0] srr = {sr7,sr6,sr5,sr4,sr3,sr2,sr1,sr0}; |
wire [31:0] adr [0:7]; |
|
125,7 → 125,7
if (enc==n7 && |srr) |
reserve_adr({1'b0,n7[2:0]},adr[n7]); |
|
if (state==mpmc10_pkg::IDLE) begin |
if (state==IDLE) begin |
if (we) begin |
if (cr) begin |
for (n7 = 0; n7 < NAR; n7 = n7 + 1) |
142,10 → 142,10
input [31:0] adr; |
integer n8; |
begin |
resv_held = mpmc10_pkg::FALSE; |
resv_held = 1'b0; |
for (n8 = 0; n8 < NAR; n8 = n8 + 1) |
if (resv_ch[n8]==ch && resv_adr[n8][31:5]==adr[31:5]) |
resv_held = mpmc10_pkg::TRUE; |
resv_held = 1'b1; |
end |
endfunction |
|
/trunk/rtl/mpmc10/mpmc10_app_en_gen.sv
48,15 → 48,15
// is not true, the command must be retried. |
always_ff @(posedge clk) |
begin |
en <= FALSE; |
en <= 1'b0; |
if (state==WRITE_DATA1) |
en <= TRUE; |
else if (state==WRITE_DATA2 && !en) |
en <= TRUE; |
en <= 1'b1; |
else if (state==WRITE_DATA2 && !rdy) |
en <= 1'b1; |
else if (state==READ_DATA0) |
en <= TRUE; |
en <= 1'b1; |
else if (state==READ_DATA1 && !(rdy && strip_cnt==num_strips)) |
en <= TRUE; |
en <= 1'b1; |
end |
|
endmodule |
/trunk/rtl/mpmc10/mpmc10_app_wdf_end_gen.sv
48,7 → 48,7
// true. |
always_ff @(posedge clk) |
begin |
wend <= FALSE; |
wend <= 1'b0; |
if (state==WRITE_DATA3) |
wend <= strip_cnt==num_strips; |
end |
/trunk/rtl/mpmc10/mpmc10_app_wdf_wren_gen.sv
46,9 → 46,9
// true. It must be after en is asserted to set the command and address. |
always_ff @(posedge clk) |
begin |
wren <= FALSE; |
wren <= 1'b0; |
if (state==WRITE_DATA3)// WRITE_DATA0 && rdy) |
wren <= TRUE; |
wren <= 1'b1; |
end |
|
endmodule |
/trunk/rtl/mpmc10/mpmc10_data_select.sv
1,7 → 1,7
`timescale 1ns / 1ps |
// ============================================================================ |
// __ |
// \\__/ o\ (C) 2015-2022 Robert Finch, Waterloo |
// \\__/ o\ (C) 2015-2023 Robert Finch, Waterloo |
// \ __ / All rights reserved. |
// \/_// robfinch<remove>@finitron.ca |
// || |
36,17 → 36,20
// |
import mpmc10_pkg::*; |
|
module mpmc10_data_select(clk, state, dati, dato); |
module mpmc10_data_select(clk, state, dati1, dati2, dato1, dato2); |
parameter WID=256; |
input clk; |
input mpmc10_state_t state; |
input [WID-1:0] dati; |
output reg [WID-1:0] dato; |
input [WID-1:0] dati1; |
input [WID-1:0] dati2; |
output reg [WID-1:0] dato1; |
output reg [WID-1:0] dato2; |
|
// Setting the write data |
always_ff @(posedge clk) |
if (state==PRESET2) begin |
dato <= dati; |
dato1 <= dati1; |
dato2 <= dati2; |
end |
|
endmodule |
/trunk/rtl/mpmc10/mpmc10_fifo.sv
42,8 → 42,8
input clk; |
input rd_fifo; |
input wr_fifo; |
input wb_write_request128_t req_fifoi; |
output wb_write_request128_t req_fifoo; |
input wb_cmd_request128_t req_fifoi; |
output wb_cmd_request128_t req_fifoo; |
output v; |
output full; |
output empty; |
62,12 → 62,12
.PROG_EMPTY_THRESH(3), // DECIMAL |
.PROG_FULL_THRESH(27), // DECIMAL |
.RD_DATA_COUNT_WIDTH(5), // DECIMAL |
.READ_DATA_WIDTH($bits(wb_write_request128_t)), // DECIMAL |
.READ_DATA_WIDTH($bits(wb_cmd_request128_t)), // DECIMAL |
.READ_MODE("std"), // String |
.SIM_ASSERT_CHK(0), // DECIMAL; 0=disable simulation messages, 1=enable simulation messages |
.USE_ADV_FEATURES("070F"), // String |
.WAKEUP_TIME(0), // DECIMAL |
.WRITE_DATA_WIDTH($bits(wb_write_request128_t)), // DECIMAL |
.WRITE_DATA_WIDTH($bits(wb_cmd_request128_t)), // DECIMAL |
.WR_DATA_COUNT_WIDTH(5) // DECIMAL |
) |
xpm_fifo_sync_inst ( |
/trunk/rtl/mpmc10/mpmc10_pkg.sv
1,6 → 1,6
// ============================================================================ |
// __ |
// \\__/ o\ (C) 2022 Robert Finch, Waterloo |
// \\__/ o\ (C) 2022-2023 Robert Finch, Waterloo |
// \ __ / All rights reserved. |
// \/_// robfinch<remove>@finitron.ca |
// || |
40,28 → 40,32
parameter RMW = 0; |
parameter NAR = 2; |
parameter AMSB = 28; |
parameter TRUE = 1'b1; |
parameter FALSE = 1'b0; |
parameter CMD_READ = 3'b001; |
parameter CMD_WRITE = 3'b000; |
|
// State machine states |
typedef enum logic [3:0] { |
IDLE = 4'd0, |
PRESET1 = 4'd1, |
PRESET2 = 4'd2, |
WRITE_DATA0 = 4'd3, |
WRITE_DATA1 = 4'd4, |
WRITE_DATA2 = 4'd5, |
WRITE_DATA3 = 4'd6, |
READ_DATA = 4'd7, |
READ_DATA0 = 4'd8, |
READ_DATA1 = 4'd9, |
READ_DATA2 = 4'd10, |
WAIT_NACK = 4'd11, |
WRITE_TRAMP = 4'd12, // write trampoline |
WRITE_TRAMP1 = 4'd13, |
PRESET3 = 4'd14 |
typedef enum logic [4:0] { |
IDLE = 5'd0, |
PRESET1 = 5'd1, |
PRESET2 = 5'd2, |
WRITE_DATA0 = 5'd3, |
WRITE_DATA1 = 5'd4, |
WRITE_DATA2 = 5'd5, |
WRITE_DATA3 = 5'd6, |
READ_DATA = 5'd7, |
READ_DATA0 = 5'd8, |
READ_DATA1 = 5'd9, |
READ_DATA2 = 5'd10, |
WAIT_NACK = 5'd11, |
WRITE_TRAMP = 5'd12, // write trampoline |
WRITE_TRAMP1 = 5'd13, |
PRESET3 = 5'd14, |
ALU = 5'd15, |
ALU1 = 5'd16, |
ALU2 = 5'd17, |
ALU3 = 5'd18, |
ALU4 = 5'd19, |
CAS = 5'd20 |
} mpmc10_state_t; |
|
typedef struct packed |
/trunk/rtl/mpmc10/mpmc10_resv_bit.sv
39,7 → 39,7
// Reservation status bit |
module mpmc10_resv_bit(clk, state, wch, we, cr, adr, resv_ch, resv_adr, rb); |
input clk; |
input [3:0] state; |
input mpmc10_state_t state; |
input we; |
input cr; |
input [3:0] wch; |
50,13 → 50,13
|
integer n5; |
always_ff @(posedge clk) |
if (state==mpmc10_pkg::IDLE) begin |
if (state==IDLE) begin |
if (we) begin |
if (cr) begin |
rb <= mpmc10_pkg::FALSE; |
rb <= 1'b0; |
for (n5 = 0; n5 < mpmc10_pkg::NAR; n5 = n5 + 1) |
if ((resv_ch[n5]==wch) && (resv_adr[n5][31:5]==adr[31:5])) |
rb <= mpmc10_pkg::TRUE; |
rb <= 1'b1; |
end |
end |
end |
/trunk/rtl/mpmc10/mpmc10_state_machine_wb.sv
1,7 → 1,7
`timescale 1ns / 1ps |
// ============================================================================ |
// __ |
// \\__/ o\ (C) 2015-2022 Robert Finch, Waterloo |
// \\__/ o\ (C) 2015-2023 Robert Finch, Waterloo |
// \ __ / All rights reserved. |
// \/_// robfinch<remove>@finitron.ca |
// || |
38,7 → 38,7
|
module mpmc10_state_machine_wb(rst, clk, calib_complete, to, rdy, wdf_rdy, fifo_empty, |
rd_rst_busy, fifo_out, state, |
num_strips, req_strip_cnt, resp_strip_cnt, rd_data_valid); |
num_strips, req_strip_cnt, resp_strip_cnt, rd_data_valid, rmw_hit); |
input rst; |
input clk; |
input calib_complete; |
47,12 → 47,13
input wdf_rdy; |
input fifo_empty; |
input rd_rst_busy; |
input wb_write_request128_t fifo_out; |
input wb_cmd_request128_t fifo_out; |
output mpmc10_state_t state; |
input [5:0] num_strips; |
input [5:0] req_strip_cnt; |
input [5:0] resp_strip_cnt; |
input rd_data_valid; |
input rmw_hit; |
|
mpmc10_state_t next_state; |
|
74,18 → 75,14
PRESET2: |
next_state <= PRESET3; |
PRESET3: |
if (fifo_out.stb & fifo_out.we) |
if (fifo_out.stb && fifo_out.cmd==CMD_STORE) |
next_state <= WRITE_DATA0; |
else |
next_state <= READ_DATA0; |
// Write data to the data fifo |
// Write occurs when app_wdf_wren is true and app_wdf_rdy is true |
// Write command to the command fifo |
// Write occurs when app_rdy is true |
WRITE_DATA0: |
// Issue a write command if the fifo is full. |
// if (!app_wdf_rdy) |
// next_state <= WRITE_DATA1; |
// else |
if (wdf_rdy)// && req_strip_cnt==num_strips) |
if (rdy)// && req_strip_cnt==num_strips) |
next_state <= WRITE_DATA1; |
else |
next_state <= WRITE_DATA0; |
96,8 → 93,13
next_state <= WRITE_DATA3; |
else |
next_state <= WRITE_DATA2; |
// Write data to the data fifo |
// Write occurs when app_wdf_wren is true and app_wdf_rdy is true |
WRITE_DATA3: |
next_state <= IDLE; |
if (wdf_rdy) |
next_state <= IDLE; |
else |
next_state <= WRITE_DATA3; |
|
// There could be multiple read requests submitted before any response occurs. |
// Stay in the SET_CMD_RD until all requested strips have been processed. |
112,10 → 114,34
next_state <= READ_DATA1; |
// Wait for incoming responses, but only for so long to prevent a hang. |
READ_DATA2: |
if (rd_data_valid && resp_strip_cnt==num_strips) |
next_state <= WAIT_NACK; |
if (rd_data_valid && resp_strip_cnt==num_strips) begin |
case(fifo_out.cmd) |
CMD_LOAD,CMD_LOADZ: |
next_state <= WAIT_NACK; |
CMD_ADD,CMD_OR,CMD_AND,CMD_EOR,CMD_ASL,CMD_LSR, |
CMD_MIN,CMD_MAX,CMD_MINU,CMD_MAXU,CMD_CAS: |
next_state <= ALU; |
default: |
next_state <= WAIT_NACK; |
endcase |
end |
else |
next_state <= READ_DATA2; |
|
ALU: |
if (rmw_hit) |
next_state <= ALU1; |
ALU1: |
next_state <= ALU2; |
ALU2: |
next_state <= ALU3; |
ALU3: |
next_state <= ALU4; |
ALU4: |
next_state <= WRITE_TRAMP1; |
|
WRITE_TRAMP1: |
next_state <= WRITE_DATA0; |
|
WAIT_NACK: |
// If we're not seeing a nack and there is a channel selected, then the |
/trunk/rtl/mpmc10/mpmc10_sync128_wb.sv
39,8 → 39,8
|
module mpmc10_sync128_wb(clk, i, o); |
input clk; |
input wb_write_request128_t i; |
output wb_write_request128_t o; |
input wb_cmd_request128_t i; |
output wb_cmd_request128_t o; |
|
always_ff @(posedge clk) |
begin |
/trunk/rtl/mpmc10/mpmc10_sync256_wb.sv
39,8 → 39,8
|
module mpmc10_sync256_wb(clk, i, o); |
input clk; |
input wb_write_request256_t i; |
output wb_write_request256_t o; |
input wb_cmd_request256_t i; |
output wb_cmd_request256_t o; |
|
always_ff @(posedge clk) |
begin |
/trunk/rtl/mpmc10/mpmc10_wb.sv
1,7 → 1,7
`timescale 1ns / 1ps |
// ============================================================================ |
// __ |
// \\__/ o\ (C) 2015-2022 Robert Finch, Waterloo |
// \\__/ o\ (C) 2015-2023 Robert Finch, Waterloo |
// \ __ / All rights reserved. |
// \/_// robfinch<remove>@finitron.ca |
// || |
32,12 → 32,18
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// |
// 16000 LUTs, 130 BRAM (64kB cache) |
// 26500 LUTs, 130 BRAM (64kB cache) |
// 21400 LUTs no AMO |
// |
// Read channels always wait until there is valid data in the cache. |
// ============================================================================ |
// |
//`define RED_SCREEN 1'b1 |
`define SUPPORT_AMO 1'b1 |
//`define SUPPORT_AMO_TETRA 1'b1 |
//`define SUPPORT_AMO_OCTA 1'b1 |
//`define SUPPORT_AMO_SHIFT 1'b1 |
//`define SUPPORT_AMO_MULTI_SHIFT 1'b1 |
|
import wishbone_pkg::*; |
import mpmc10_pkg::*; |
63,78 → 69,98
input [127:0] app_rd_data, |
input app_rd_data_end, |
input ch0clk, ch1clk, ch2clk, ch3clk, ch4clk, ch5clk, ch6clk, ch7clk, |
input wb_write_request128_t ch0i, |
output wb_read_response128_t ch0o, |
input wb_write_request128_t ch1i, |
output wb_read_response128_t ch1o, |
input wb_write_request128_t ch2i, |
output wb_read_response128_t ch2o, |
input wb_write_request128_t ch3i, |
output wb_read_response128_t ch3o, |
input wb_write_request128_t ch4i, |
output wb_read_response128_t ch4o, |
input wb_write_request128_t ch5i, |
output wb_read_response128_t ch5o, |
input wb_write_request128_t ch6i, |
output wb_read_response128_t ch6o, |
input wb_write_request128_t ch7i, |
output wb_read_response128_t ch7o, |
input wb_cmd_request128_t ch0i, |
output wb_cmd_response128_t ch0o, |
input wb_cmd_request128_t ch1i, |
output wb_cmd_response128_t ch1o, |
input wb_cmd_request128_t ch2i, |
output wb_cmd_response128_t ch2o, |
input wb_cmd_request128_t ch3i, |
output wb_cmd_response128_t ch3o, |
input wb_cmd_request128_t ch4i, |
output wb_cmd_response128_t ch4o, |
input wb_cmd_request128_t ch5i, |
output wb_cmd_response128_t ch5o, |
input wb_cmd_request128_t ch6i, |
output wb_cmd_response128_t ch6o, |
input wb_cmd_request128_t ch7i, |
output wb_cmd_response128_t ch7o, |
output mpmc10_state_t state |
); |
parameter NAR = 2; // Number of address reservations |
parameter CL = 3'd4; // Cache read latency |
parameter STREAM0 = TRUE; |
parameter STREAM1 = FALSE; |
parameter STREAM2 = FALSE; |
parameter STREAM3 = FALSE; |
parameter STREAM4 = FALSE; |
parameter STREAM5 = TRUE; |
parameter STREAM6 = FALSE; |
parameter STREAM7 = FALSE; |
parameter STREAM0 = 1'b1; |
parameter STREAM1 = 1'b0; |
parameter STREAM2 = 1'b0; |
parameter STREAM3 = 1'b0; |
parameter STREAM4 = 1'b0; |
parameter STREAM5 = 1'b1; |
parameter STREAM6 = 1'b0; |
parameter STREAM7 = 1'b0; |
parameter RMW0 = 1'b0; |
parameter RMW1 = 1'b1; |
parameter RMW2 = 1'b0; |
parameter RMW3 = 1'b0; |
parameter RMW4 = 1'b0; |
parameter RMW5 = 1'b0; |
parameter RMW6 = 1'b0; |
parameter RMW7 = 1'b1; |
|
wb_write_request128_t ch0is; |
wb_write_request128_t ch0is2; |
wb_write_request128_t ch1is; |
wb_write_request128_t ch1is2; |
wb_write_request128_t ch2is; |
wb_write_request128_t ch2is2; |
wb_write_request128_t ch3is; |
wb_write_request128_t ch3is2; |
wb_write_request128_t ch4is; |
wb_write_request128_t ch4is2; |
wb_write_request128_t ch5is; |
wb_write_request128_t ch5is2; |
wb_write_request128_t ch6is; |
wb_write_request128_t ch6is2; |
wb_write_request128_t ch7is; |
wb_write_request128_t ch7is2; |
wb_cmd_request128_t ch0is; |
wb_cmd_request128_t ch0is2; |
wb_cmd_request128_t ch1is; |
wb_cmd_request128_t ch1is2; |
wb_cmd_request128_t ch2is; |
wb_cmd_request128_t ch2is2; |
wb_cmd_request128_t ch3is; |
wb_cmd_request128_t ch3is2; |
wb_cmd_request128_t ch4is; |
wb_cmd_request128_t ch4is2; |
wb_cmd_request128_t ch5is; |
wb_cmd_request128_t ch5is2; |
wb_cmd_request128_t ch6is; |
wb_cmd_request128_t ch6is2; |
wb_cmd_request128_t ch7is; |
wb_cmd_request128_t ch7is2; |
|
wb_read_response128_t ch0oa, ch0ob; |
wb_read_response128_t ch1oa, ch1ob; |
wb_read_response128_t ch2oa, ch2ob; |
wb_read_response128_t ch3oa, ch3ob; |
wb_read_response128_t ch4oa, ch4ob; |
wb_read_response128_t ch5oa, ch5ob; |
wb_read_response128_t ch6oa, ch6ob; |
wb_read_response128_t ch7oa, ch7ob; |
wb_cmd_response128_t ch0oa, ch0ob, ch0oc; |
wb_cmd_response128_t ch1oa, ch1ob, ch1oc; |
wb_cmd_response128_t ch2oa, ch2ob, ch2oc; |
wb_cmd_response128_t ch3oa, ch3ob, ch3oc; |
wb_cmd_response128_t ch4oa, ch4ob, ch4oc; |
wb_cmd_response128_t ch5oa, ch5ob, ch5oc; |
wb_cmd_response128_t ch6oa, ch6ob, ch6oc; |
wb_cmd_response128_t ch7oa, ch7ob, ch7oc; |
|
assign ch0o = STREAM0 ? ch0ob : ch0oa; |
assign ch1o = STREAM1 ? ch1ob : ch1oa; |
assign ch2o = STREAM2 ? ch2ob : ch2oa; |
assign ch3o = STREAM3 ? ch3ob : ch3oa; |
assign ch4o = STREAM4 ? ch4ob : ch4oa; |
assign ch5o = STREAM5 ? ch5ob : ch5oa; |
assign ch6o = STREAM6 ? ch6ob : ch6oa; |
assign ch7o = STREAM7 ? ch7ob : ch7oa; |
wire rmw0 = ch0is.cmd[4]; |
wire rmw1 = ch1is.cmd[4]; |
wire rmw2 = ch2is.cmd[4]; |
wire rmw3 = ch3is.cmd[4]; |
wire rmw4 = ch4is.cmd[4]; |
wire rmw5 = ch5is.cmd[4]; |
wire rmw6 = ch6is.cmd[4]; |
wire rmw7 = ch7is.cmd[4]; |
|
wb_write_request128_t req_fifoi; |
wb_write_request128_t req_fifoo; |
wb_write_request128_t ld; |
wb_write_request128_t fifo_mask; |
wb_write_request128_t fifoo = req_fifoo & fifo_mask; |
assign ch0o = STREAM0 ? ch0ob : rmw0 ? ch0oc : ch0oa; |
assign ch1o = STREAM1 ? ch1ob : rmw1 ? ch1oc : ch1oa; |
assign ch2o = STREAM2 ? ch2ob : rmw2 ? ch2oc : ch2oa; |
assign ch3o = STREAM3 ? ch3ob : rmw3 ? ch3oc : ch3oa; |
assign ch4o = STREAM4 ? ch4ob : rmw4 ? ch4oc : ch4oa; |
assign ch5o = STREAM5 ? ch5ob : rmw5 ? ch5oc : ch5oa; |
assign ch6o = STREAM6 ? ch6ob : rmw6 ? ch6oc : ch6oa; |
assign ch7o = STREAM7 ? ch7ob : rmw7 ? ch7oc : ch7oa; |
|
wb_cmd_request128_t req_fifoi; |
wb_cmd_request128_t req_fifoo; |
wb_cmd_request128_t ld; |
wb_cmd_request128_t fifo_mask; |
wb_cmd_request128_t fifoo = req_fifoo & fifo_mask; |
|
genvar g; |
integer n1,n2,n3; |
wire v; |
wire full; |
wire empty; |
wire almost_full; |
wire [4:0] cnt; |
reg wr_fifo; |
144,7 → 170,6
wire [5:0] req_strip_cnt; |
wire [5:0] resp_strip_cnt; |
wire [15:0] tocnt; |
wire [31:0] app_waddr; |
reg [31:0] adr; |
reg [3:0] uch; // update channel |
wire [15:0] wmask; |
157,10 → 182,12
reg [7:0] req; |
reg [127:0] rd_data_r; |
reg rd_data_valid_r; |
reg cas_ok; |
|
wire ch0_hit_s, ch1_hit_s, ch2_hit_s, ch3_hit_s; |
wire ch4_hit_s, ch5_hit_s, ch6_hit_s, ch7_hit_s; |
wire ch0_hit_ne, ch5_hit_ne; |
wire hit0, hit1, hit2, hit3, hit4, hit5, hit6, hit7; |
|
always_ff @(posedge mem_ui_clk) |
if (app_rd_data_valid) |
356,42 → 383,42
always_comb |
begin |
ch0is2 <= ch0is; |
ch0is2.adr <= {ch0is.adr[31:10],10'b0}; |
ch0is2.padr <= {ch0is.padr[31:10],10'b0}; |
end |
always_comb |
begin |
ch1is2 <= ch1is; |
ch1is2.adr <= {ch1is.adr[31:10],10'b0}; |
ch1is2.padr <= {ch1is.padr[31:10],10'b0}; |
end |
always_comb |
begin |
ch2is2 <= ch2is; |
ch2is2.adr <= {ch2is.adr[31:10],10'b0}; |
ch2is2.padr <= {ch2is.padr[31:10],10'b0}; |
end |
always_comb |
begin |
ch3is2 <= ch3is; |
ch3is2.adr <= {ch3is.adr[31:10],10'b0}; |
ch3is2.padr <= {ch3is.padr[31:10],10'b0}; |
end |
always_comb |
begin |
ch4is2 <= ch4is; |
ch4is2.adr <= {ch4is.adr[31:10],10'b0}; |
ch4is2.padr <= {ch4is.padr[31:10],10'b0}; |
end |
always_comb |
begin |
ch5is2 <= ch5is; |
ch5is2.adr <= {ch5is.adr[31:10],10'b0}; |
ch5is2.padr <= {ch5is.padr[31:10],10'b0}; |
end |
always_comb |
begin |
ch6is2 <= ch6is; |
ch6is2.adr <= {ch6is.adr[31:10],10'b0}; |
ch6is2.padr <= {ch6is.padr[31:10],10'b0}; |
end |
always_comb |
begin |
ch7is2 <= ch7is; |
ch7is2.adr <= {ch7is.adr[31:10],10'b0}; |
ch7is2.padr <= {ch7is.padr[31:10],10'b0}; |
end |
|
always_comb |
402,8 → 429,8
ld.cyc <= fifoo.cyc && !fifoo.we && rd_data_valid_r && (uch!=4'd0 && uch!=4'd5 && uch!=4'd15); |
ld.stb <= fifoo.stb && !fifoo.we && rd_data_valid_r && (uch!=4'd0 && uch!=4'd5 && uch!=4'd15); |
ld.we <= 1'b0; |
ld.adr <= {app_waddr[31:4],4'h0}; |
ld.dat <= rd_data_r; |
ld.padr <= {app_waddr[31:4],4'h0}; |
ld.data1 <= rd_data_r; |
ld.sel <= {16{1'b1}}; // update all bytes |
end |
|
479,7 → 506,15
.ch4o(ch4oa), |
.ch5o(ch5oa), |
.ch6o(ch6oa), |
.ch7o(ch7oa) |
.ch7o(ch7oa), |
.ch0hit(hit0), |
.ch1hit(hit1), |
.ch2hit(hit2), |
.ch3hit(hit3), |
.ch4hit(hit4), |
.ch5hit(hit5), |
.ch6hit(hit6), |
.ch7hit(hit7) |
); |
|
mpmc10_strm_read_cache ustrm0 |
489,10 → 524,10
.wr(uch==4'd0 && rd_data_valid_r), |
.wadr({app_waddr[31:4],4'h0}), |
.wdat(rd_data_r), |
// .inv(1'b0), |
.inv(1'b0), |
.rclk(mem_ui_clk), |
.rd(ch0is.stb & ~ch0is.we), |
.radr({ch0is.adr[31:4],4'h0}), |
.radr({ch0is.padr[31:4],4'h0}), |
.rdat(ch0ob.dat), |
.hit(ch0_hit_s) |
); |
504,10 → 539,10
.wr(uch==4'd1 && rd_data_valid_r), |
.wadr({app_waddr[31:4],4'h0}), |
.wdat(rd_data_r), |
// .inv(1'b0), |
.inv(1'b0), |
.rclk(mem_ui_clk), |
.rd(ch1is.stb & ~ch1is.we), |
.radr({ch1is.adr[31:4],4'h0}), |
.radr({ch1is.padr[31:4],4'h0}), |
.rdat(ch1ob.dat), |
.hit(ch1_hit_s) |
); |
519,10 → 554,10
.wr(uch==4'd2 && rd_data_valid_r), |
.wadr({app_waddr[31:4],4'h0}), |
.wdat(rd_data_r), |
// .inv(1'b0), |
.inv(1'b0), |
.rclk(mem_ui_clk), |
.rd(ch2is.stb & ~ch2is.we), |
.radr({ch2is.adr[31:4],4'h0}), |
.radr({ch2is.padr[31:4],4'h0}), |
.rdat(ch2ob.dat), |
.hit(ch2_hit_s) |
); |
534,10 → 569,10
.wr(uch==4'd3 && rd_data_valid_r), |
.wadr({app_waddr[31:4],4'h0}), |
.wdat(rd_data_r), |
// .inv(1'b0), |
.inv(1'b0), |
.rclk(mem_ui_clk), |
.rd(ch3is.stb & ~ch3is.we), |
.radr({ch3is.adr[31:4],4'h0}), |
.radr({ch3is.padr[31:4],4'h0}), |
.rdat(ch3ob.dat), |
.hit(ch3_hit_s) |
); |
549,10 → 584,10
.wr(uch==4'd4 && rd_data_valid_r), |
.wadr({app_waddr[31:4],4'h0}), |
.wdat(rd_data_r), |
// .inv(1'b0), |
.inv(1'b0), |
.rclk(mem_ui_clk), |
.rd(ch4is.stb & ~ch4is.we), |
.radr({ch4is.adr[31:4],4'h0}), |
.radr({ch4is.padr[31:4],4'h0}), |
.rdat(ch4ob.dat), |
.hit(ch4_hit_s) |
); |
564,10 → 599,10
.wr(uch==4'd5 && rd_data_valid_r), |
.wadr({app_waddr[31:4],4'h0}), |
.wdat(rd_data_r), |
// .inv(1'b0), |
.inv(1'b0), |
.rclk(mem_ui_clk), |
.rd(ch5is.stb & ~ch5is.we), |
.radr({ch5is.adr[31:4],4'h0}), |
.radr({ch5is.padr[31:4],4'h0}), |
.rdat(ch5ob.dat), |
.hit(ch5_hit_s) |
); |
579,10 → 614,10
.wr(uch==4'd6 && rd_data_valid_r), |
.wadr({app_waddr[31:4],4'h0}), |
.wdat(rd_data_r), |
// .inv(1'b0), |
.inv(1'b0), |
.rclk(mem_ui_clk), |
.rd(ch6is.stb & ~ch6is.we), |
.radr({ch6is.adr[31:4],4'h0}), |
.radr({ch6is.padr[31:4],4'h0}), |
.rdat(ch6ob.dat), |
.hit(ch6_hit_s) |
); |
594,10 → 629,10
.wr(uch==4'd7 && rd_data_valid_r), |
.wadr({app_waddr[31:4],4'h0}), |
.wdat(rd_data_r), |
// .inv(1'b0), |
.inv(1'b0), |
.rclk(mem_ui_clk), |
.rd(ch7is.stb & ~ch7is.we), |
.radr({ch7is.adr[31:4],4'h0}), |
.radr({ch7is.padr[31:4],4'h0}), |
.rdat(ch7ob.dat), |
.hit(ch7_hit_s) |
); |
670,7 → 705,7
always_comb |
num_strips <= fifoo.blen; |
always_comb |
adr <= fifoo.adr; |
adr <= fifoo.padr; |
|
wire [2:0] app_addr3; // dummy to make up 32-bits |
|
709,17 → 744,177
.mask2(mem_wdf_mask2) |
); |
|
wire [127:0] data128a; |
wire [127:0] data128b; |
|
mpmc10_data_select #(.WID(128)) uds1 |
( |
.clk(mem_ui_clk), |
.state(state), |
.dati(req_fifoo.dat), |
.dato(dat256) |
.dati1(req_fifoo.data1), |
.dati2(req_fifoo.data2), |
.dato1(data128a), |
.dato2(data128b) |
); |
|
reg rmw_hit; |
reg rmw_ack; |
reg [127:0] opa, opa1, opb, opc, t1; |
reg [127:0] rmw_dat; |
`ifdef SUPPORT_AMO |
always_comb |
dat128 <= dat256;//req_strip_cnt[0] ? dat256[255:128] : dat256[127:0]; |
case(req_fifoo.cid) |
4'd0: rmw_hit = hit0; |
4'd1: rmw_hit = hit1; |
4'd2: rmw_hit = hit2; |
4'd3: rmw_hit = hit3; |
4'd4: rmw_hit = hit4; |
4'd5: rmw_hit = hit5; |
4'd6: rmw_hit = hit6; |
4'd7: rmw_hit = hit7; |
default: rmw_hit = 1'b1; |
endcase |
always_ff @(posedge mem_ui_clk) |
opb <= data128a >> {req_fifoo.padr[4:0],3'b0}; |
always_ff @(posedge mem_ui_clk) |
opc <= data128b >> {req_fifoo.padr[4:0],3'b0}; |
always_ff @(posedge mem_ui_clk) |
case(req_fifoo.cid) |
4'd0: opa1 <= ch0oa.dat; |
4'd1: opa1 <= ch1oa.dat; |
4'd2: opa1 <= ch2oa.dat; |
4'd3: opa1 <= ch3oa.dat; |
4'd4: opa1 <= ch4oa.dat; |
4'd5: opa1 <= ch5oa.dat; |
4'd6: opa1 <= ch6oa.dat; |
4'd7: opa1 <= ch7oa.dat; |
default: opa1 <= 'd0; |
endcase |
always_ff @(posedge mem_ui_clk) |
opa <= opa1 >> {req_fifoo.padr[4:0],3'b0}; |
always_ff @(posedge mem_ui_clk) |
case(req_fifoo.sz) |
`ifdef SUPPORT_AMO_TETRA |
wishbone_pkg::tetra: |
case(req_fifoo.cmd) |
CMD_ADD: t1 <= opa[31:0] + opb[31:0]; |
CMD_AND: t1 <= opa[31:0] & opb[31:0]; |
CMD_OR: t1 <= opa[31:0] | opb[31:0]; |
CMD_EOR: t1 <= opa[31:0] ^ opb[31:0]; |
`ifdef SUPPORT_AMO_SHIFT |
CMD_ASL: t1 <= {opa[30:0],1'b0}; |
CMD_LSR: t1 <= {1'b0,opa[31:1]}; |
CMD_ROL: t1 <= {opa[30:0],opa[31]}; |
CMD_ROR: t1 <= {opa[0],opa[31:1]}; |
`endif |
`ifdef SUPPORT_AMO_MULTI_SHIFT |
CMD_ASL: t1 <= opa[31:0] << opb[4:0]; |
CMD_LSR: t1 <= opa[31:0] >> opb[4:0]; |
`endif |
CMD_MINU: t1 <= opa[31:0] < opb[31:0] ? opa[31:0] : opb[31:0]; |
CMD_MAXU: t1 <= opa[31:0] > opb[31:0] ? opa[31:0] : opb[31:0]; |
CMD_MIN: t1 <= $signed(opa[31:0]) < $signed(opb[31:0]) ? opa[31:0] : opb[31:0]; |
CMD_MAX: t1 <= $signed(opa[31:0]) > $signed(opb[31:0]) ? opa[31:0] : opb[31:0]; |
CMD_CAS: t1 <= opa[31:0]==opb[31:0] ? opc[31:0] : opb[31:0]; |
default: t1 <= opa[31:0]; |
endcase |
`endif |
`ifdef SUPPORT_AMO_OCTA |
wishbone_pkg::octa: |
case(req_fifoo.cmd) |
CMD_ADD: t1 <= opa[63:0] + opb[63:0]; |
CMD_AND: t1 <= opa[63:0] & opb[63:0]; |
CMD_OR: t1 <= opa[63:0] | opb[63:0]; |
CMD_EOR: t1 <= opa[63:0] ^ opb[63:0]; |
`ifdef SUPPORT_AMO_SHIFT |
CMD_ASL: t1 <= {opa[62:0],1'b0}; |
CMD_LSR: t1 <= {1'b0,opa[63:1]}; |
CMD_ROL: t1 <= {opa[62:0],opa[63]}; |
CMD_ROR: t1 <= {opa[0],opa[63:1]}; |
`endif |
`ifdef SUPPORT_AMO_MULTI_SHIFT |
CMD_ASL: t1 <= opa[63:0] << opb[5:0]; |
CMD_LSR: t1 <= opa[63:0] >> opb[5:0]; |
`endif |
CMD_MINU: t1 <= opa[63:0] < opb[63:0] ? opa[63:0] : opb[63:0]; |
CMD_MAXU: t1 <= opa[63:0] > opb[63:0] ? opa[63:0] : opb[63:0]; |
CMD_MIN: t1 <= $signed(opa[63:0]) < $signed(opb[63:0]) ? opa[63:0] : opb[63:0]; |
CMD_MAX: t1 <= $signed(opa[63:0]) > $signed(opb[63:0]) ? opa[63:0] : opb[63:0]; |
CMD_CAS: t1 <= opa[63:0]==opb[63:0] ? opc[63:0] : opb[63:0]; |
default: t1 <= opa[63:0]; |
endcase |
`endif |
default: |
case(req_fifoo.cmd) |
CMD_ADD: t1 <= opa[127:0] + opb[127:0]; |
CMD_AND: t1 <= opa[127:0] & opb[127:0]; |
CMD_OR: t1 <= opa[127:0] | opb[127:0]; |
CMD_EOR: t1 <= opa[127:0] ^ opb[127:0]; |
`ifdef SUPPORT_AMO_SHIFT |
CMD_ASL: t1 <= {opa[126:0],1'b0}; |
CMD_LSR: t1 <= {1'b0,opa[127:1]}; |
CMD_ROL: t1 <= {opa[126:0],opa[127]}; |
CMD_ROR: t1 <= {opa[0],opa[127:1]}; |
`endif |
`ifdef SUPPORT_AMO_MULTI_SHIFT |
CMD_ASL: t1 <= opa[127:0] << opb[6:0]; |
CMD_LSR: t1 <= opa[127:0] >> opb[6:0]; |
`endif |
CMD_MINU: t1 <= opa[127:0] < opb[127:0] ? opa[127:0] : opb[127:0]; |
CMD_MAXU: t1 <= opa[127:0] > opb[127:0] ? opa[127:0] : opb[127:0]; |
CMD_MIN: t1 <= $signed(opa[127:0]) < $signed(opb[127:0]) ? opa[127:0] : opb[127:0]; |
CMD_MAX: t1 <= $signed(opa[127:0]) > $signed(opb[127:0]) ? opa[127:0] : opb[127:0]; |
CMD_CAS: t1 <= opa[127:0]==opb[127:0] ? opc[127:0] : opb[127:0]; |
default: t1 <= opa[127:0]; |
endcase |
endcase |
always_ff @(posedge mem_ui_clk) |
rmw_dat <= t1 << {req_fifoo.padr[4:0],3'b0}; |
|
always_ff @(posedge mem_ui_clk) |
if (mem_ui_rst) begin |
ch0oc.dat <= 'd0; |
ch1oc.dat <= 'd0; |
ch2oc.dat <= 'd0; |
ch3oc.dat <= 'd0; |
ch4oc.dat <= 'd0; |
ch5oc.dat <= 'd0; |
ch6oc.dat <= 'd0; |
ch7oc.dat <= 'd0; |
end |
else begin |
if (state==WRITE_TRAMP1) |
case(req_fifoo.cid) |
4'd0: ch0oc.dat <= opa; |
4'd1: ch1oc.dat <= opa; |
4'd2: ch2oc.dat <= opa; |
4'd3: ch3oc.dat <= opa; |
4'd4: ch4oc.dat <= opa; |
4'd5: ch5oc.dat <= opa; |
4'd6: ch6oc.dat <= opa; |
4'd7: ch7oc.dat <= opa; |
default: ; |
endcase |
end |
always_ff @(posedge mem_ui_clk) |
if (mem_ui_rst) |
rmw_ack <= 1'b0; |
else begin |
if (state==WRITE_TRAMP1) |
rmw_ack <= 1'b1; |
else if (state==IDLE) |
rmw_ack <= 1'b0; |
end |
always_comb ch0oc.ack = ch0i.stb & rmw_ack & rmw0 && req_fifoo.cid==4'd0; |
always_comb ch1oc.ack = ch1i.stb & rmw_ack & rmw1 && req_fifoo.cid==4'd1; |
always_comb ch2oc.ack = ch2i.stb & rmw_ack & rmw2 && req_fifoo.cid==4'd2; |
always_comb ch3oc.ack = ch3i.stb & rmw_ack & rmw3 && req_fifoo.cid==4'd3; |
always_comb ch4oc.ack = ch4i.stb & rmw_ack & rmw4 && req_fifoo.cid==4'd4; |
always_comb ch5oc.ack = ch5i.stb & rmw_ack & rmw5 && req_fifoo.cid==4'd5; |
always_comb ch6oc.ack = ch6i.stb & rmw_ack & rmw6 && req_fifoo.cid==4'd6; |
always_comb ch7oc.ack = ch7i.stb & rmw_ack & rmw7 && req_fifoo.cid==4'd7; |
`endif |
|
// Setting the data value. Unlike reads there is only a single strip involved. |
// Force unselected byte lanes to $FF |
reg [127:0] dat128x; |
729,7 → 924,7
if (mem_wdf_mask2[g]) |
dat128x[g*8+7:g*8] = 8'hFF; |
else |
dat128x[g*8+7:g*8] = dat128[g*8+7:g*8]; |
dat128x[g*8+7:g*8] = data128a[g*8+7:g*8]; |
end |
endgenerate |
|
739,8 → 934,8
else begin |
if (state==PRESET3) |
app_wdf_data <= dat128x; |
// else if (state==WRITE_TRAMP1) |
// app_wdf_data <= rmw_data; |
else if (state==WRITE_TRAMP1) |
app_wdf_data <= rmw_dat; |
end |
|
mpmc10_rd_fifo_gen urdf1 |
779,7 → 974,8
.num_strips(num_strips), |
.req_strip_cnt(req_strip_cnt), |
.resp_strip_cnt(resp_strip_cnt), |
.rd_data_valid(rd_data_valid_r) |
.rd_data_valid(rd_data_valid_r), |
.rmw_hit(rmw_hit) |
); |
|
mpmc10_to_cnt utoc1 |
859,7 → 1055,7
.wch(fifoo.cid), |
.we(fifoo.stb & fifoo.we), |
.cr(fifoo.csr & fifoo.we), |
.adr(fifoo.adr), |
.adr(fifoo.padr), |
.resv_ch(resv_ch), |
.resv_adr(resv_adr), |
.rb(rb1) |
871,13 → 1067,13
.clk(mem_ui_clk), |
.state(state), |
.adr0(32'h0), |
.adr1(ch1is.adr), |
.adr2(ch2is.adr), |
.adr3(ch3is.adr), |
.adr4(ch4is.adr), |
.adr1(ch1is.padr), |
.adr2(ch2is.padr), |
.adr3(ch3is.padr), |
.adr4(ch4is.padr), |
.adr5(32'h0), |
.adr6(ch6is.adr), |
.adr7(ch7is.adr), |
.adr6(ch6is.padr), |
.adr7(ch7is.padr), |
.sr0(1'b0), |
.sr1(ch1is.csr & ch1is.stb & ~ch1is.we), |
.sr2(ch2is.csr & ch2is.stb & ~ch2is.we), |
888,7 → 1084,7
.sr7(ch7is.csr & ch7is.stb & ~ch7is.we), |
.wch(fifoo.stb ? fifoo.cid : 4'd15), |
.we(fifoo.stb & fifoo.we), |
.wadr(fifoo.adr), |
.wadr(fifoo.padr), |
.cr(fifoo.csr & fifoo.stb & fifoo.we), |
.resv_ch(resv_ch), |
.resv_adr(resv_adr) |