我正在尝试从以下MyHDL模块生成verilog模块:
top.py:
from myhdl import *
from counter import Counter
def Top(clkIn, leds):
counter = Counter(clkIn, leds)
return counter
clkIn = Signal(bool(0))
leds = intbv(0)[8:0]
toVerilog(Top, clkIn, leds)
和
counter.py:
from myhdl import *
def Counter(clk, count):
c = Signal(modbv(0)[8:0])
@always(clk.posedge)
def logic():
c.next = c + 1
@always_comb
def outputs():
count.next = c
return logic, outputs
但是,在生成的文件的模块定义中,(第1-3行)
top.v:
module top (
clkIn
);
input clkIn;
reg [7:0] counter_c;
always @(posedge clkIn) begin: TOP_COUNTER_LOGIC
counter_c <= (counter_c + 1);
end
assign count = counter_c;
endmodule
leds[7:0]
丢失了。即使这些LED未使用,我需要将它们用于我的合成器,以将它们分配到开发板上的适当引脚。为什么MyHDL会省略它们?我怎样才能把它包括在内?
答案 0 :(得分:3)
将leds = intbv(0)[8:0]
更改为leds = Signal(intbv(0)[8:0])
。
模块(输出)端口需要声明为Signal
。
答案 1 :(得分:0)
在模块顶层设计中,您没有将leds声明为输出。在定义clkIn时,它是一个输入。大多数合成器将检查逻辑是否正在驱动输出或其他一些可见的或保持逻辑。如果合成器确定没有可能的方法告诉您外部设计中存在LED,那么它可能只是将其优化,以及驱动它的任何专用逻辑。
如果这是Altera,则有一个名为虚拟引脚的qsf赋值可以分配给leds,以保留它。但是,最简单的方法是将LED添加到模块顶部引脚定义并将其指定为输出。
根据Alper的评论,您不会将Count分配给任何内容。这需要修复。
此外,您不在计数器定义中初始化计数器。这可能在合成中起作用,因为逻辑将初始化为零或某些其他确定值,但在模拟中,值可能(可能/将)保持未知。如果可以,请获取重置信号。