case 变量应该自动递增吗?

Should case variable be increment atomically?

我正在编写 Verilog 代码,该代码循环访问 FSM 的状态,以便分步执行计算。该应用程序已完成并按需要 运行ning,但出于效率要求,我想知道以下内容。

我正在更新 case 变量,"i",如下面的摘录 1 所示,这是原子的,这是否有必要确保它不会跳过我的 FSM 中的一个步骤?

或者摘录 2 中的方法是否与 运行 一样安全,不会漏掉任何一步?

摘录二的速度是摘录一的两倍。

在被问到之前。一切 运行s,一切都在使用前初始化,计数器在完成并封装在模块中时重置为 0。


"i"

的原子更新代码
always @(posedge clk) begin
  if( ITERATE ) i = i + 1; //Atomic increment of variable
  else begin
    case( i )
      0: ....
      .: .... 
      n: The case internals are not pertinent
    endcase
  end
  ITERATE = !ITERATE; //Trigger for atomic update of i
end

"i"

的非原子更新代码
always @(posedge clk) begin
  case( i )
    0: ....
    .: .... 
    n: The case internals are not pertinent
  endcase
  i = i + 1; //Non-atomic increment of variable
end

在这两种情况下,您的 always 块仅在每个 clk 上升沿执行一次。他们将不会在同一个增量周期中被重新评估(除非你的clk本身有故障)。

与其他编程语言一样,任何 always 块中的代码都是按顺序执行的。

因此,根据您的示例,第一个将在每个 时钟边沿递增 'i',而第二个将在每个时钟边沿递增。

I'm updating the case variable, "i", atomically as shown in excerpt 1 below, is this at all necessary to ensure it does not skip a step in my FSM?

我不确定你在这里的意思,但是 i 会在不跳过的情况下一个一个递增,你的 fsm 中的 case 语句将有机会对 'i' 的每个值做出反应在这两种情况下。由于您在第一个示例中使用 ITERATE,因此时间会有所不同。此外,在第一个示例中,i 将在 before case 语句中递增,而在第二个示例中,after。这是另一个区别。

顺便说一句,atomic 一词不适用于任何情况。你是什​​么意思?

另请注意,您没有根据一般建议、拆分状态和转换逻辑编写状态机,而且您很可能在示例中滥用了阻塞分配。这些可能是测试平台可接受的代码示例,但它们可能不适用于 RTL。