首页 > 解决方案 > 来自多个 if 语句的信号分配

问题描述

出于学术兴趣,以下代码是否可以接受:

logic a, b, c;
int out;
always_ff @(posedge clk) begin
  out <= 1;
  if (a) out <= 2;
  if (b) out <= 3;
  if (c) out <= 3;
end

内部总是阻塞的东西应该是顺序的,对吧?因此,在此示例中,默认情况下out将为 1 但abc可以按“优先”顺序覆盖该值。

或者合成中是否存在未知结果的风险?即分配的顺序将是随机的,如下所示:

  if (c) out <= 3;
  out <= 1;
  if (b) out <= 3;
  if (a) out <= 2;

在这种情况下,即使c为 1 ,输出也会为 1(或者如果ab为 1,则为其他内容)。

标签: verilogsystem-verilog

解决方案


当您在一个块内有代码时begin/end,这些语句保证以串行顺序执行。并且使用非阻塞赋值,当语句顺序可预测时,结果是可预测的。所以你得到了你期望的优先顺序。


推荐阅读