Skip to content

Commit 9c0592c

Browse files
committed
Make wstrb optional
1 parent 8aab5a7 commit 9c0592c

File tree

6 files changed

+32
-9
lines changed

6 files changed

+32
-9
lines changed

cocotbext/axi/axi_channels.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434

3535
# Write data channel
3636
AxiWBus, AxiWTransaction, AxiWSource, AxiWSink, AxiWMonitor = define_stream("AxiW",
37-
signals=["wdata", "wstrb", "wlast", "wvalid", "wready"],
38-
optional_signals=["wuser"],
37+
signals=["wdata", "wlast", "wvalid", "wready"],
38+
optional_signals=["wstrb", "wuser"],
3939
signal_widths={"wlast": 1}
4040
)
4141

cocotbext/axi/axi_master.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ def __init__(self, bus, clock, reset=None, reset_active_level=True, max_burst_le
241241
self.awqos_present = hasattr(self.bus.aw, "awqos")
242242
self.awregion_present = hasattr(self.bus.aw, "awregion")
243243
self.awuser_present = hasattr(self.bus.aw, "awuser")
244+
self.wstrb_present = hasattr(self.bus.w, "wstrb")
244245
self.wuser_present = hasattr(self.bus.w, "wuser")
245246
self.buser_present = hasattr(self.bus.b, "buser")
246247

@@ -263,7 +264,8 @@ def __init__(self, bus, clock, reset=None, reset_active_level=True, max_burst_le
263264
else:
264265
self.log.info(" %s: not present", sig)
265266

266-
assert self.byte_lanes == len(self.w_channel.bus.wstrb)
267+
if self.wstrb_present:
268+
assert self.byte_lanes == len(self.w_channel.bus.wstrb)
267269
assert self.byte_lanes * self.byte_size == self.width
268270

269271
assert len(self.b_channel.bus.bid) == len(self.aw_channel.bus.awid)
@@ -480,6 +482,9 @@ async def _process_write(self):
480482

481483
n += 1
482484

485+
if not self.wstrb_present and strb != self.strb_mask:
486+
self.log.warning("Partial operation requested with wstrb not connected, write will be zero-padded (0x%x != 0x%x)", strb, self.strb_mask)
487+
483488
w = self.w_channel._transaction_obj()
484489
w.wdata = val
485490
w.wstrb = strb

cocotbext/axi/axi_slave.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ def __init__(self, bus, clock, reset=None, target=None, reset_active_level=True,
6363

6464
self.max_burst_size = (self.byte_lanes-1).bit_length()
6565

66+
self.wstrb_present = hasattr(self.bus.w, "wstrb")
67+
6668
self.log.info("AXI slave model configuration:")
6769
self.log.info(" Address width: %d bits", self.address_width)
6870
self.log.info(" ID width: %d bits", self.id_width)
@@ -77,7 +79,8 @@ def __init__(self, bus, clock, reset=None, target=None, reset_active_level=True,
7779
else:
7880
self.log.info(" %s: not present", sig)
7981

80-
assert self.byte_lanes == len(self.w_channel.bus.wstrb)
82+
if self.wstrb_present:
83+
assert self.byte_lanes == len(self.w_channel.bus.wstrb)
8184
assert self.byte_lanes * self.byte_size == self.width
8285

8386
assert len(self.b_channel.bus.bid) == len(self.aw_channel.bus.awid)
@@ -146,7 +149,10 @@ async def _process_write(self):
146149
w = await self.w_channel.recv()
147150

148151
data = int(w.wdata)
149-
strb = int(getattr(w, 'wstrb', self.strb_mask))
152+
if self.wstrb_present:
153+
strb = int(getattr(w, 'wstrb', self.strb_mask))
154+
else:
155+
strb = self.strb_mask
150156
last = int(w.wlast)
151157

152158
# generate operation list

cocotbext/axi/axil_channels.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333

3434
# Write data channel
3535
AxiLiteWBus, AxiLiteWTransaction, AxiLiteWSource, AxiLiteWSink, AxiLiteWMonitor = define_stream("AxiLiteW",
36-
signals=["wdata", "wstrb", "wvalid", "wready"]
36+
signals=["wdata", "wvalid", "wready"],
37+
optional_signals=["wstrb"]
3738
)
3839

3940
# Write response channel

cocotbext/axi/axil_master.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ def __init__(self, bus, clock, reset=None, reset_active_level=True, **kwargs):
119119
self.strb_mask = 2**self.byte_lanes-1
120120

121121
self.awprot_present = hasattr(self.bus.aw, "awprot")
122+
self.wstrb_present = hasattr(self.bus.w, "wstrb")
122123

123124
super().__init__(2**self.address_width, **kwargs)
124125

@@ -135,7 +136,8 @@ def __init__(self, bus, clock, reset=None, reset_active_level=True, **kwargs):
135136
else:
136137
self.log.info(" %s: not present", sig)
137138

138-
assert self.byte_lanes == len(self.w_channel.bus.wstrb)
139+
if self.wstrb_present:
140+
assert self.byte_lanes == len(self.w_channel.bus.wstrb)
139141
assert self.byte_lanes * self.byte_size == self.width
140142

141143
self._process_write_cr = None
@@ -269,6 +271,9 @@ async def _process_write(self):
269271
aw.awaddr = word_addr + k*self.byte_lanes
270272
aw.awprot = cmd.prot
271273

274+
if not self.wstrb_present and strb != self.strb_mask:
275+
self.log.warning("Partial operation requested with wstrb not connected, write will be zero-padded (0x%x != 0x%x)", strb, self.strb_mask)
276+
272277
w = self.w_channel._transaction_obj()
273278
w.wdata = val
274279
w.wstrb = strb

cocotbext/axi/axil_slave.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ def __init__(self, bus, clock, reset=None, target=None, reset_active_level=True,
6060
self.byte_lanes = self.width // self.byte_size
6161
self.strb_mask = 2**self.byte_lanes-1
6262

63+
self.wstrb_present = hasattr(self.bus.w, "wstrb")
64+
6365
self.log.info("AXI lite slave model configuration:")
6466
self.log.info(" Memory size: %d bytes", len(self.mem))
6567
self.log.info(" Address width: %d bits", self.address_width)
@@ -74,7 +76,8 @@ def __init__(self, bus, clock, reset=None, target=None, reset_active_level=True,
7476
else:
7577
self.log.info(" %s: not present", sig)
7678

77-
assert self.byte_lanes == len(self.w_channel.bus.wstrb)
79+
if self.wstrb_present:
80+
assert self.byte_lanes == len(self.w_channel.bus.wstrb)
7881
assert self.byte_lanes * self.byte_size == self.width
7982

8083
self._process_write_cr = None
@@ -109,7 +112,10 @@ async def _process_write(self):
109112
w = await self.w_channel.recv()
110113

111114
data = int(w.wdata)
112-
strb = int(getattr(w, 'wstrb', self.strb_mask))
115+
if self.wstrb_present:
116+
strb = int(getattr(w, 'wstrb', self.strb_mask))
117+
else:
118+
strb = self.strb_mask
113119

114120
# generate operation list
115121
offset = 0

0 commit comments

Comments
 (0)