Open
Description
Issue by Fatsie
Wednesday Dec 25, 2019 at 12:31 GMT
Originally opened as m-labs/nmigen#285
I am making wrappers around existing RTL code using Instance
. These block have a clock input. This structure seems to not be compatible with EnableInserter
. This issue is to see if there is a way to make it compatibl or alternatively at least have a warning or error when using EnableInserter
.
Reduced example code is this:
#!/bin/env python3
from nmigen import (
Signal, Elaboratable, Module, EnableInserter, ClockSignal, Instance
)
from nmigen.build import Platform
from nmigen.back.verilog import convert
class dff(Elaboratable):
def __init__(self):
self.d = Signal()
self.q = Signal()
def elaborate(self, platform):
m = Module()
m.submodules.inst = Instance(
"DFF",
i_clk=ClockSignal(), i_d=self.d, o_q=self.q,
)
return m
class dffce(Elaboratable):
def __init__(self):
self.ce = Signal()
self._dff = _dff = dff()
self.d = _dff.d
self.q = _dff.q
def elaborate(self, platform):
m = Module()
m.submodules.dff = EnableInserter(self.ce)(self._dff)
return m
top = dffce()
top_code = convert(top, ports=[top.ce, top.d, top.q])
with open("top.v", "w") as f:
f.write(top_code)
Giving the output:
/* Generated by Yosys 0.9+932 (git sha1 ff8529a, gcc 4.8.5 -fPIC -Os) */
(* generator = "nMigen" *)
(* \nmigen.hierarchy = "top.dff" *)
module dff(d, q, clk);
(* src = "/home/verhaegs/anaconda2/envs/nmigen/lib/python3.7/site-packages/nmigen/hdl/ir.py:538" *)
input clk;
(* src = "./ceinserter.py:10" *)
input d;
(* src = "./ceinserter.py:11" *)
output q;
DFF inst (
.clk(clk),
.d(d),
.q(q)
);
endmodule
(* generator = "nMigen" *)
(* top = 1 *)
(* \nmigen.hierarchy = "top" *)
module top(d, q, clk, rst, ce);
(* src = "./ceinserter.py:25" *)
input ce;
(* src = "/home/verhaegs/anaconda2/envs/nmigen/lib/python3.7/site-packages/nmigen/hdl/ir.py:538" *)
input clk;
(* src = "./ceinserter.py:10" *)
input d;
(* src = "./ceinserter.py:11" *)
output q;
(* src = "/home/verhaegs/anaconda2/envs/nmigen/lib/python3.7/site-packages/nmigen/hdl/ir.py:538" *)
input rst;
dff dff (
.clk(clk),
.d(d),
.q(q)
);
The ce
signal is not used.