Issue by whitequark
Monday Sep 23, 2019 at 08:52 GMT
Originally opened as m-labs/nmigen#228
The oMigen simulator had a strange interface where user processes would run after a clock edge, but before synchronous signals assume their new value. Not only it is very hard to use and bug-prone (my simulation testing workflow, for example, involves adding yield until tests pass...), but it also makes certain patterns impossible! For example, let's consider the FIFOInterface.write() simulation function:
def write(self, data):
"""Write method for simulation."""
assert (yield self.w_rdy)
yield self.w_data.eq(data)
yield self.w_en.eq(1)
yield
yield self.w_en.eq(0)
yield
It has to take two clock cycles. This is because, after the first yield, it is not yet possible to read the new value of self.w_rdy; running (yield self.w_rdy) would return the value from the previous cycle. To make sure it's updated, it is necessary to deassert self.w_en, and waste another cycle doing nothing.
Because of this, I've removed these methods from nMigen FIFOInterface in a57b76f.
I think we should look at prior art for cosimulation (cocotb?) and adopt a usage pattern that is easier to use. This is complicated by the fact that it is desirable to run oMigen testbenches unmodified.
Monday Sep 23, 2019 at 08:52 GMT
Originally opened as m-labs/nmigen#228
The oMigen simulator had a strange interface where user processes would run after a clock edge, but before synchronous signals assume their new value. Not only it is very hard to use and bug-prone (my simulation testing workflow, for example, involves adding
yielduntil tests pass...), but it also makes certain patterns impossible! For example, let's consider theFIFOInterface.write()simulation function:It has to take two clock cycles. This is because, after the first
yield, it is not yet possible to read the new value ofself.w_rdy; running(yield self.w_rdy)would return the value from the previous cycle. To make sure it's updated, it is necessary to deassertself.w_en, and waste another cycle doing nothing.Because of this, I've removed these methods from nMigen FIFOInterface in a57b76f.
I think we should look at prior art for cosimulation (cocotb?) and adopt a usage pattern that is easier to use. This is complicated by the fact that it is desirable to run oMigen testbenches unmodified.