Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bebafc3f73 | |||
|
|
c6872e6951 | ||
|
|
e9232d6bc9 | ||
|
|
71be7f50d5 | ||
|
|
7077200912 | ||
|
|
2e356c3fc5 | ||
|
|
c25e2e6b23 | ||
|
|
bdebdd4897 | ||
|
|
3f7a0ad919 | ||
|
|
b0c3671ca0 | ||
|
|
73df05c706 | ||
|
|
bc8dbb039c | ||
|
|
afb7d2bd10 |
63
.github/workflows/build.yaml
vendored
Normal file
63
.github/workflows/build.yaml
vendored
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
name: build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- 'dev/**'
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- published
|
||||||
|
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build distributions
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v4
|
||||||
|
name: Install Python
|
||||||
|
with:
|
||||||
|
python-version: "3.10"
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
python -m pip install build
|
||||||
|
|
||||||
|
- name: Build sdist
|
||||||
|
run: python -m build
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: dist
|
||||||
|
path: |
|
||||||
|
dist/*.tar.gz
|
||||||
|
dist/*.whl
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
deploy:
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
environment: release
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
# Only publish when a Gitea Release is created.
|
||||||
|
if: gitea.event_name == 'release'
|
||||||
|
steps:
|
||||||
|
- uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: dist
|
||||||
|
path: dist
|
||||||
|
|
||||||
|
- run: python3 -m pip install twine --user --break-system-packages
|
||||||
|
- run: python3 -m pip install -U packaging --user --break-system-packages
|
||||||
|
- run: TWINE_PASSWORD=${{ secrets.PYPI_PAT }} TWINE_USERNAME=bslathi19 python -m twine upload --repository-url ${{ vars.CI_API_URL }} dist/*
|
||||||
4
.github/workflows/regression-tests.yml
vendored
4
.github/workflows/regression-tests.yml
vendored
@@ -5,11 +5,11 @@ on: [push, pull_request]
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Python ${{matrix.python-version}}
|
name: Python ${{matrix.python-version}}
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"]
|
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Ethernet interface modules for Cocotb
|
# Ethernet interface modules for Cocotb
|
||||||
|
|
||||||
[](https://github.com/alexforencich/cocotbext-eth/actions/)
|
[](https://github.com/alexforencich/cocotbext-eth/actions/workflows/regression-tests.yml)
|
||||||
[](https://codecov.io/gh/alexforencich/cocotbext-eth)
|
[](https://codecov.io/gh/alexforencich/cocotbext-eth)
|
||||||
[](https://pypi.org/project/cocotbext-eth)
|
[](https://pypi.org/project/cocotbext-eth)
|
||||||
[](https://pepy.tech/project/cocotbext-eth)
|
[](https://pepy.tech/project/cocotbext-eth)
|
||||||
@@ -30,7 +30,7 @@ Installation for active development:
|
|||||||
|
|
||||||
## Documentation and usage examples
|
## Documentation and usage examples
|
||||||
|
|
||||||
See the `tests` directory, [verilog-ethernet](https://github.com/alexforencich/verilog-ethernet), and [corundum](https://github.com/corundum/corundum) for complete testbenches using these modules.
|
See the `tests` directory, [taxi](https://github.com/fpganinja/taxi), [verilog-ethernet](https://github.com/alexforencich/verilog-ethernet), and [corundum](https://github.com/corundum/corundum) for complete testbenches using these modules.
|
||||||
|
|
||||||
### GMII
|
### GMII
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2021 Alex Forencich
|
Copyright (c) 2021-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -140,7 +140,7 @@ class EthMacTx(Reset):
|
|||||||
|
|
||||||
self.log.info("Ethernet MAC TX model")
|
self.log.info("Ethernet MAC TX model")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2021-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -179,7 +179,7 @@ class EthMacTx(Reset):
|
|||||||
self.log.info(" tuser width: %d bits", len(self.bus.tuser))
|
self.log.info(" tuser width: %d bits", len(self.bus.tuser))
|
||||||
else:
|
else:
|
||||||
self.log.info(" tuser: not present")
|
self.log.info(" tuser: not present")
|
||||||
if self.ptp_time:
|
if self.ptp_time is not None:
|
||||||
self.log.info(" ptp_time width: %d bits", len(self.ptp_time))
|
self.log.info(" ptp_time width: %d bits", len(self.ptp_time))
|
||||||
else:
|
else:
|
||||||
self.log.info(" ptp_time: not present")
|
self.log.info(" ptp_time: not present")
|
||||||
@@ -194,11 +194,11 @@ class EthMacTx(Reset):
|
|||||||
raise ValueError(f"Bus does not evenly divide into byte lanes "
|
raise ValueError(f"Bus does not evenly divide into byte lanes "
|
||||||
f"({self.byte_lanes} * {self.byte_size} != {self.width})")
|
f"({self.byte_lanes} * {self.byte_size} != {self.width})")
|
||||||
|
|
||||||
if self.ptp_ts:
|
if self.ptp_ts is not None:
|
||||||
self.ptp_ts.setimmediatevalue(0)
|
self.ptp_ts.setimmediatevalue(0)
|
||||||
if self.ptp_ts_tag:
|
if self.ptp_ts_tag is not None:
|
||||||
self.ptp_ts_tag.setimmediatevalue(0)
|
self.ptp_ts_tag.setimmediatevalue(0)
|
||||||
if self.ptp_ts_valid:
|
if self.ptp_ts_valid is not None:
|
||||||
self.ptp_ts_valid.setimmediatevalue(0)
|
self.ptp_ts_valid.setimmediatevalue(0)
|
||||||
|
|
||||||
self._run_cr = None
|
self._run_cr = None
|
||||||
@@ -255,7 +255,7 @@ class EthMacTx(Reset):
|
|||||||
self._run_ts_cr.kill()
|
self._run_ts_cr.kill()
|
||||||
self._run_ts_cr = None
|
self._run_ts_cr = None
|
||||||
|
|
||||||
if self.ptp_ts_valid:
|
if self.ptp_ts_valid is not None:
|
||||||
self.ptp_ts_valid.value = 0
|
self.ptp_ts_valid.value = 0
|
||||||
|
|
||||||
self.active = False
|
self.active = False
|
||||||
@@ -266,7 +266,7 @@ class EthMacTx(Reset):
|
|||||||
self.log.info("Reset de-asserted")
|
self.log.info("Reset de-asserted")
|
||||||
if self._run_cr is None:
|
if self._run_cr is None:
|
||||||
self._run_cr = cocotb.start_soon(self._run())
|
self._run_cr = cocotb.start_soon(self._run())
|
||||||
if self._run_ts_cr is None and self.ptp_ts:
|
if self._run_ts_cr is None and self.ptp_ts is not None:
|
||||||
self._run_ts_cr = cocotb.start_soon(self._run_ts())
|
self._run_ts_cr = cocotb.start_soon(self._run_ts())
|
||||||
|
|
||||||
async def _run(self):
|
async def _run(self):
|
||||||
@@ -287,9 +287,9 @@ class EthMacTx(Reset):
|
|||||||
|
|
||||||
frame.sim_time_sfd = get_sim_time()
|
frame.sim_time_sfd = get_sim_time()
|
||||||
|
|
||||||
if self.ptp_time:
|
if self.ptp_time is not None:
|
||||||
frame.ptp_timestamp = self.ptp_time.value.integer
|
frame.ptp_timestamp = int(self.ptp_time.value)
|
||||||
frame.ptp_tag = cycle.tuser.integer >> 1
|
frame.ptp_tag = int(cycle.tuser) >> 1
|
||||||
self.ts_queue.put_nowait((frame.ptp_timestamp, frame.ptp_tag))
|
self.ts_queue.put_nowait((frame.ptp_timestamp, frame.ptp_tag))
|
||||||
|
|
||||||
# process frame data
|
# process frame data
|
||||||
@@ -297,14 +297,14 @@ class EthMacTx(Reset):
|
|||||||
byte_count = 0
|
byte_count = 0
|
||||||
|
|
||||||
for offset in range(self.byte_lanes):
|
for offset in range(self.byte_lanes):
|
||||||
if not hasattr(self.bus, "tkeep") or (cycle.tkeep.integer >> offset) & 1:
|
if not hasattr(self.bus, "tkeep") or (int(cycle.tkeep) >> offset) & 1:
|
||||||
data.append((cycle.tdata.integer >> (offset * self.byte_size)) & self.byte_mask)
|
data.append((int(cycle.tdata) >> (offset * self.byte_size)) & self.byte_mask)
|
||||||
byte_count += 1
|
byte_count += 1
|
||||||
|
|
||||||
# wait for serialization time
|
# wait for serialization time
|
||||||
await Timer(self.time_scale*byte_count*8//self.speed, 'step')
|
await Timer(self.time_scale*byte_count*8//self.speed, 'step')
|
||||||
|
|
||||||
if cycle.tlast.integer:
|
if int(cycle.tlast):
|
||||||
frame.data = bytes(data)
|
frame.data = bytes(data)
|
||||||
frame.sim_time_end = get_sim_time()
|
frame.sim_time_end = get_sim_time()
|
||||||
self.log.info("RX frame: %s", frame)
|
self.log.info("RX frame: %s", frame)
|
||||||
@@ -359,7 +359,7 @@ class EthMacRx(Reset):
|
|||||||
|
|
||||||
self.log.info("Ethernet MAC RX model")
|
self.log.info("Ethernet MAC RX model")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2021-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -402,7 +402,7 @@ class EthMacRx(Reset):
|
|||||||
self.log.info(" tuser width: %d bits", len(self.bus.tuser))
|
self.log.info(" tuser width: %d bits", len(self.bus.tuser))
|
||||||
else:
|
else:
|
||||||
self.log.info(" tuser: not present")
|
self.log.info(" tuser: not present")
|
||||||
if self.ptp_time:
|
if self.ptp_time is not None:
|
||||||
self.log.info(" ptp_time width: %d bits", len(self.ptp_time))
|
self.log.info(" ptp_time width: %d bits", len(self.ptp_time))
|
||||||
else:
|
else:
|
||||||
self.log.info(" ptp_time: not present")
|
self.log.info(" ptp_time: not present")
|
||||||
@@ -513,8 +513,8 @@ class EthMacRx(Reset):
|
|||||||
|
|
||||||
frame.sim_time_sfd = get_sim_time()
|
frame.sim_time_sfd = get_sim_time()
|
||||||
|
|
||||||
if self.ptp_time:
|
if self.ptp_time is not None:
|
||||||
frame.ptp_timestamp = self.ptp_time.value.integer
|
frame.ptp_timestamp = int(self.ptp_time.value)
|
||||||
tuser |= frame.ptp_timestamp << 1
|
tuser |= frame.ptp_timestamp << 1
|
||||||
|
|
||||||
# process frame data
|
# process frame data
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -146,7 +146,7 @@ class GmiiSource(Reset):
|
|||||||
|
|
||||||
self.log.info("GMII source")
|
self.log.info("GMII source")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2020-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -278,7 +278,7 @@ class GmiiSource(Reset):
|
|||||||
while True:
|
while True:
|
||||||
await clock_edge_event
|
await clock_edge_event
|
||||||
|
|
||||||
if self.enable is None or self.enable.value:
|
if self.enable is None or int(self.enable.value):
|
||||||
if ifg_cnt > 0:
|
if ifg_cnt > 0:
|
||||||
# in IFG
|
# in IFG
|
||||||
ifg_cnt -= 1
|
ifg_cnt -= 1
|
||||||
@@ -297,7 +297,7 @@ class GmiiSource(Reset):
|
|||||||
frame.normalize()
|
frame.normalize()
|
||||||
|
|
||||||
if self.mii_select is not None:
|
if self.mii_select is not None:
|
||||||
self.mii_mode = bool(self.mii_select.value.integer)
|
self.mii_mode = bool(int(self.mii_select.value))
|
||||||
|
|
||||||
if self.mii_mode:
|
if self.mii_mode:
|
||||||
# convert to MII
|
# convert to MII
|
||||||
@@ -361,7 +361,7 @@ class GmiiSink(Reset):
|
|||||||
|
|
||||||
self.log.info("GMII sink")
|
self.log.info("GMII sink")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2020-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -457,10 +457,10 @@ class GmiiSink(Reset):
|
|||||||
while True:
|
while True:
|
||||||
await clock_edge_event
|
await clock_edge_event
|
||||||
|
|
||||||
if self.enable is None or self.enable.value:
|
if self.enable is None or int(self.enable.value):
|
||||||
d_val = self.data.value.integer
|
d_val = int(self.data.value)
|
||||||
dv_val = self.dv.value.integer
|
dv_val = int(self.dv.value)
|
||||||
er_val = 0 if self.er is None else self.er.value.integer
|
er_val = 0 if self.er is None else int(self.er.value)
|
||||||
|
|
||||||
if frame is None:
|
if frame is None:
|
||||||
if dv_val:
|
if dv_val:
|
||||||
@@ -472,7 +472,7 @@ class GmiiSink(Reset):
|
|||||||
# end of frame
|
# end of frame
|
||||||
|
|
||||||
if self.mii_select is not None:
|
if self.mii_select is not None:
|
||||||
self.mii_mode = bool(self.mii_select.value.integer)
|
self.mii_mode = bool(int(self.mii_select.value))
|
||||||
|
|
||||||
if self.mii_mode:
|
if self.mii_mode:
|
||||||
odd = True
|
odd = True
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -48,7 +48,7 @@ class MiiSource(Reset):
|
|||||||
|
|
||||||
self.log.info("MII source")
|
self.log.info("MII source")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2020-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -179,7 +179,7 @@ class MiiSource(Reset):
|
|||||||
while True:
|
while True:
|
||||||
await clock_edge_event
|
await clock_edge_event
|
||||||
|
|
||||||
if self.enable is None or self.enable.value:
|
if self.enable is None or int(self.enable.value):
|
||||||
if ifg_cnt > 0:
|
if ifg_cnt > 0:
|
||||||
# in IFG
|
# in IFG
|
||||||
ifg_cnt -= 1
|
ifg_cnt -= 1
|
||||||
@@ -254,7 +254,7 @@ class MiiSink(Reset):
|
|||||||
|
|
||||||
self.log.info("MII sink")
|
self.log.info("MII sink")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2020-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -348,10 +348,10 @@ class MiiSink(Reset):
|
|||||||
while True:
|
while True:
|
||||||
await clock_edge_event
|
await clock_edge_event
|
||||||
|
|
||||||
if self.enable is None or self.enable.value:
|
if self.enable is None or int(self.enable.value):
|
||||||
d_val = self.data.value.integer
|
d_val = int(self.data.value)
|
||||||
dv_val = self.dv.value.integer
|
dv_val = int(self.dv.value)
|
||||||
er_val = 0 if self.er is None else self.er.value.integer
|
er_val = 0 if self.er is None else int(self.er.value)
|
||||||
|
|
||||||
if frame is None:
|
if frame is None:
|
||||||
if dv_val:
|
if dv_val:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -58,7 +58,7 @@ class PtpClock(Reset):
|
|||||||
|
|
||||||
self.log.info("PTP clock")
|
self.log.info("PTP clock")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2020-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -132,7 +132,6 @@ class PtpClock(Reset):
|
|||||||
|
|
||||||
def set_ts_tod_ns(self, t):
|
def set_ts_tod_ns(self, t):
|
||||||
ts_s, ts_ns = self.ctx.divmod(Decimal(t), Decimal(1000000000))
|
ts_s, ts_ns = self.ctx.divmod(Decimal(t), Decimal(1000000000))
|
||||||
ts_s = ts_s.scaleb(-9).to_integral_value()
|
|
||||||
ts_ns, ts_fns = self.ctx.divmod(ts_ns, Decimal(1))
|
ts_ns, ts_fns = self.ctx.divmod(ts_ns, Decimal(1))
|
||||||
ts_ns = ts_ns.to_integral_value()
|
ts_ns = ts_ns.to_integral_value()
|
||||||
ts_fns = (ts_fns * Decimal(2**32)).to_integral_value()
|
ts_fns = (ts_fns * Decimal(2**32)).to_integral_value()
|
||||||
@@ -286,7 +285,7 @@ class PtpClockSimTime:
|
|||||||
|
|
||||||
self.log.info("PTP clock (sim time)")
|
self.log.info("PTP clock (sim time)")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2020-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -23,7 +23,7 @@ THE SOFTWARE.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import cocotb
|
import cocotb
|
||||||
from cocotb.triggers import RisingEdge, FallingEdge
|
from cocotb.triggers import Edge
|
||||||
|
|
||||||
|
|
||||||
class Reset:
|
class Reset:
|
||||||
@@ -56,11 +56,14 @@ class Reset:
|
|||||||
|
|
||||||
async def _run_reset(self, reset_signal, active_level):
|
async def _run_reset(self, reset_signal, active_level):
|
||||||
while True:
|
while True:
|
||||||
if bool(reset_signal.value):
|
await Edge(reset_signal)
|
||||||
await FallingEdge(reset_signal)
|
try:
|
||||||
self._ext_reset = not active_level
|
level = bool(int(reset_signal.value))
|
||||||
self._update_reset()
|
except ValueError:
|
||||||
else:
|
continue
|
||||||
await RisingEdge(reset_signal)
|
if level:
|
||||||
self._ext_reset = active_level
|
self._ext_reset = active_level
|
||||||
self._update_reset()
|
self._update_reset()
|
||||||
|
else:
|
||||||
|
self._ext_reset = not active_level
|
||||||
|
self._update_reset()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -50,7 +50,7 @@ class RgmiiSource(Reset):
|
|||||||
|
|
||||||
self.log.info("RGMII source")
|
self.log.info("RGMII source")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2020-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -192,7 +192,7 @@ class RgmiiSource(Reset):
|
|||||||
self.data.value = d >> 4
|
self.data.value = d >> 4
|
||||||
self.ctrl.value = en ^ er
|
self.ctrl.value = en ^ er
|
||||||
|
|
||||||
if self.enable is None or self.enable.value:
|
if self.enable is None or int(self.enable.value):
|
||||||
in_ifg = False
|
in_ifg = False
|
||||||
|
|
||||||
if ifg_cnt > 0:
|
if ifg_cnt > 0:
|
||||||
@@ -214,7 +214,7 @@ class RgmiiSource(Reset):
|
|||||||
frame.normalize()
|
frame.normalize()
|
||||||
|
|
||||||
if self.mii_select is not None:
|
if self.mii_select is not None:
|
||||||
self.mii_mode = bool(self.mii_select.value.integer)
|
self.mii_mode = bool(int(self.mii_select.value))
|
||||||
|
|
||||||
if self.mii_mode:
|
if self.mii_mode:
|
||||||
# convert to MII
|
# convert to MII
|
||||||
@@ -278,7 +278,7 @@ class RgmiiSink(Reset):
|
|||||||
|
|
||||||
self.log.info("RGMII sink")
|
self.log.info("RGMII sink")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2020-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -375,17 +375,17 @@ class RgmiiSink(Reset):
|
|||||||
while True:
|
while True:
|
||||||
await clock_rising_edge_event
|
await clock_rising_edge_event
|
||||||
|
|
||||||
if self.enable is None or self.enable.value:
|
if self.enable is None or int(self.enable.value):
|
||||||
|
|
||||||
# capture low nibble on rising edge
|
# capture low nibble on rising edge
|
||||||
d_val = self.data.value.integer
|
d_val = int(self.data.value)
|
||||||
dv_val = self.ctrl.value.integer
|
dv_val = int(self.ctrl.value)
|
||||||
|
|
||||||
await clock_falling_edge_event
|
await clock_falling_edge_event
|
||||||
|
|
||||||
# capture high nibble on falling edge
|
# capture high nibble on falling edge
|
||||||
d_val |= self.data.value.integer << 4
|
d_val |= int(self.data.value) << 4
|
||||||
er_val = dv_val ^ self.ctrl.value.integer
|
er_val = dv_val ^ int(self.ctrl.value)
|
||||||
|
|
||||||
if frame is None:
|
if frame is None:
|
||||||
if dv_val:
|
if dv_val:
|
||||||
@@ -397,7 +397,7 @@ class RgmiiSink(Reset):
|
|||||||
# end of frame
|
# end of frame
|
||||||
|
|
||||||
if self.mii_select is not None:
|
if self.mii_select is not None:
|
||||||
self.mii_mode = bool(self.mii_select.value.integer)
|
self.mii_mode = bool(int(self.mii_select.value))
|
||||||
|
|
||||||
if self.mii_mode:
|
if self.mii_mode:
|
||||||
odd = True
|
odd = True
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
__version__ = "0.1.22"
|
__version__ = "0.1.23"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -147,7 +147,7 @@ class XgmiiSource(Reset):
|
|||||||
|
|
||||||
self.log.info("XGMII source")
|
self.log.info("XGMII source")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2020-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -286,7 +286,7 @@ class XgmiiSource(Reset):
|
|||||||
while True:
|
while True:
|
||||||
await clock_edge_event
|
await clock_edge_event
|
||||||
|
|
||||||
if self.enable is None or self.enable.value:
|
if self.enable is None or int(self.enable.value):
|
||||||
if ifg_cnt + deficit_idle_cnt > self.byte_lanes-1 or (not self.enable_dic and ifg_cnt > 4):
|
if ifg_cnt + deficit_idle_cnt > self.byte_lanes-1 or (not self.enable_dic and ifg_cnt > 4):
|
||||||
# in IFG
|
# in IFG
|
||||||
ifg_cnt = ifg_cnt - self.byte_lanes
|
ifg_cnt = ifg_cnt - self.byte_lanes
|
||||||
@@ -390,7 +390,7 @@ class XgmiiSink(Reset):
|
|||||||
|
|
||||||
self.log.info("XGMII sink")
|
self.log.info("XGMII sink")
|
||||||
self.log.info("cocotbext-eth version %s", __version__)
|
self.log.info("cocotbext-eth version %s", __version__)
|
||||||
self.log.info("Copyright (c) 2020 Alex Forencich")
|
self.log.info("Copyright (c) 2020-2025 Alex Forencich")
|
||||||
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
self.log.info("https://github.com/alexforencich/cocotbext-eth")
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -488,9 +488,9 @@ class XgmiiSink(Reset):
|
|||||||
while True:
|
while True:
|
||||||
await clock_edge_event
|
await clock_edge_event
|
||||||
|
|
||||||
if self.enable is None or self.enable.value:
|
if self.enable is None or int(self.enable.value):
|
||||||
data_val = self.data.value.integer
|
data_val = int(self.data.value)
|
||||||
ctrl_val = self.ctrl.value.integer
|
ctrl_val = int(self.ctrl.value)
|
||||||
for offset in range(self.byte_lanes):
|
for offset in range(self.byte_lanes):
|
||||||
d_val = (data_val >> (offset*8)) & 0xff
|
d_val = (data_val >> (offset*8)) & 0xff
|
||||||
c_val = (ctrl_val >> offset) & 1
|
c_val = (ctrl_val >> offset) & 1
|
||||||
|
|||||||
15
setup.cfg
15
setup.cfg
@@ -47,18 +47,19 @@ addopts =
|
|||||||
|
|
||||||
# tox configuration
|
# tox configuration
|
||||||
[tox:tox]
|
[tox:tox]
|
||||||
envlist = py37, py38, py39, py310
|
envlist = py38, py39, py310, py311, py312, py313
|
||||||
skip_missing_interpreters = true
|
skip_missing_interpreters = true
|
||||||
minversion = 3.18.0
|
minversion = 3.18.0
|
||||||
requires = virtualenv >= 16.1
|
requires = virtualenv >= 16.1
|
||||||
|
|
||||||
[gh-actions]
|
[gh-actions]
|
||||||
python =
|
python =
|
||||||
3.7: py37
|
|
||||||
3.8: py38
|
3.8: py38
|
||||||
3.9: py39
|
3.9: py39
|
||||||
3.10: py310
|
3.10: py310
|
||||||
3.11: py311
|
3.11: py311
|
||||||
|
3.12: py312
|
||||||
|
3.13: py313
|
||||||
|
|
||||||
[testenv]
|
[testenv]
|
||||||
setenv =
|
setenv =
|
||||||
@@ -66,12 +67,12 @@ setenv =
|
|||||||
usedevelop = True
|
usedevelop = True
|
||||||
|
|
||||||
deps =
|
deps =
|
||||||
pytest == 7.2.1
|
pytest == 8.3.4
|
||||||
pytest-xdist == 3.1.0
|
pytest-xdist == 3.6.1
|
||||||
cocotb == 1.7.2
|
cocotb == 1.9.2
|
||||||
cocotb-bus == 0.2.1
|
cocotb-bus == 0.2.1
|
||||||
cocotb-test == 0.2.4
|
cocotb-test == 0.2.6
|
||||||
cocotbext-axi == 0.1.20
|
cocotbext-axi == 0.1.26
|
||||||
coverage == 7.0.5
|
coverage == 7.0.5
|
||||||
pytest-cov == 4.0.0
|
pytest-cov == 4.0.0
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2021 Alex Forencich
|
# Copyright (c) 2021-2025 Alex Forencich
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -27,8 +27,10 @@ COCOTB_HDL_TIMEUNIT = 1ns
|
|||||||
COCOTB_HDL_TIMEPRECISION = 1ns
|
COCOTB_HDL_TIMEPRECISION = 1ns
|
||||||
|
|
||||||
DUT = test_eth_mac
|
DUT = test_eth_mac
|
||||||
TOPLEVEL = $(DUT)
|
COCOTB_TEST_MODULES = $(DUT)
|
||||||
MODULE = $(DUT)
|
COCOTB_TOPLEVEL = $(DUT)
|
||||||
|
MODULE = $(COCOTB_TEST_MODULES)
|
||||||
|
TOPLEVEL = $(COCOTB_TOPLEVEL)
|
||||||
VERILOG_SOURCES += $(DUT).v
|
VERILOG_SOURCES += $(DUT).v
|
||||||
|
|
||||||
# module parameters
|
# module parameters
|
||||||
@@ -42,32 +44,14 @@ export PARAM_AXIS_RX_USER_WIDTH := $(shell expr $(PARAM_PTP_TS_WIDTH) + 1 )
|
|||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
|
||||||
VERILOG_SOURCES += iverilog_dump.v
|
|
||||||
COMPILE_ARGS += -s iverilog_dump
|
|
||||||
endif
|
|
||||||
else ifeq ($(SIM), verilator)
|
else ifeq ($(SIM), verilator)
|
||||||
COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH
|
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
ifeq ($(WAVES), 1)
|
||||||
COMPILE_ARGS += --trace-fst
|
COMPILE_ARGS += --trace-fst
|
||||||
|
VERILATOR_TRACE = 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(shell cocotb-config --makefiles)/Makefile.sim
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
||||||
|
|
||||||
iverilog_dump.v:
|
|
||||||
echo 'module iverilog_dump();' > $@
|
|
||||||
echo 'initial begin' >> $@
|
|
||||||
echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@
|
|
||||||
echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@
|
|
||||||
echo 'end' >> $@
|
|
||||||
echo 'endmodule' >> $@
|
|
||||||
|
|
||||||
clean::
|
|
||||||
@rm -rf iverilog_dump.v
|
|
||||||
@rm -rf dump.fst $(TOPLEVEL).fst
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2021 Alex Forencich
|
Copyright (c) 2021-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -168,7 +168,7 @@ def incrementing_payload(length):
|
|||||||
return bytearray(itertools.islice(itertools.cycle(range(256)), length))
|
return bytearray(itertools.islice(itertools.cycle(range(256)), length))
|
||||||
|
|
||||||
|
|
||||||
if cocotb.SIM_NAME:
|
if getattr(cocotb, 'top', None) is not None:
|
||||||
|
|
||||||
if len(cocotb.top.tx_axis_tdata) == 8:
|
if len(cocotb.top.tx_axis_tdata) == 8:
|
||||||
speed = [100e6, 1e9]
|
speed = [100e6, 1e9]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright (c) 2021 Alex Forencich
|
Copyright (c) 2021-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2020 Alex Forencich
|
# Copyright (c) 2020-2025 Alex Forencich
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -27,39 +27,23 @@ COCOTB_HDL_TIMEUNIT = 1ns
|
|||||||
COCOTB_HDL_TIMEPRECISION = 1ns
|
COCOTB_HDL_TIMEPRECISION = 1ns
|
||||||
|
|
||||||
DUT = test_gmii
|
DUT = test_gmii
|
||||||
TOPLEVEL = $(DUT)
|
COCOTB_TEST_MODULES = $(DUT)
|
||||||
MODULE = $(DUT)
|
COCOTB_TOPLEVEL = $(DUT)
|
||||||
|
MODULE = $(COCOTB_TEST_MODULES)
|
||||||
|
TOPLEVEL = $(COCOTB_TOPLEVEL)
|
||||||
VERILOG_SOURCES += $(DUT).v
|
VERILOG_SOURCES += $(DUT).v
|
||||||
|
|
||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
|
||||||
VERILOG_SOURCES += iverilog_dump.v
|
|
||||||
COMPILE_ARGS += -s iverilog_dump
|
|
||||||
endif
|
|
||||||
else ifeq ($(SIM), verilator)
|
else ifeq ($(SIM), verilator)
|
||||||
COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH
|
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
ifeq ($(WAVES), 1)
|
||||||
COMPILE_ARGS += --trace-fst
|
COMPILE_ARGS += --trace-fst
|
||||||
|
VERILATOR_TRACE = 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(shell cocotb-config --makefiles)/Makefile.sim
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
||||||
|
|
||||||
iverilog_dump.v:
|
|
||||||
echo 'module iverilog_dump();' > $@
|
|
||||||
echo 'initial begin' >> $@
|
|
||||||
echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@
|
|
||||||
echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@
|
|
||||||
echo 'end' >> $@
|
|
||||||
echo 'endmodule' >> $@
|
|
||||||
|
|
||||||
clean::
|
|
||||||
@rm -rf iverilog_dump.v
|
|
||||||
@rm -rf dump.fst $(TOPLEVEL).fst
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -132,7 +132,7 @@ def cycle_en():
|
|||||||
return itertools.cycle([0, 0, 0, 1])
|
return itertools.cycle([0, 0, 0, 1])
|
||||||
|
|
||||||
|
|
||||||
if cocotb.SIM_NAME:
|
if getattr(cocotb, 'top', None) is not None:
|
||||||
|
|
||||||
factory = TestFactory(run_test)
|
factory = TestFactory(run_test)
|
||||||
factory.add_option("payload_lengths", [size_list])
|
factory.add_option("payload_lengths", [size_list])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2020 Alex Forencich
|
# Copyright (c) 2020-2025 Alex Forencich
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -27,39 +27,23 @@ COCOTB_HDL_TIMEUNIT = 1ns
|
|||||||
COCOTB_HDL_TIMEPRECISION = 1ns
|
COCOTB_HDL_TIMEPRECISION = 1ns
|
||||||
|
|
||||||
DUT = test_gmii_phy
|
DUT = test_gmii_phy
|
||||||
TOPLEVEL = $(DUT)
|
COCOTB_TEST_MODULES = $(DUT)
|
||||||
MODULE = $(DUT)
|
COCOTB_TOPLEVEL = $(DUT)
|
||||||
|
MODULE = $(COCOTB_TEST_MODULES)
|
||||||
|
TOPLEVEL = $(COCOTB_TOPLEVEL)
|
||||||
VERILOG_SOURCES += $(DUT).v
|
VERILOG_SOURCES += $(DUT).v
|
||||||
|
|
||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
|
||||||
VERILOG_SOURCES += iverilog_dump.v
|
|
||||||
COMPILE_ARGS += -s iverilog_dump
|
|
||||||
endif
|
|
||||||
else ifeq ($(SIM), verilator)
|
else ifeq ($(SIM), verilator)
|
||||||
COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH
|
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
ifeq ($(WAVES), 1)
|
||||||
COMPILE_ARGS += --trace-fst
|
COMPILE_ARGS += --trace-fst
|
||||||
|
VERILATOR_TRACE = 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(shell cocotb-config --makefiles)/Makefile.sim
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
||||||
|
|
||||||
iverilog_dump.v:
|
|
||||||
echo 'module iverilog_dump();' > $@
|
|
||||||
echo 'initial begin' >> $@
|
|
||||||
echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@
|
|
||||||
echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@
|
|
||||||
echo 'end' >> $@
|
|
||||||
echo 'endmodule' >> $@
|
|
||||||
|
|
||||||
clean::
|
|
||||||
@rm -rf iverilog_dump.v
|
|
||||||
@rm -rf dump.fst $(TOPLEVEL).fst
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -140,7 +140,7 @@ def cycle_en():
|
|||||||
return itertools.cycle([0, 0, 0, 1])
|
return itertools.cycle([0, 0, 0, 1])
|
||||||
|
|
||||||
|
|
||||||
if cocotb.SIM_NAME:
|
if getattr(cocotb, 'top', None) is not None:
|
||||||
|
|
||||||
for test in [run_test_tx, run_test_rx]:
|
for test in [run_test_tx, run_test_rx]:
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2020 Alex Forencich
|
# Copyright (c) 2020-2025 Alex Forencich
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -27,39 +27,23 @@ COCOTB_HDL_TIMEUNIT = 1ns
|
|||||||
COCOTB_HDL_TIMEPRECISION = 1ns
|
COCOTB_HDL_TIMEPRECISION = 1ns
|
||||||
|
|
||||||
DUT = test_mii
|
DUT = test_mii
|
||||||
TOPLEVEL = $(DUT)
|
COCOTB_TEST_MODULES = $(DUT)
|
||||||
MODULE = $(DUT)
|
COCOTB_TOPLEVEL = $(DUT)
|
||||||
|
MODULE = $(COCOTB_TEST_MODULES)
|
||||||
|
TOPLEVEL = $(COCOTB_TOPLEVEL)
|
||||||
VERILOG_SOURCES += $(DUT).v
|
VERILOG_SOURCES += $(DUT).v
|
||||||
|
|
||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
|
||||||
VERILOG_SOURCES += iverilog_dump.v
|
|
||||||
COMPILE_ARGS += -s iverilog_dump
|
|
||||||
endif
|
|
||||||
else ifeq ($(SIM), verilator)
|
else ifeq ($(SIM), verilator)
|
||||||
COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH
|
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
ifeq ($(WAVES), 1)
|
||||||
COMPILE_ARGS += --trace-fst
|
COMPILE_ARGS += --trace-fst
|
||||||
|
VERILATOR_TRACE = 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(shell cocotb-config --makefiles)/Makefile.sim
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
||||||
|
|
||||||
iverilog_dump.v:
|
|
||||||
echo 'module iverilog_dump();' > $@
|
|
||||||
echo 'initial begin' >> $@
|
|
||||||
echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@
|
|
||||||
echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@
|
|
||||||
echo 'end' >> $@
|
|
||||||
echo 'endmodule' >> $@
|
|
||||||
|
|
||||||
clean::
|
|
||||||
@rm -rf iverilog_dump.v
|
|
||||||
@rm -rf dump.fst $(TOPLEVEL).fst
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -130,7 +130,7 @@ def cycle_en():
|
|||||||
return itertools.cycle([0, 0, 0, 1])
|
return itertools.cycle([0, 0, 0, 1])
|
||||||
|
|
||||||
|
|
||||||
if cocotb.SIM_NAME:
|
if getattr(cocotb, 'top', None) is not None:
|
||||||
|
|
||||||
factory = TestFactory(run_test)
|
factory = TestFactory(run_test)
|
||||||
factory.add_option("payload_lengths", [size_list])
|
factory.add_option("payload_lengths", [size_list])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2020 Alex Forencich
|
# Copyright (c) 2020 Alex-2025 Forencich
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -27,39 +27,23 @@ COCOTB_HDL_TIMEUNIT = 1ns
|
|||||||
COCOTB_HDL_TIMEPRECISION = 1ns
|
COCOTB_HDL_TIMEPRECISION = 1ns
|
||||||
|
|
||||||
DUT = test_mii_phy
|
DUT = test_mii_phy
|
||||||
TOPLEVEL = $(DUT)
|
COCOTB_TEST_MODULES = $(DUT)
|
||||||
MODULE = $(DUT)
|
COCOTB_TOPLEVEL = $(DUT)
|
||||||
|
MODULE = $(COCOTB_TEST_MODULES)
|
||||||
|
TOPLEVEL = $(COCOTB_TOPLEVEL)
|
||||||
VERILOG_SOURCES += $(DUT).v
|
VERILOG_SOURCES += $(DUT).v
|
||||||
|
|
||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
|
||||||
VERILOG_SOURCES += iverilog_dump.v
|
|
||||||
COMPILE_ARGS += -s iverilog_dump
|
|
||||||
endif
|
|
||||||
else ifeq ($(SIM), verilator)
|
else ifeq ($(SIM), verilator)
|
||||||
COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH
|
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
ifeq ($(WAVES), 1)
|
||||||
COMPILE_ARGS += --trace-fst
|
COMPILE_ARGS += --trace-fst
|
||||||
|
VERILATOR_TRACE = 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(shell cocotb-config --makefiles)/Makefile.sim
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
||||||
|
|
||||||
iverilog_dump.v:
|
|
||||||
echo 'module iverilog_dump();' > $@
|
|
||||||
echo 'initial begin' >> $@
|
|
||||||
echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@
|
|
||||||
echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@
|
|
||||||
echo 'end' >> $@
|
|
||||||
echo 'endmodule' >> $@
|
|
||||||
|
|
||||||
clean::
|
|
||||||
@rm -rf iverilog_dump.v
|
|
||||||
@rm -rf dump.fst $(TOPLEVEL).fst
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -131,7 +131,7 @@ def cycle_en():
|
|||||||
return itertools.cycle([0, 0, 0, 1])
|
return itertools.cycle([0, 0, 0, 1])
|
||||||
|
|
||||||
|
|
||||||
if cocotb.SIM_NAME:
|
if getattr(cocotb, 'top', None) is not None:
|
||||||
|
|
||||||
for test in [run_test_tx, run_test_rx]:
|
for test in [run_test_tx, run_test_rx]:
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2020 Alex Forencich
|
# Copyright (c) 2020-2025 Alex Forencich
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -27,39 +27,23 @@ COCOTB_HDL_TIMEUNIT = 1ns
|
|||||||
COCOTB_HDL_TIMEPRECISION = 1ps
|
COCOTB_HDL_TIMEPRECISION = 1ps
|
||||||
|
|
||||||
DUT = test_ptp_clock
|
DUT = test_ptp_clock
|
||||||
TOPLEVEL = $(DUT)
|
COCOTB_TEST_MODULES = $(DUT)
|
||||||
MODULE = $(DUT)
|
COCOTB_TOPLEVEL = $(DUT)
|
||||||
|
MODULE = $(COCOTB_TEST_MODULES)
|
||||||
|
TOPLEVEL = $(COCOTB_TOPLEVEL)
|
||||||
VERILOG_SOURCES += $(DUT).v
|
VERILOG_SOURCES += $(DUT).v
|
||||||
|
|
||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
|
||||||
VERILOG_SOURCES += iverilog_dump.v
|
|
||||||
COMPILE_ARGS += -s iverilog_dump
|
|
||||||
endif
|
|
||||||
else ifeq ($(SIM), verilator)
|
else ifeq ($(SIM), verilator)
|
||||||
COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH
|
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
ifeq ($(WAVES), 1)
|
||||||
COMPILE_ARGS += --trace-fst
|
COMPILE_ARGS += --trace-fst
|
||||||
|
VERILATOR_TRACE = 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(shell cocotb-config --makefiles)/Makefile.sim
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
||||||
|
|
||||||
iverilog_dump.v:
|
|
||||||
echo 'module iverilog_dump();' > $@
|
|
||||||
echo 'initial begin' >> $@
|
|
||||||
echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@
|
|
||||||
echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@
|
|
||||||
echo 'end' >> $@
|
|
||||||
echo 'endmodule' >> $@
|
|
||||||
|
|
||||||
clean::
|
|
||||||
@rm -rf iverilog_dump.v
|
|
||||||
@rm -rf dump.fst $(TOPLEVEL).fst
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -68,11 +68,11 @@ class TB:
|
|||||||
await RisingEdge(self.dut.clk)
|
await RisingEdge(self.dut.clk)
|
||||||
|
|
||||||
def get_ts_tod_ns(self):
|
def get_ts_tod_ns(self):
|
||||||
ts = self.dut.ts_tod.value.integer
|
ts = int(self.dut.ts_tod.value)
|
||||||
return Decimal(ts >> 48).scaleb(9) + (Decimal(ts & 0xffffffffffff) / Decimal(2**16))
|
return Decimal(ts >> 48).scaleb(9) + (Decimal(ts & 0xffffffffffff) / Decimal(2**16))
|
||||||
|
|
||||||
def get_ts_rel_ns(self):
|
def get_ts_rel_ns(self):
|
||||||
ts = self.dut.ts_rel.value.integer
|
ts = int(self.dut.ts_rel.value)
|
||||||
return Decimal(ts) / Decimal(2**16)
|
return Decimal(ts) / Decimal(2**16)
|
||||||
|
|
||||||
|
|
||||||
@@ -127,9 +127,9 @@ async def run_load_timestamps(dut):
|
|||||||
|
|
||||||
await RisingEdge(dut.clk)
|
await RisingEdge(dut.clk)
|
||||||
|
|
||||||
assert dut.ts_tod.value.integer == (12345678 << 16) + (tb.ptp_clock.period_ns << 16) + (tb.ptp_clock.period_fns >> 16)
|
assert int(dut.ts_tod.value) == (12345678 << 16) + (tb.ptp_clock.period_ns << 16) + (tb.ptp_clock.period_fns >> 16)
|
||||||
assert dut.ts_rel.value.integer == (12345678 << 16) + (tb.ptp_clock.period_ns << 16) + (tb.ptp_clock.period_fns >> 16)
|
assert int(dut.ts_rel.value) == (12345678 << 16) + (tb.ptp_clock.period_ns << 16) + (tb.ptp_clock.period_fns >> 16)
|
||||||
assert dut.ts_step.value.integer == 1
|
assert int(dut.ts_step.value) == 1
|
||||||
|
|
||||||
start_time = Decimal(get_sim_time('fs')).scaleb(-6)
|
start_time = Decimal(get_sim_time('fs')).scaleb(-6)
|
||||||
start_ts_tod = tb.get_ts_tod_ns()
|
start_ts_tod = tb.get_ts_tod_ns()
|
||||||
@@ -184,10 +184,10 @@ async def run_seconds_increment(dut):
|
|||||||
for k in range(3000):
|
for k in range(3000):
|
||||||
await RisingEdge(dut.clk)
|
await RisingEdge(dut.clk)
|
||||||
|
|
||||||
if dut.pps.value.integer:
|
if int(dut.pps.value):
|
||||||
saw_pps = True
|
saw_pps = True
|
||||||
assert dut.ts_tod.value.integer >> 48 == 1
|
assert int(dut.ts_tod.value) >> 48 == 1
|
||||||
assert dut.ts_tod.value.integer & 0xffffffffffff < 10*2**16
|
assert int(dut.ts_tod.value) & 0xffffffffffff < 10*2**16
|
||||||
|
|
||||||
assert saw_pps
|
assert saw_pps
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2020 Alex Forencich
|
# Copyright (c) 2020-2025 Alex Forencich
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -27,39 +27,23 @@ COCOTB_HDL_TIMEUNIT = 1ns
|
|||||||
COCOTB_HDL_TIMEPRECISION = 1ps
|
COCOTB_HDL_TIMEPRECISION = 1ps
|
||||||
|
|
||||||
DUT = test_ptp_clock_sim_time
|
DUT = test_ptp_clock_sim_time
|
||||||
TOPLEVEL = $(DUT)
|
COCOTB_TEST_MODULES = $(DUT)
|
||||||
MODULE = $(DUT)
|
COCOTB_TOPLEVEL = $(DUT)
|
||||||
|
MODULE = $(COCOTB_TEST_MODULES)
|
||||||
|
TOPLEVEL = $(COCOTB_TOPLEVEL)
|
||||||
VERILOG_SOURCES += $(DUT).v
|
VERILOG_SOURCES += $(DUT).v
|
||||||
|
|
||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
|
||||||
VERILOG_SOURCES += iverilog_dump.v
|
|
||||||
COMPILE_ARGS += -s iverilog_dump
|
|
||||||
endif
|
|
||||||
else ifeq ($(SIM), verilator)
|
else ifeq ($(SIM), verilator)
|
||||||
COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH
|
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
ifeq ($(WAVES), 1)
|
||||||
COMPILE_ARGS += --trace-fst
|
COMPILE_ARGS += --trace-fst
|
||||||
|
VERILATOR_TRACE = 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(shell cocotb-config --makefiles)/Makefile.sim
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
||||||
|
|
||||||
iverilog_dump.v:
|
|
||||||
echo 'module iverilog_dump();' > $@
|
|
||||||
echo 'initial begin' >> $@
|
|
||||||
echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@
|
|
||||||
echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@
|
|
||||||
echo 'end' >> $@
|
|
||||||
echo 'endmodule' >> $@
|
|
||||||
|
|
||||||
clean::
|
|
||||||
@rm -rf iverilog_dump.v
|
|
||||||
@rm -rf dump.fst $(TOPLEVEL).fst
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2021 Alex Forencich
|
Copyright (c) 2021-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -54,11 +54,11 @@ class TB:
|
|||||||
)
|
)
|
||||||
|
|
||||||
def get_ts_tod_ns(self):
|
def get_ts_tod_ns(self):
|
||||||
ts = self.dut.ts_tod.value.integer
|
ts = int(self.dut.ts_tod.value)
|
||||||
return Decimal(ts >> 48).scaleb(9) + (Decimal(ts & 0xffffffffffff) / Decimal(2**16))
|
return Decimal(ts >> 48).scaleb(9) + (Decimal(ts & 0xffffffffffff) / Decimal(2**16))
|
||||||
|
|
||||||
def get_ts_rel_ns(self):
|
def get_ts_rel_ns(self):
|
||||||
ts = self.dut.ts_rel.value.integer
|
ts = int(self.dut.ts_rel.value)
|
||||||
return Decimal(ts) / Decimal(2**16)
|
return Decimal(ts) / Decimal(2**16)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright (c) 2021 Alex Forencich
|
Copyright (c) 2021-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2020 Alex Forencich
|
# Copyright (c) 2020-2025 Alex Forencich
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -27,39 +27,23 @@ COCOTB_HDL_TIMEUNIT = 1ns
|
|||||||
COCOTB_HDL_TIMEPRECISION = 1ns
|
COCOTB_HDL_TIMEPRECISION = 1ns
|
||||||
|
|
||||||
DUT = test_rgmii
|
DUT = test_rgmii
|
||||||
TOPLEVEL = $(DUT)
|
COCOTB_TEST_MODULES = $(DUT)
|
||||||
MODULE = $(DUT)
|
COCOTB_TOPLEVEL = $(DUT)
|
||||||
|
MODULE = $(COCOTB_TEST_MODULES)
|
||||||
|
TOPLEVEL = $(COCOTB_TOPLEVEL)
|
||||||
VERILOG_SOURCES += $(DUT).v
|
VERILOG_SOURCES += $(DUT).v
|
||||||
|
|
||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
|
||||||
VERILOG_SOURCES += iverilog_dump.v
|
|
||||||
COMPILE_ARGS += -s iverilog_dump
|
|
||||||
endif
|
|
||||||
else ifeq ($(SIM), verilator)
|
else ifeq ($(SIM), verilator)
|
||||||
COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH
|
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
ifeq ($(WAVES), 1)
|
||||||
COMPILE_ARGS += --trace-fst
|
COMPILE_ARGS += --trace-fst
|
||||||
|
VERILATOR_TRACE = 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(shell cocotb-config --makefiles)/Makefile.sim
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
||||||
|
|
||||||
iverilog_dump.v:
|
|
||||||
echo 'module iverilog_dump();' > $@
|
|
||||||
echo 'initial begin' >> $@
|
|
||||||
echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@
|
|
||||||
echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@
|
|
||||||
echo 'end' >> $@
|
|
||||||
echo 'endmodule' >> $@
|
|
||||||
|
|
||||||
clean::
|
|
||||||
@rm -rf iverilog_dump.v
|
|
||||||
@rm -rf dump.fst $(TOPLEVEL).fst
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -130,7 +130,7 @@ def cycle_en():
|
|||||||
return itertools.cycle([0, 0, 0, 1])
|
return itertools.cycle([0, 0, 0, 1])
|
||||||
|
|
||||||
|
|
||||||
if cocotb.SIM_NAME:
|
if getattr(cocotb, 'top', None) is not None:
|
||||||
|
|
||||||
factory = TestFactory(run_test)
|
factory = TestFactory(run_test)
|
||||||
factory.add_option("payload_lengths", [size_list])
|
factory.add_option("payload_lengths", [size_list])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2020 Alex Forencich
|
# Copyright (c) 2020-2025 Alex Forencich
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -27,39 +27,23 @@ COCOTB_HDL_TIMEUNIT = 1ns
|
|||||||
COCOTB_HDL_TIMEPRECISION = 1ns
|
COCOTB_HDL_TIMEPRECISION = 1ns
|
||||||
|
|
||||||
DUT = test_rgmii_phy
|
DUT = test_rgmii_phy
|
||||||
TOPLEVEL = $(DUT)
|
COCOTB_TEST_MODULES = $(DUT)
|
||||||
MODULE = $(DUT)
|
COCOTB_TOPLEVEL = $(DUT)
|
||||||
|
MODULE = $(COCOTB_TEST_MODULES)
|
||||||
|
TOPLEVEL = $(COCOTB_TOPLEVEL)
|
||||||
VERILOG_SOURCES += $(DUT).v
|
VERILOG_SOURCES += $(DUT).v
|
||||||
|
|
||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
|
||||||
VERILOG_SOURCES += iverilog_dump.v
|
|
||||||
COMPILE_ARGS += -s iverilog_dump
|
|
||||||
endif
|
|
||||||
else ifeq ($(SIM), verilator)
|
else ifeq ($(SIM), verilator)
|
||||||
COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH
|
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
ifeq ($(WAVES), 1)
|
||||||
COMPILE_ARGS += --trace-fst
|
COMPILE_ARGS += --trace-fst
|
||||||
|
VERILATOR_TRACE = 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(shell cocotb-config --makefiles)/Makefile.sim
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
||||||
|
|
||||||
iverilog_dump.v:
|
|
||||||
echo 'module iverilog_dump();' > $@
|
|
||||||
echo 'initial begin' >> $@
|
|
||||||
echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@
|
|
||||||
echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@
|
|
||||||
echo 'end' >> $@
|
|
||||||
echo 'endmodule' >> $@
|
|
||||||
|
|
||||||
clean::
|
|
||||||
@rm -rf iverilog_dump.v
|
|
||||||
@rm -rf dump.fst $(TOPLEVEL).fst
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -144,7 +144,7 @@ def cycle_en():
|
|||||||
return itertools.cycle([0, 0, 0, 1])
|
return itertools.cycle([0, 0, 0, 1])
|
||||||
|
|
||||||
|
|
||||||
if cocotb.SIM_NAME:
|
if getattr(cocotb, 'top', None) is not None:
|
||||||
|
|
||||||
for test in [run_test_tx, run_test_rx]:
|
for test in [run_test_tx, run_test_rx]:
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2020 Alex Forencich
|
# Copyright (c) 2020-2025 Alex Forencich
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -27,8 +27,10 @@ COCOTB_HDL_TIMEUNIT = 1ns
|
|||||||
COCOTB_HDL_TIMEPRECISION = 1ns
|
COCOTB_HDL_TIMEPRECISION = 1ns
|
||||||
|
|
||||||
DUT = test_xgmii
|
DUT = test_xgmii
|
||||||
TOPLEVEL = $(DUT)
|
COCOTB_TEST_MODULES = $(DUT)
|
||||||
MODULE = $(DUT)
|
COCOTB_TOPLEVEL = $(DUT)
|
||||||
|
MODULE = $(COCOTB_TEST_MODULES)
|
||||||
|
TOPLEVEL = $(COCOTB_TOPLEVEL)
|
||||||
VERILOG_SOURCES += $(DUT).v
|
VERILOG_SOURCES += $(DUT).v
|
||||||
|
|
||||||
# module parameters
|
# module parameters
|
||||||
@@ -38,32 +40,14 @@ export PARAM_CTRL_WIDTH := $(shell expr $(PARAM_DATA_WIDTH) / 8 )
|
|||||||
ifeq ($(SIM), icarus)
|
ifeq ($(SIM), icarus)
|
||||||
PLUSARGS += -fst
|
PLUSARGS += -fst
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-P $(COCOTB_TOPLEVEL).$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
|
||||||
VERILOG_SOURCES += iverilog_dump.v
|
|
||||||
COMPILE_ARGS += -s iverilog_dump
|
|
||||||
endif
|
|
||||||
else ifeq ($(SIM), verilator)
|
else ifeq ($(SIM), verilator)
|
||||||
COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH
|
|
||||||
|
|
||||||
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
COMPILE_ARGS += $(foreach v,$(filter PARAM_%,$(.VARIABLES)),-G$(subst PARAM_,,$(v))=$($(v)))
|
||||||
|
|
||||||
ifeq ($(WAVES), 1)
|
ifeq ($(WAVES), 1)
|
||||||
COMPILE_ARGS += --trace-fst
|
COMPILE_ARGS += --trace-fst
|
||||||
|
VERILATOR_TRACE = 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(shell cocotb-config --makefiles)/Makefile.sim
|
include $(shell cocotb-config --makefiles)/Makefile.sim
|
||||||
|
|
||||||
iverilog_dump.v:
|
|
||||||
echo 'module iverilog_dump();' > $@
|
|
||||||
echo 'initial begin' >> $@
|
|
||||||
echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@
|
|
||||||
echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@
|
|
||||||
echo 'end' >> $@
|
|
||||||
echo 'endmodule' >> $@
|
|
||||||
|
|
||||||
clean::
|
|
||||||
@rm -rf iverilog_dump.v
|
|
||||||
@rm -rf dump.fst $(TOPLEVEL).fst
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -208,7 +208,7 @@ def cycle_en():
|
|||||||
return itertools.cycle([0, 0, 0, 1])
|
return itertools.cycle([0, 0, 0, 1])
|
||||||
|
|
||||||
|
|
||||||
if cocotb.SIM_NAME:
|
if getattr(cocotb, 'top', None) is not None:
|
||||||
|
|
||||||
factory = TestFactory(run_test)
|
factory = TestFactory(run_test)
|
||||||
factory.add_option("payload_lengths", [size_list])
|
factory.add_option("payload_lengths", [size_list])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright (c) 2020 Alex Forencich
|
Copyright (c) 2020-2025 Alex Forencich
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
Reference in New Issue
Block a user