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。
我正在编写 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。