Verilog 来自多个if语句的信号分配

Verilog 来自多个if语句的信号分配,verilog,system-verilog,Verilog,System Verilog,出于学术兴趣,以下代码是否可接受: 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 逻辑a、b、c; 指出; 始终_ff@(posedge clk)开始 out当您在begin/end块中有代码时,语句保证以串行顺序执行。使用非阻塞赋值,当语句顺序是可预测的时,结果

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

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
逻辑a、b、c;
指出;
始终_ff@(posedge clk)开始

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

有人可能会问,为什么会有人编写这样的代码?原因是,有时if-else结构可能会变得非常复杂,只需为定义的信号定义一个“默认”值就好了。此外,如果语句必须考虑所有的可能性,只要将一个信号驱动到一定的值,IF语句的大小和复杂性就会增加。这很容易为bug和其他令人惊讶的特性打开大门。正如dave_59所说,模拟中的行为是有保证的。合成器的工作就是创建一个与模拟完全相同的电路。因此,绝对没有“合成中未知结果的风险”,因为如果有,您的合成器将无法满足创建与模拟完全相同的电路的要求。再次感谢dave!这也是我在IEEE论文中的理解,但我也需要有其他的观点。
  if (c) out <= 3;
  out <= 1;
  if (b) out <= 3;
  if (a) out <= 2;