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

Output port missing in generated Verilog code from 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:

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 忽略它们?我怎样才能让它包含它们?

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

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

根据 Alper 的评论,您没有将 Count 分配给任何东西。这需要修复。

此外,您没有在计数器定义中初始化计数器。这可能在综合中起作用,因为逻辑将初始化为零或某个其他确定值,但在模拟中,该值可能 (probably/will) 保持未知。如果可以,请获取重置信号。

leds = intbv(0)[8:0]改为leds = Signal(intbv(0)[8:0])。 模块(输出)端口需要声明为 Signal.