Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@ __pycache__/
.tox
sim_build_*
.coverage

sim_build
results.xml
37 changes: 20 additions & 17 deletions cocotbext/axi/apb.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,15 @@
from typing import NamedTuple

import cocotb
from cocotb.handle import Immediate
from cocotb.queue import Queue
from cocotb.triggers import RisingEdge, Event
from cocotb.triggers import RisingEdge
from cocotb_bus.bus import Bus

from .version import __version__
from .constants import AxiResp, AxiProt
from .address_space import Region
from .event import Event
from .reset import Reset
from .memory import Memory

Expand Down Expand Up @@ -108,7 +110,7 @@ def pause(self, val):

def set_pause_generator(self, generator=None):
if self._pause_cr is not None:
self._pause_cr.kill()
self._pause_cr.cancel()
self._pause_cr = None

self._pause_generator = generator
Expand Down Expand Up @@ -178,15 +180,15 @@ def __init__(self, bus, clock, reset=None, reset_active_level=True, **kwargs):
assert self.byte_lanes == len(self.bus.pstrb)
assert self.byte_lanes * self.byte_size == self.width

self.bus.paddr.setimmediatevalue(0)
self.bus.paddr.set(Immediate(0))
if self.pprot_present:
self.bus.pprot.setimmediatevalue(0)
self.bus.psel.setimmediatevalue(False)
self.bus.penable.setimmediatevalue(False)
self.bus.pwrite.setimmediatevalue(False)
self.bus.pwdata.setimmediatevalue(0)
self.bus.pprot.set(Immediate(0))
self.bus.psel.set(Immediate(False))
self.bus.penable.set(Immediate(False))
self.bus.pwrite.set(Immediate(False))
self.bus.pwdata.set(Immediate(0))
if self.pstrb_present:
self.bus.pstrb.setimmediatevalue(0)
self.bus.pstrb.set(Immediate(0))

self._run_cr = None

Expand Down Expand Up @@ -307,7 +309,7 @@ def _handle_reset(self, state):
self.bus.penable.value = False

if self._run_cr is not None:
self._run_cr.kill()
self._run_cr.cancel()
self._run_cr = None

def flush_cmd(cmd):
Expand Down Expand Up @@ -418,7 +420,7 @@ async def _run(self):

self.bus.penable.value = False

cycle_data = int(self.bus.prdata.value)
cycle_data = int(self.bus.prdata.value.resolve("zeros"))
if self.pslverr_present and int(self.bus.pslverr.value):
resp = AxiResp.SLVERR

