【问题标题】:Verilog always block with no sensitivity listVerilog 总是在没有敏感列表的情况下阻塞
【发布时间】:2018-11-18 14:54:04
【问题描述】:

没有敏感度列表的always 块是否会推断出组合逻辑,就像always_combalways @(*) 一样?例如代码:

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

【问题讨论】:

  • 你的例子中没有no组合逻辑,无法综合。

标签: verilog system-verilog hdl


【解决方案1】:

合成工具需要特定的模板编码风格来合成您的代码。大多数只允许单个显式事件控制作为always 块的开头。一些允许多个事件控制的高级综合工具只允许同一时钟沿的多次出现。

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

【讨论】:

  • 谢谢 Dave ...但是没有敏感度列表的 always begin <some code> end 怎么会知道要触发哪些事件,或者这会推断出类似于 always @(*)always_comb 的组合逻辑吗?
  • 对于组合逻辑,您必须提供敏感度列表。您可以使用always 显式执行此操作,或者使用always @* 或always_comb 隐式执行此操作`
【解决方案2】:

我在 Quartus 中尝试过,这两个在综合后确实得到了相同的实现。

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

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

我不知道对此的支持有多普遍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    相关资源
    最近更新 更多