[libre-riscv-dev] Very Subtle Synchronous nMigen Behavior
    Yehowshua 
    yimmanuel3 at gatech.edu
       
    Thu Jun 18 02:01:25 BST 2020
    
    
  
Take a look through the following code and the comments.
I’ve tried to capture some subtle BUT important
synchronous behavior in the nMigen simulator.
It will be very helpful when writing memory test benches.
```python
from nmigen import *
class Simple(Elaboratable):
    def __init__(self):
        self.simple_in = Signal(range(4))
        self.simple_out = Signal(range(4))
    
    def elaborate(self,platform):
        m = Module()
        m.d.sync += self.simple_out.eq(self.simple_in)
        return m
m = Module()
simple = Simple()
m.submodules.simple = simple
from nmigen.back.pysim import Simulator, Delay, Settle
sim = Simulator(m)
sim.add_clock(1e-6)
def process():
    val = 2
    yield simple.simple_in.eq(val)
    yield
    # this will print simple_out = 0 which is the
    # reset value even though 
    # during this cycle, simple_out = 2
    # This is because as far as the simulator is concerned
    # we can't see changes until the edge right
    # before the next clock cycle
    print(f"simple_out = {(yield simple.simple_out)}")
    val = 3
    yield simple.simple_in.eq(val)
    yield
    yield Settle()
    # this will print out 3 as expected becuase
    # we use Settle() to advance right to the edge
    # before the next clock cycle
    print(f"simple_out = {(yield simple.simple_out)}")
sim_writer = sim.write_vcd(f"{__file__[:-3]}.vcd")
with sim_writer:
    sim.add_sync_process(process)
    sim.run()
```
    
    
More information about the libre-riscv-dev
mailing list