MyHDL生成的Verilog代码中缺少输出端口

MyHDL生成的Verilog代码中缺少输出端口,verilog,myhdl,Verilog,Myhdl,我正在尝试从以下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

我正在尝试从以下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行)

顶五:

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
模块顶部(
克莱金
);
输入clkIn;
注册[7:0]计数器;
始终@(posedge clkIn)开始:顶部计数器逻辑

计数器在您的模块顶部设计中,您没有将LED声明为输出。在clkIn上定义,它是一个输入。大多数合成器将检查逻辑是否驱动输出或其他可见或保留的逻辑。如果合成器确定您无法判断外部设计中是否存在LED,它可能会优化它以及驱动它的任何专用逻辑

如果这是Altera,有一个称为虚拟管脚的qsf分配,可以分配给LED,以保持它。但简单的做法是将LED添加到模块顶部引脚定义中,并将其指定为输出

根据阿尔珀的评论,你没有给任何东西分配计数。这需要修正

此外,在计数器定义中不初始化计数器。这可能在合成中起作用,因为逻辑要么初始化为零,要么其他确定值,但在模拟中,该值可能(可能/将)保持未知。如果可以,获取重置信号。

led=intbv(0)[8:0]
更改为
led=signal(intbv(0)[8:0])

模块(输出)端口需要声明为
Signal

我没有使用MyHDL,但在我看来
leds=intbv(0)[8:0]
正在将0分配给您的LED信号。@AlperKucukkomurler:确实分配了0。据我所知,这仅用于在模拟过程中确定初始值。这个值在模拟电路时会增加。如果我没有完全误解你的答案,我想你误解了我的问题。我正在使用MyHDL生成Verilog文件top.v。这是通过输入文件top.py和counter.py完成的。是的,需要在模块定义中将其指定为输出;我的问题是:如何让MyHDL从Python输入文件中实现这一点?是的,我知道我需要添加一个重置信号。实际上我已经有了,但是我缩小了代码范围,提供了一个最小的示例。