为什么 verilog "always_comb block contains only one event control" 错误总是在带有多个“@”的程序块上标记

Why verilog "always_comb block contains only one event control" error flagged on always procedural block with multiple "@"

下面的代码会生成此错误消息:

"verilog always_comb imposes the restriction that it contains one and only one event control and no blocking timing controls"

always_comb begin
if (sig_a)begin
 @(posedge sig_b); // wait for a sig_b posedge event
 @(negedge sig_b); // then wait for a sig_b negedge event
 event_true=1;  
end

if (event_true)begin
  @((sig_c==1)&&(sig_a==0)); //wait for sig_a to deassert and sig_c assert event to be true
  yes =1;
 end
 else yes =0;

end

为什么组合逻辑程序块会产生此错误?

并且具有 @ 事件等待的 always 块是否可以合成?

always_comb 仅用于组合逻辑 。您使用的 @ 语句与组合无关。

来自 lrm 9.2.2.2.2

Statements in an always_comb shall not include those that block, have blocking timing or event controls, or fork-join statements.

在您的情况下,您需要始终使用通用目的。 always @* 可能会。

该错误报告的消息具有误导性。不允许在 always_comb 块中使用 A​​NY 事件控件。它会自动为您创建事件敏感性列表。也许它是将隐式事件控件与您添加的事件控件组合在一起,然后生成错误。

除非您使用的是高级综合工具,否则您只能在基本 always 块的开头使用一个事件控件。