Verilog 中的 always 块中的 (*) 符号表示什么

What does the (*) symbol indicate in an always block in Verilog

我不确定这样的块是什么意思:

总是@(*)

我在网上寻找解决方案,但似乎没有一个容易获得的明确答案。

我认为这表明只要有任何变化就应该执行 always 块,但我不确定,如果是这种情况,我不确定它对我是否有意义。

在 IEEE 1800-2017 LRM 的 9.4.2.2 隐式 event_expression 列表 部分中进行了解释。基本上它使块对它必须在块内计算的任何表达式敏感。

always 块中的敏感度列表告诉模拟器何时开始对该块进行评估。 always 块本身计算它包含的表达式。表达式本质上有操作数和结果。不包括中间结果,always 块有输入,由非中间操作数构成。

因此,敏感度列表描述了与块输入相关的事件。但总有可能它没有列出所有的输入。在这种情况下,块可能不会按预期运行。例如

always @(a)
  c = a & b;

在上面的例子中,always 块只有在 a 值发生变化时才会被评估。但是,如果 b 发生变化怎么办?在这种情况下,c 仍将包含先前评估的值,并且该块表现为锁存器。虽然综合不会生成锁存器,但您遇到了问题。

v2k 引入了 always @*(与 always @(*) 相同)。它需要一个模拟器来计算出 always 块的所有输入,并从所有输入中构建一个内部敏感度列表。因此,在以下示例中,如果 ab 中的任何一个发生更改,将评估 c 的值:

 always @*
    c = a & b;

在 system verilog 中 always_combalways_latch 的工作方式相同,但不需要使用 @*。下面的例子等同于前面的例子。

 always_comb
     c = a & b;