Skip to content

Commit a3dead6

Browse files
committed
hw: Block SSR reads during write streams
1 parent eccb8f7 commit a3dead6

File tree

3 files changed

+11
-2
lines changed

3 files changed

+11
-2
lines changed

hw/snitch_ssr/src/snitch_ssr.sv

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ module snitch_ssr import snitch_ssr_pkg::*; #(
3333
// Register lanes from switch.
3434
output data_t lane_rdata_o,
3535
input data_t lane_wdata_i,
36+
input logic lane_write_i,
3637
output logic lane_valid_o,
3738
input logic lane_ready_i,
3839
// Ports into memory.
@@ -158,9 +159,13 @@ module snitch_ssr import snitch_ssr_pkg::*; #(
158159

159160
always_comb begin
160161
if (dm_write) begin
161-
lane_valid_o = ~fifo_full;
162+
// Accept only writes and only when there is space in the FIFO.
163+
// Note this blocks read accesses until the current write stream is over;
164+
// This means that reads in the midst of write streams are *deadlocking*
165+
// just like excess reads past finished read streams are.
166+
lane_valid_o = lane_write_i & ~fifo_full;
162167
data_req_qvalid = agen_valid & ~fifo_empty & has_credit & ~agen_flush;
163-
fifo_push = lane_ready_i & ~fifo_full;
168+
fifo_push = lane_valid_o & lane_ready_i;
164169
fifo_in = lane_wdata_i;
165170
rep_enable = 0;
166171
fifo_pop = data_req_qvalid & data_rsp.q_ready;

hw/snitch_ssr/src/snitch_ssr_streamer.sv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ module snitch_ssr_streamer import snitch_ssr_pkg::*; #(
155155
.cfg_wready_o ( dmcfg_wready [i] ),
156156
.lane_rdata_o ( lane_rdata [i] ),
157157
.lane_wdata_i ( lane_wdata [i] ),
158+
.lane_write_i ( lane_write [i] ),
158159
.lane_valid_o ( lane_valid [i] ),
159160
.lane_ready_i ( lane_ready [i] ),
160161
.mem_req_o ( mem_req_o [i] ),

hw/snitch_ssr/test/fixture_ssr.sv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ module fixture_ssr import snitch_ssr_pkg::*; #(
102102
tcdm_rsp_t mem_rsp_i;
103103
logic [DataWidth-1:0] lane_rdata_o;
104104
logic [DataWidth-1:0] lane_wdata_i;
105+
logic [DataWidth-1:0] lane_write_i;
105106
logic [AddrWidth-1:0] tcdm_start_address_i = '0; // (currently) required for test flow
106107

107108
// Device Under Test (DUT)
@@ -126,6 +127,7 @@ module fixture_ssr import snitch_ssr_pkg::*; #(
126127
.cfg_wready_o,
127128
.lane_rdata_o,
128129
.lane_wdata_i,
130+
.lane_write_i,
129131
.lane_valid_o,
130132
.lane_ready_i,
131133
.mem_req_o,
@@ -304,6 +306,7 @@ module fixture_ssr import snitch_ssr_pkg::*; #(
304306

305307
// Swap valid and ready to emulate 3-way handshake
306308
assign lane_wdata_i = ssr_bus.wdata;
309+
assign lane_write_i = ssr_bus.write;
307310
assign lane_ready_i = ssr_bus.valid;
308311
assign ssr_bus.rdata = lane_rdata_o;
309312
assign ssr_bus.ready = lane_valid_o;

0 commit comments

Comments
 (0)