当在Verilog或VHDL中的灵敏度列表中声明更多信号(变量)时,会发生什么

时间:2017-06-13 09:48:05

标签: vhdl verilog fpga

我使用VHDL和Verilog已经有一段时间了,在研究一些材料时,我提出了这个问题。不幸的是,我没有任何具体的例子或问题。

3 个答案:

答案 0 :(得分:1)

首先,您只能在灵敏度列表中指定信号而不能指定变量。

综合:
通常没有区别,因为合成不依赖于敏感性列表。

用于模拟:
如果指定的信号很少,则可能看不到预期的行为。如果指定了很多信号,则可能会看到与合成行为不匹配的行为。

此外,通过指定比所需更多的信号,由于必须检查更多可能的事件,模拟循环将变慢。

答案 1 :(得分:0)

我们总是使用带时钟的块和灵敏度列表中的复位来描述时序电路。并且总是使用灵敏度列表中的每个驱动信号来阻塞来描述组合电路。

有时灵敏度列表仅对模拟很重要,但如果您忘记了灵敏度列表中的信号,则可能会得到错误的模拟。如果你的逻辑是正确的,那么实际FPGA功能将正常工作。

但它可能会导致一些问题。

例如,如果在具有灵敏度的总块中描述类似a=b&c的函数(b);但你忘了c。然后,在您的模拟中ac更改时不会更改。但实际FPGA中的电路,将正确描述函数a=b&c。当您综合代码时,您可能会收到警告。

您可以将其称为“预卡片和后卡片不一致”。

真正令人害怕的是你的前卡片是正确的,但你的后卡片是错误的。这可能会导致FPGA推断出错误的逻辑。

答案 2 :(得分:0)

对于顺序逻辑,如果灵敏度列表中的冗余信号不适合作为复位或时钟信号,则设计编译器会产生错误。允许多个复位信号,但不允许多个时钟。

让我们认为这是我们打算设计的。

always_ff @(posedge clk, posedge rst)
    if (rst)
        a <= 1'b0;
    else if (en)
        a <= b:

如果我们将enabc添加到敏感度列表,则会生成以下错误消息。

  

此处'if'语句的重置条件中的表达式   'always'块只能是一个简单的标识符或它的否定。   (ELAB-303)

这是导致错误的代码(en是未经邀请的信号)。

always_ff @(posedge clk, posedge rst, posedge en)
    if (rst)
        a <= 1'b0;
    else if (en)
        a <= b;

en信号不适合重置,因为它不会将a设置为常量值。

在下面的代码中,冗余信号为c。它不在always块内使用,因此不能重置。然后它成为时钟的候选者,但我们也有clk信号。这里产生了同样的错误信息。

always_ff @(posedge clk, posedge rst, posedge c)
    if (rst)
        a <= 1'b0;
    else if (en)
        a <= b;

下面的代码段是可综合的。由于ca信号设置为常量值,因此它可以是重置信号以及rst信号。 DC将合成它,但复位路径上的组合逻辑可能导致时序违规。

always_ff @(posedge clk, posedge rst, posedge c)
    if (rst)
        a <= 1'b0;
    else if (c)
        a <= 1'b1;
    else if (en)
        a <= b;

我的最后一个示例在灵敏度列表中有一个冗余信号,没有任何触发条件(pos / negedge)。 DC在这里产生不同的错误。

always_ff @(posedge clk, posedge rst, c)
    if (rst)
        a <= 1'b0;
    else if (c)
        a <= 1'b1;
    else if (en)
        a <= b;
  

事件取决于edge和nonedge表达式   合成不支持。 (ELAB-91)

所有这些案例都可以扩展,但结果不能保证与其他综合工具相同。