Rework resets
This commit is contained in:
@@ -33,6 +33,7 @@ from cocotb.utils import get_sim_time
|
||||
|
||||
from .version import __version__
|
||||
from .constants import EthPre, ETH_PREAMBLE
|
||||
from .reset import Reset
|
||||
|
||||
|
||||
class GmiiFrame:
|
||||
@@ -114,7 +115,7 @@ class GmiiFrame:
|
||||
return bytes(self.data)
|
||||
|
||||
|
||||
class GmiiSource:
|
||||
class GmiiSource(Reset):
|
||||
|
||||
def __init__(self, data, er, dv, clock, reset=None, enable=None, mii_select=None, *args, **kwargs):
|
||||
self.log = logging.getLogger(f"cocotb.{data._path}")
|
||||
@@ -145,8 +146,6 @@ class GmiiSource:
|
||||
self.width = 8
|
||||
self.byte_width = 1
|
||||
|
||||
self.reset = reset
|
||||
|
||||
assert len(self.data) == 8
|
||||
self.data.setimmediatevalue(0)
|
||||
if self.er is not None:
|
||||
@@ -155,7 +154,9 @@ class GmiiSource:
|
||||
assert len(self.dv) == 1
|
||||
self.dv.setimmediatevalue(0)
|
||||
|
||||
cocotb.fork(self._run())
|
||||
self._run_cr = None
|
||||
|
||||
self._init_reset(reset)
|
||||
|
||||
async def send(self, frame):
|
||||
self.send_nowait(frame)
|
||||
@@ -179,6 +180,23 @@ class GmiiSource:
|
||||
while not self.idle():
|
||||
await RisingEdge(self.clock)
|
||||
|
||||
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 = None
|
||||
else:
|
||||
self.log.info("Reset de-asserted")
|
||||
if self._run_cr is None:
|
||||
self._run_cr = cocotb.fork(self._run())
|
||||
|
||||
self.active = False
|
||||
self.data <= 0
|
||||
if self.er is not None:
|
||||
self.er <= 0
|
||||
self.dv <= 0
|
||||
|
||||
async def _run(self):
|
||||
frame = None
|
||||
ifg_cnt = 0
|
||||
@@ -187,16 +205,6 @@ class GmiiSource:
|
||||
while True:
|
||||
await RisingEdge(self.clock)
|
||||
|
||||
if self.reset is not None and self.reset.value:
|
||||
frame = None
|
||||
ifg_cnt = 0
|
||||
self.active = False
|
||||
self.data <= 0
|
||||
if self.er is not None:
|
||||
self.er <= 0
|
||||
self.dv <= 0
|
||||
continue
|
||||
|
||||
if self.enable is None or self.enable.value:
|
||||
if ifg_cnt > 0:
|
||||
# in IFG
|
||||
@@ -243,7 +251,7 @@ class GmiiSource:
|
||||
self.active = False
|
||||
|
||||
|
||||
class GmiiSink:
|
||||
class GmiiSink(Reset):
|
||||
|
||||
def __init__(self, data, er, dv, clock, reset=None, enable=None, mii_select=None, *args, **kwargs):
|
||||
self.log = logging.getLogger(f"cocotb.{data._path}")
|
||||
@@ -274,15 +282,15 @@ class GmiiSink:
|
||||
self.width = 8
|
||||
self.byte_width = 1
|
||||
|
||||
self.reset = reset
|
||||
|
||||
assert len(self.data) == 8
|
||||
if self.er is not None:
|
||||
assert len(self.er) == 1
|
||||
if self.dv is not None:
|
||||
assert len(self.dv) == 1
|
||||
|
||||
cocotb.fork(self._run())
|
||||
self._run_cr = None
|
||||
|
||||
self._init_reset(reset)
|
||||
|
||||
async def recv(self, compact=True):
|
||||
while self.empty():
|
||||
@@ -316,6 +324,19 @@ class GmiiSink:
|
||||
else:
|
||||
await self.sync.wait()
|
||||
|
||||
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 = None
|
||||
else:
|
||||
self.log.info("Reset de-asserted")
|
||||
if self._run_cr is None:
|
||||
self._run_cr = cocotb.fork(self._run())
|
||||
|
||||
self.active = False
|
||||
|
||||
async def _run(self):
|
||||
frame = None
|
||||
self.active = False
|
||||
@@ -323,11 +344,6 @@ class GmiiSink:
|
||||
while True:
|
||||
await RisingEdge(self.clock)
|
||||
|
||||
if self.reset is not None and self.reset.value:
|
||||
frame = None
|
||||
self.active = False
|
||||
continue
|
||||
|
||||
if self.enable is None or self.enable.value:
|
||||
d_val = self.data.value.integer
|
||||
dv_val = self.dv.value.integer
|
||||
|
||||
Reference in New Issue
Block a user