Expand Down Expand Up @@ -499,10 +501,10 @@ def __init__(self, bus, clock, reset=None, target=None, reset_active_level=True,
assert self.byte_lanes == len(self.bus.pstrb)
assert self.byte_lanes * self.byte_size == self.width

self.bus.pready.setimmediatevalue(False)
self.bus.prdata.setimmediatevalue(0)
self.bus.pready.set(Immediate(False))
self.bus.prdata.set(Immediate(0))
if self.pslverr_present:
self.bus.pslverr.setimmediatevalue(0)
self.bus.pslverr.set(Immediate(0))

self._run_cr = None

Expand All @@ -518,7 +520,7 @@ def _handle_reset(self, state):
self.bus.pready.value = False

if self._run_cr is not None:
self._run_cr.kill()
self._run_cr.cancel()
self._run_cr = None
else:
self.log.info("Reset de-asserted")
Expand All @@ -536,8 +538,9 @@ async def _run(self):
if self.pause:
continue

if not int(self.bus.psel.value) or not int(self.bus.penable.value):
continue
if (not int(self.bus.psel.value.resolve("zeros")) or
not int(self.bus.penable.value.resolve("zeros"))):
continue

addr = (int(self.bus.paddr.value) // self.byte_lanes) * self.byte_lanes
if self.pprot_present:
Expand Down
12 changes: 6 additions & 6 deletions cocotbext/axi/axi_master.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@

import cocotb
from cocotb.queue import Queue
from cocotb.triggers import Event

from .version import __version__
from .constants import AxiBurstType, AxiLockType, AxiProt, AxiResp
from .axi_channels import AxiAWSource, AxiWSource, AxiBSink, AxiARSource, AxiRSink
from .address_space import Region
from .event import Event
from .reset import Reset


Expand Down Expand Up @@ -129,7 +129,7 @@ def _start(self):
def _flush(self):
flushed_cmds = []
if self._cr is not None:
self._cr.kill()
self._cr.cancel()
self._cr = None
self._manager._set_idle(self)
if self._current_cmd is not None:
Expand Down Expand Up @@ -431,10 +431,10 @@ def _handle_reset(self, state):
if state:
self.log.info("Reset asserted")
if self._process_write_cr is not None:
self._process_write_cr.kill()
self._process_write_cr.cancel()
self._process_write_cr = None
if self._process_write_resp_cr is not None:
self._process_write_resp_cr.kill()
self._process_write_resp_cr.cancel()
self._process_write_resp_cr = None

self.aw_channel.clear()
Expand Down Expand Up @@ -842,10 +842,10 @@ def _handle_reset(self, state):
if state:
self.log.info("Reset asserted")
if self._process_read_cr is not None:
self._process_read_cr.kill()
self._process_read_cr.cancel()
self._process_read_cr = None
if self._process_read_resp_cr is not None:
self._process_read_resp_cr.kill()
self._process_read_resp_cr.cancel()
self._process_read_resp_cr = None

self.ar_channel.clear()
Expand Down
4 changes: 2 additions & 2 deletions cocotbext/axi/axi_slave.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ def _handle_reset(self, state):
if state:
self.log.info("Reset asserted")
if self._process_write_cr is not None:
self._process_write_cr.kill()
self._process_write_cr.cancel()
self._process_write_cr = None

self.aw_channel.clear()
Expand Down Expand Up @@ -263,7 +263,7 @@ def _handle_reset(self, state):
if state:
self.log.info("Reset asserted")
if self._process_read_cr is not None:
self._process_read_cr.kill()
self._process_read_cr.cancel()
self._process_read_cr = None

self.ar_channel.clear()
Expand Down
10 changes: 5 additions & 5 deletions cocotbext/axi/axil_master.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@

import cocotb
from cocotb.queue import Queue
from cocotb.triggers import Event

from .version import __version__
from .constants import AxiProt, AxiResp
from .axil_channels import AxiLiteAWSource, AxiLiteWSource, AxiLiteBSink, AxiLiteARSource, AxiLiteRSink
from .address_space import Region
from .event import Event
from .reset import Reset


Expand Down Expand Up @@ -211,10 +211,10 @@ def _handle_reset(self, state):
if state:
self.log.info("Reset asserted")
if self._process_write_cr is not None:
self._process_write_cr.kill()
self._process_write_cr.cancel()
self._process_write_cr = None
if self._process_write_resp_cr is not None:
self._process_write_resp_cr.kill()
self._process_write_resp_cr.cancel()
self._process_write_resp_cr = None

self.aw_channel.clear()
Expand Down Expand Up @@ -463,10 +463,10 @@ def _handle_reset(self, state):
if state:
self.log.info("Reset asserted")
if self._process_read_cr is not None:
self._process_read_cr.kill()
self._process_read_cr.cancel()
self._process_read_cr = None
if self._process_read_resp_cr is not None:
self._process_read_resp_cr.kill()
self._process_read_resp_cr.cancel()
self._process_read_resp_cr = None

self.ar_channel.clear()
Expand Down
4 changes: 2 additions & 2 deletions cocotbext/axi/axil_slave.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ def _handle_reset(self, state):
if state:
self.log.info("Reset asserted")
if self._process_write_cr is not None:
self._process_write_cr.kill()
self._process_write_cr.cancel()
self._process_write_cr = None

self.aw_channel.clear()
Expand Down Expand Up @@ -212,7 +212,7 @@ def _handle_reset(self, state):
if state:
self.log.info("Reset asserted")
if self._process_read_cr is not None:
self._process_read_cr.kill()
self._process_read_cr.cancel()
self._process_read_cr = None

self.ar_channel.clear()
Expand Down
23 changes: 12 additions & 11 deletions cocotbext/axi/axis.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import logging

import cocotb
from cocotb.handle import Immediate
from cocotb.queue import Queue, QueueFull
from cocotb.triggers import RisingEdge, Timer, First, Event
from cocotb.utils import get_sim_time
Expand Down Expand Up @@ -299,9 +300,9 @@ def __init__(self, bus, clock, reset=None, reset_active_level=True,
self.byte_lanes = self.width // 8

if self._valid_init is not None and hasattr(self.bus, "tvalid"):
self.bus.tvalid.setimmediatevalue(self._valid_init)
self.bus.tvalid.set(Immediate(self._valid_init))
if self._ready_init is not None and hasattr(self.bus, "tready"):
self.bus.tready.setimmediatevalue(self._ready_init)
self.bus.tready.set(Immediate(self._ready_init))

for sig in self._signals+self._optional_signals:
if hasattr(self.bus, sig):
Expand All @@ -312,7 +313,7 @@ def __init__(self, bus, clock, reset=None, reset_active_level=True,
except NameError:
v = s.value
v.binstr = 'x'*len(v)
s.setimmediatevalue(v)
s.set(Immediate(v))

if hasattr(self.bus, "tkeep"):
self.byte_lanes = len(self.bus.tkeep)
Expand Down Expand Up @@ -369,7 +370,7 @@ def _handle_reset(self, state):
if state:
self.log.info("Reset asserted")
if self._run_cr is not None:
self._run_cr.kill()
self._run_cr.cancel()
self._run_cr = None

self.active = False
Expand Down Expand Up @@ -408,7 +409,7 @@ def pause(self, val):

def set_pause_generator(self, generator=None):
if self._pause_cr is not None:
self._pause_cr.kill()
self._pause_cr.cancel()
self._pause_cr = None

self._pause_generator = generator
Expand Down Expand Up @@ -527,8 +528,8 @@ async def _run(self):
await clock_edge_event

# read handshake signals
tready_sample = (not has_tready) or self.bus.tready.value
tvalid_sample = (not has_tvalid) or self.bus.tvalid.value
tready_sample = (not has_tready) or self.bus.tready.value.resolve("zeros")
tvalid_sample = (not has_tvalid) or self.bus.tvalid.value.resolve("zeros")

if (tready_sample and tvalid_sample) or not tvalid_sample:
if not frame and not self.queue.empty():
Expand Down Expand Up @@ -697,8 +698,8 @@ async def _run(self):
await clock_edge_event

# read handshake signals
tready_sample = (not has_tready) or self.bus.tready.value
tvalid_sample = (not has_tvalid) or self.bus.tvalid.value
tready_sample = (not has_tready) or self.bus.tready.value.resolve("zeros")
tvalid_sample = (not has_tvalid) or self.bus.tvalid.value.resolve("zeros")

if tready_sample and tvalid_sample:
if not frame:
Expand Down Expand Up @@ -798,8 +799,8 @@ async def _run(self):
await clock_edge_event

# read handshake signals
tready_sample = (not has_tready) or self.bus.tready.value
tvalid_sample = (not has_tvalid) or self.bus.tvalid.value
tready_sample = (not has_tready) or self.bus.tready.value.resolve("zeros")
tvalid_sample = (not has_tvalid) or self.bus.tvalid.value.resolve("zeros")

if tready_sample and tvalid_sample:
if not frame:
Expand Down
22 changes: 22 additions & 0 deletions cocotbext/axi/event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from __future__ import annotations

import cocotb.triggers


class Event(cocotb.triggers.Event):
def __init__(self):
super().__init__()
self._data: object | None = None

@property
def data(self) -> object:
return self._data

@data.setter
def data(self, data: object) -> None:
self._data = data

def set(self, data: object | None = None) -> None:
super().set()
self._data = data

2 changes: 1 addition & 1 deletion cocotbext/axi/reset.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def _handle_reset(self, state):

async def _run_reset(self, reset_signal, active_level):
while True:
await Edge(reset_signal)
await reset_signal.value_change
try:
level = bool(int(reset_signal.value))
except ValueError:
Expand Down
Loading