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 块的所有输入,并从所有输入中构建一个内部敏感度列表。因此,在以下示例中,如果 a
或 b
中的任何一个发生更改,将评估 c
的值:
always @*
c = a & b;
在 system verilog 中 always_comb
和 always_latch
的工作方式相同,但不需要使用 @*
。下面的例子等同于前面的例子。
always_comb
c = a & b;
我不确定这样的块是什么意思:
总是@(*)
我在网上寻找解决方案,但似乎没有一个容易获得的明确答案。
我认为这表明只要有任何变化就应该执行 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 块的所有输入,并从所有输入中构建一个内部敏感度列表。因此,在以下示例中,如果 a
或 b
中的任何一个发生更改,将评估 c
的值:
always @*
c = a & b;
在 system verilog 中 always_comb
和 always_latch
的工作方式相同,但不需要使用 @*
。下面的例子等同于前面的例子。
always_comb
c = a & b;