Verilog总是在没有敏感度列表的情况下阻塞

Verilog总是在没有敏感度列表的情况下阻塞,verilog,system-verilog,hdl,Verilog,System Verilog,Hdl,没有灵敏度列表的始终块是否会推断出组合逻辑,就像始终_comb或始终(*)一样?Eg代码: always 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)&&a

没有灵敏度列表的
始终
块是否会推断出组合逻辑,就像
始终_comb
始终(*)一样?Eg代码:

always 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

合成工具需要特定的模板编码样式来合成代码。大多数只允许在
始终
块的开头使用单个显式事件控件。某些允许多个事件控件的高级合成工具只允许同一时钟边缘多次出现


模拟工具没有这些限制,将尝试执行您可以编译的任何合法语法。顺便说一句,您的
@((sig_c==1)和&(sig_a==0))
表示等待表达式更改值,而不是等待它变为真。
wait(expr)
构造意味着等待表达式变为真。

我在Quartus中尝试过它,这两种构造在合成后都会导致相同的实现

always x = counter[0] + counter[1];

assign y = counter[0] + counter[1];

我不知道这种支持有多普遍。

您的示例中没有组合逻辑,而且它不可合成。谢谢Dave。。。但是,如果没有敏感度列表,一个
总是开始结束
如何知道在什么时候触发事件,或者这只是推断一个类似
总是(*)
总是\u comb
的组合逻辑?对于组合逻辑,您必须提供一个敏感度列表。您可以显式地使用
始终
或隐式地使用
始终@*
或始终`