我使用VHDL和Verilog已经有一段时间了,在研究一些材料时,我提出了这个问题。不幸的是,我没有任何具体的例子或问题。
答案 0 :(得分:1)
首先,您只能在灵敏度列表中指定信号而不能指定变量。
综合:
通常没有区别,因为合成不依赖于敏感性列表。
用于模拟:
如果指定的信号很少,则可能看不到预期的行为。如果指定了很多信号,则可能会看到与合成行为不匹配的行为。
此外,通过指定比所需更多的信号,由于必须检查更多可能的事件,模拟循环将变慢。
答案 1 :(得分:0)
我们总是使用带时钟的块和灵敏度列表中的复位来描述时序电路。并且总是使用灵敏度列表中的每个驱动信号来阻塞来描述组合电路。
有时灵敏度列表仅对模拟很重要,但如果您忘记了灵敏度列表中的信号,则可能会得到错误的模拟。如果你的逻辑是正确的,那么实际FPGA功能将正常工作。
但它可能会导致一些问题。
例如,如果在具有灵敏度的总块中描述类似a=b&c
的函数(b);但你忘了c
。然后,在您的模拟中a
在c
更改时不会更改。但实际FPGA中的电路,将正确描述函数a=b&c
。当您综合代码时,您可能会收到警告。
您可以将其称为“预卡片和后卡片不一致”。
真正令人害怕的是你的前卡片是正确的,但你的后卡片是错误的。这可能会导致FPGA推断出错误的逻辑。
答案 2 :(得分:0)
对于顺序逻辑,如果灵敏度列表中的冗余信号不适合作为复位或时钟信号,则设计编译器会产生错误。允许多个复位信号,但不允许多个时钟。
让我们认为这是我们打算设计的。
always_ff @(posedge clk, posedge rst)
if (rst)
a <= 1'b0;
else if (en)
a <= b:
如果我们将en
,a
,b
或c
添加到敏感度列表,则会生成以下错误消息。
此处'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;
下面的代码段是可综合的。由于c
将a
信号设置为常量值,因此它可以是重置信号以及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)
所有这些案例都可以扩展,但结果不能保证与其他综合工具相同。