为什么 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
块中使用 ANY 事件控件。它会自动为您创建事件敏感性列表。也许它是将隐式事件控件与您添加的事件控件组合在一起,然后生成错误。
除非您使用的是高级综合工具,否则您只能在基本 always
块的开头使用一个事件控件。
下面的代码会生成此错误消息:
"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
块中使用 ANY 事件控件。它会自动为您创建事件敏感性列表。也许它是将隐式事件控件与您添加的事件控件组合在一起,然后生成错误。
除非您使用的是高级综合工具,否则您只能在基本 always
块的开头使用一个事件控件。