Skip to content

Commit ebcdcac

Browse files
committed
hw: Mask TCDM write data stability check on reads
1 parent 269830a commit ebcdcac

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

Bender.local

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@
55
overrides:
66
# Some of our dependencies have false conflicts with our new AXI version; force our version.
77
axi: {git: https://github.com/pulp-platform/axi.git, version: 0.39.0}
8+
# TODO: remove after common_cells merge and release
9+
common_cells: {git: https://github.com/pulp-platform/common_cells.git, rev: paulsc/xbar-stab-mask}

hw/snitch_cluster/src/snitch_tcdm_interconnect.sv

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ module snitch_tcdm_interconnect #(
6363
typedef logic [StrbWidth-1:0] strb_t;
6464
`MEM_TYPEDEF_REQ_CHAN_T(mem_req_chan_t, addr_t, data_t, strb_t, user_t);
6565

66+
// Do not assert unconditional stability on write data inside interconnects,
67+
// as write data may freely change on (non-atomic) reads. We properly assert
68+
// conditional write data stability below.
69+
localparam mem_req_chan_t MemReqAsrtMask =
70+
{data: '0, strb: '0, amo: reqrsp_pkg::amo_op_e'('1), default: '1};
71+
72+
// TODO: proper write asserts!
73+
6674
// Width of the bank select signal.
6775
localparam int unsigned SelWidth = cf_math_pkg::idx_width(NumOut);
6876
typedef logic [SelWidth-1:0] select_t;
@@ -88,7 +96,7 @@ module snitch_tcdm_interconnect #(
8896
logic [NumInp-1:0] req_q_valid_flat, rsp_q_ready_flat;
8997
logic [NumOut-1:0] mem_q_valid_flat, mem_q_ready_flat;
9098

91-
// The usual struct packing unpacking.
99+
// The usual struct packing unpacking; also check write stability here.
92100
for (genvar i = 0; i < NumInp; i++) begin : gen_flat_inp
93101
assign req_q_valid_flat[i] = req_i[i].q_valid;
94102
assign rsp_o[i].q_ready = rsp_q_ready_flat[i];
@@ -100,6 +108,17 @@ module snitch_tcdm_interconnect #(
100108
strb: req_i[i].q.strb,
101109
user: req_i[i].q.user
102110
};
111+
112+
// Write data must also be stable during AMOs, so include this case in assertions.
113+
logic in_req_alters_mem;
114+
assign in_req_alters_mem = in_req[i].write | (in_req[i].amo != reqrsp_pkg::AMONone);
115+
116+
assert property (@(posedge clk_i) disable iff (~rst_ni) (req_q_valid_flat[i] &&
117+
!rsp_q_ready_flat[i] && in_req_alters_mem |=> $stable(in_req[i].data))) else
118+
$error("write data during non-read is unstable at input: %0d", i);
119+
assert property (@(posedge clk_i) disable iff (~rst_ni) (req_q_valid_flat[i] &&
120+
!rsp_q_ready_flat[i] && in_req_alters_mem |=> $stable(in_req[i].strb))) else
121+
$error("write strobe during non-read is unstable at input: %0d", i);
103122
end
104123

105124
for (genvar i = 0; i < NumOut; i++) begin : gen_flat_oup
@@ -121,7 +140,8 @@ module snitch_tcdm_interconnect #(
121140
.OutSpillReg ( 1'b0 ),
122141
.ExtPrio ( 1'b0 ),
123142
.AxiVldRdy ( 1'b1 ),
124-
.LockIn ( 1'b1 )
143+
.LockIn ( 1'b1 ),
144+
.AxiVldMask ( MemReqAsrtMask )
125145
) i_stream_xbar (
126146
.clk_i,
127147
.rst_ni,
@@ -198,7 +218,8 @@ module snitch_tcdm_interconnect #(
198218
.SpillReg ( 1'b0 ),
199219
.AxiVldRdy ( 1'b1 ),
200220
.LockIn ( 1'b1 ),
201-
.Radix ( Radix )
221+
.Radix ( Radix ),
222+
.AxiVldMask ( MemReqAsrtMask )
202223
) i_stream_omega_net (
203224
.clk_i,
204225
.rst_ni,

0 commit comments

Comments
 (0)