If statement 始终为verilog中的变量指定默认值

If statement 始终为verilog中的变量指定默认值,if-statement,verilog,If Statement,Verilog,我有一个相当大的if-else块 always @(posedge clk) begin r <= 3; if( cond1 ) a <= 1; else if( cond2 ) begin a <= 2; r <= 3; end else a <= 3; end 始终@(posedge clk) 开始 r指定默认值是完全合法的。 在Verilog中,最后一次分配“获胜”。 -对于非阻塞分配,这意味着只执行最

我有一个相当大的if-else块

always @(posedge clk)
begin
  r <= 3;
  if( cond1 )
    a <= 1;
  else if( cond2 )
  begin
    a <= 2;
    r <= 3;
  end
  else
    a <= 3;
end
始终@(posedge clk)
开始

r指定默认值是完全合法的。
在Verilog中,最后一次分配“获胜”。
-对于非阻塞分配,这意味着只执行最后一个。
-对于阻塞分配,它们按遇到的顺序执行

事实上,在复杂状态机中,这是我更喜欢的方法。 您可以在组合(阻塞)和时钟/注册(非阻塞)代码中使用它

然而,最好的编码实践是标记它,以便读者 知道您正在设置默认值,并且这些值可以在代码中进一步重写。下面是UART发送器的一个片段:

  // Defaults for TX FSM
  nxt_tx_state    = tx_state;
  nxt_tx_bit_cnt  = tx_bit_cnt;
  nxt_tx_samp_cnt = tx_samp_cnt;
  nxt_shift_out   = shift_out;
当您有一个底部所有覆盖赋值时,同样适用:

....
....
// This overrides all the above
if (emergency_halt)
   state <= IDLE_STATE;
综合工具将其转化为:

   if (B==4)
      A = 5;
   else if (B==2)
      A = 3;
   else
      A = 1;

在这种情况下,两个“if”语句是互斥的,但即使不是互斥的,结果将是硬件表现为阻塞分配:最后一个语句获胜

Synthesis工具如何处理此默认值?或者不是我不需要看的东西
   if (B==4)
      A = 5;
   else if (B==2)
      A = 3;
   else
      A = 1;