amaranth icon indicating copy to clipboard operation
amaranth copied to clipboard

Local clock domain can collide with global domain, causing assert failure

Open korken89 opened this issue 5 years ago • 0 comments

Hi, after a short discussion with @whitequark I was asked to make an issue of this behavior. What I have is a module which as a local clock domain, and if I make another global clock domain which has a colliding name I get an assert error.

This can quite easily happen when making a module, in which one has a local clock that might have a common enough name.

The generated assert error:

Traceback (most recent call last):
  File "/home/emifre/Git/alink-hdl/clock_error.py", line 31, in <module>
    sim = Simulator(m)
  File "/usr/lib/python3.8/site-packages/nmigen/back/pysim.py", line 916, in __init__
    self._fragment = Fragment.get(fragment, platform=None).prepare()
  File "/usr/lib/python3.8/site-packages/nmigen/hdl/ir.py", line 530, in prepare
    new_domains = fragment._propagate_domains(missing_domain)
  File "/usr/lib/python3.8/site-packages/nmigen/hdl/ir.py", line 378, in _propagate_domains
    self._propagate_domains_down()
  File "/usr/lib/python3.8/site-packages/nmigen/hdl/ir.py", line 340, in _propagate_domains_down
    assert self.domains[domain] is subfrag.domains[domain]

Minimal example:

from typing import List, Tuple

from nmigen import Module, Signal, Elaboratable, ClockDomain, ClockSignal
from nmigen.build import Platform
from nmigen.back.pysim import Simulator


class ClockSpiTest(Elaboratable):
    def elaborate(self, platform: Platform) -> Module:
        m = Module()

        m.domains += ClockDomain("spi_slave", local=True)

        return m


if __name__ == "__main__":
    # This causes colision with clock in ClockSpiTest,
    # even though it is set as `local=True`
    spi = ClockDomain(name="spi_slave")

    sync = ClockDomain(name="sync")

    m = Module()
    m.domains.sync = sync
    m.domains.spi_slave = spi

    m.submodules.test = test = ClockSpiTest()

    # Set up some simulation
    sim = Simulator(m)

Thanks for an awesome framework and keep up the amazing work!

korken89 avatar Nov 07 '20 20:11 korken89