Skip to content

Commit af926a5

Browse files
authored
mem_to_banks_detailed: Ensure no spurious response after full dead write (#224)
* `mem_to_banks_detailed`: Ensure no spurious response after full dead write * `mem_to_banks_detailed`: Fix HideStrb alignment * Fix lint * mem_to_banks_detailed: Remove unneeded strb reduction
1 parent 77a086f commit af926a5

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
88
### Added
99
- `credit_counter`: Add up/down counter for credit.
1010

11+
### Fixed
12+
- `mem_to_banks_detailed`: Ensure no spurious response after full dead write.
13+
1114
## 1.36.0 - 2024-07-08
1215
### Fixed
1316
- `registers`: Fix else statement in FFARNC macro.

src/mem_to_banks_detailed.sv

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,13 @@ module mem_to_banks_detailed #(
109109
resp_valid, resp_ready;
110110
req_t [NumBanks-1:0] bank_req,
111111
bank_oup;
112-
logic [NumBanks-1:0] bank_req_internal, bank_gnt_internal, zero_strobe, dead_response;
113-
logic dead_write_fifo_full;
112+
logic [NumBanks-1:0] bank_req_internal,
113+
bank_gnt_internal,
114+
zero_strobe,
115+
dead_response,
116+
dead_response_unmasked;
117+
logic dead_write_fifo_full,
118+
dead_write_fifo_empty;
114119

115120
function automatic addr_t align_addr(input addr_t addr);
116121
return (addr >> $clog2(DataBytes)) << $clog2(DataBytes);
@@ -148,11 +153,13 @@ module mem_to_banks_detailed #(
148153
assign bank_wuser_o[i] = bank_oup[i].wuser;
149154
assign bank_we_o[i] = bank_oup[i].we;
150155

151-
assign zero_strobe[i] = (bank_oup[i].strb == '0);
156+
assign zero_strobe[i] = (bank_req[i].strb == '0);
152157

153158
if (HideStrb) begin : gen_hide_strb
154-
assign bank_req_o[i] = (bank_oup[i].we && zero_strobe[i]) ? 1'b0 : bank_req_internal[i];
155-
assign bank_gnt_internal[i] = (bank_oup[i].we && zero_strobe[i]) ? 1'b1 : bank_gnt_i[i];
159+
assign bank_req_o[i] = (bank_oup[i].we && (bank_oup[i].strb == '0)) ?
160+
1'b0 : bank_req_internal[i];
161+
assign bank_gnt_internal[i] = (bank_oup[i].we && (bank_oup[i].strb == '0)) ?
162+
1'b1 : bank_gnt_i[i];
156163
end else begin : gen_legacy_strb
157164
assign bank_req_o[i] = bank_req_internal[i];
158165
assign bank_gnt_internal[i] = bank_gnt_i[i];
@@ -170,19 +177,22 @@ module mem_to_banks_detailed #(
170177
) i_dead_write_fifo (
171178
.clk_i,
172179
.rst_ni,
173-
.flush_i ( 1'b0 ),
174-
.testmode_i ( 1'b0 ),
175-
.full_o ( dead_write_fifo_full ),
176-
.empty_o (),
180+
.flush_i ( 1'b0 ),
181+
.testmode_i ( 1'b0 ),
182+
.full_o ( dead_write_fifo_full ),
183+
.empty_o ( dead_write_fifo_empty ),
177184
.usage_o (),
178-
.data_i ( bank_we_o & zero_strobe ),
179-
.push_i ( req_i & gnt_o ),
180-
.data_o ( dead_response ),
181-
.pop_i ( rvalid_o )
185+
.data_i ( {NumBanks{we_i}} & zero_strobe ),
186+
.push_i ( req_i & gnt_o ),
187+
.data_o ( dead_response_unmasked ),
188+
.pop_i ( rvalid_o )
182189
);
190+
assign dead_response = dead_response_unmasked & {NumBanks{~dead_write_fifo_empty}};
183191
end else begin : gen_no_dead_write_fifo
192+
assign dead_response_unmasked = '0;
184193
assign dead_response = '0;
185194
assign dead_write_fifo_full = 1'b0;
195+
assign dead_write_fifo_empty = 1'b1;
186196
end
187197

188198
// Handle responses.

0 commit comments

Comments
 (0)