Verilog 总是在没有敏感列表的情况下阻塞
Verilog always block with no sensitivity list
没有敏感列表的always
块是否会推断出组合逻辑,就像always_comb
或always @(*)
一样?例如代码:
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
综合工具需要特定的模板编码风格来综合您的代码。大多数只允许在 always
块的开头进行单个显式事件控制。一些允许多个事件控制的高级综合工具只允许同一时钟边沿多次出现。
模拟工具没有这些限制,会尝试执行您可以编译的任何合法语法。顺便说一句,您的 @((sig_c==1)&&(sig_a==0))
意味着等待表达式更改值,而不是等待它变为真。 wait(expr)
构造意味着等待表达式变为真。
我在 Quartus 中试过了,综合后两者的实现是一样的。
always x = counter[0] + counter[1];
assign y = counter[0] + counter[1];
我不知道对此的支持有多普遍。
没有敏感列表的always
块是否会推断出组合逻辑,就像always_comb
或always @(*)
一样?例如代码:
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
综合工具需要特定的模板编码风格来综合您的代码。大多数只允许在 always
块的开头进行单个显式事件控制。一些允许多个事件控制的高级综合工具只允许同一时钟边沿多次出现。
模拟工具没有这些限制,会尝试执行您可以编译的任何合法语法。顺便说一句,您的 @((sig_c==1)&&(sig_a==0))
意味着等待表达式更改值,而不是等待它变为真。 wait(expr)
构造意味着等待表达式变为真。
我在 Quartus 中试过了,综合后两者的实现是一样的。
always x = counter[0] + counter[1];
assign y = counter[0] + counter[1];
我不知道对此的支持有多普遍。