如果将 default case 添加到完整的 case 语句中会发生什么?
What happens if you add a default case to a full case statements?
如标题所述,如果将 default 语句添加到完整的 case 语句中会发生什么情况?这会导致 simulation/synthesis 出现任何问题吗?如果不是,将此默认语句添加到完整案例的目的是什么?
例如,
'''
enum logic [1:0] {Reset, A, B, C} state, nstate;
always_comb
begin
case(state)
Reset:
if(expr)
nstate = A;
else
nstate = Reset;
A:
if(expr)
nstate = B;
else
nstate = A;
B:
if(expr)
nstate = C;
else
nstate = B;
C:
nstate = A
default:
nstate = Reset;
'''
当 state
的当前值不存在于任何其他 case 语句中时,将触发默认语句。这可能在仿真期间发生,因为 state
的某些(或全部)位可能未确定或高阻抗。
如果没有提供默认语句,在模拟期间nstate
将成为一个锁存器,如果state
的当前值没有被case块覆盖,则保持其先前的值。在综合中,一个完整的 case 将表现相同,无论是否有 default 语句,尽管提供一个 default case,特别是在 clocked always 块中,可能有助于综合器决定是否应使用时钟启用功能。
因此,如果没有提供默认语句,仿真和综合行为可能会不匹配,因为仿真覆盖了案例变量的逻辑级别多于综合。
如@mcleod_ideafix 所示,verilog 模拟存在一些差异。它可以执行 default 子句的唯一方法是对 case 语句本身使用未定义的输入。因此,default
子句仅表示 undefined
行为。因此,最好将 x
作为状态机的下一个状态,表示未知。在这种情况下,您的状态机应该能够恢复。
default: nstate = 'x;
另请注意,case
在存在 'x' 或 'z' 的情况下会以一种奇怪的方式运行,并且可能会在模拟时给出错误的答案。您可能想查看它的其他兄弟:casez
或 casex
。如果你的综合支持它,进入 case inside
.
顺便说一句,综合可能无法弄清楚你那里有一个完整的案例。您可能想提供一个提示。在 system verilog 世界中,您应该使用 unique case
而不是 default
。在模拟中,如果您点击 'default',它将生成一个断言,而对于综合,它将是一个 full/parallel 案例提示。
如标题所述,如果将 default 语句添加到完整的 case 语句中会发生什么情况?这会导致 simulation/synthesis 出现任何问题吗?如果不是,将此默认语句添加到完整案例的目的是什么?
例如,
'''
enum logic [1:0] {Reset, A, B, C} state, nstate;
always_comb
begin
case(state)
Reset:
if(expr)
nstate = A;
else
nstate = Reset;
A:
if(expr)
nstate = B;
else
nstate = A;
B:
if(expr)
nstate = C;
else
nstate = B;
C:
nstate = A
default:
nstate = Reset;
'''
当 state
的当前值不存在于任何其他 case 语句中时,将触发默认语句。这可能在仿真期间发生,因为 state
的某些(或全部)位可能未确定或高阻抗。
如果没有提供默认语句,在模拟期间nstate
将成为一个锁存器,如果state
的当前值没有被case块覆盖,则保持其先前的值。在综合中,一个完整的 case 将表现相同,无论是否有 default 语句,尽管提供一个 default case,特别是在 clocked always 块中,可能有助于综合器决定是否应使用时钟启用功能。
因此,如果没有提供默认语句,仿真和综合行为可能会不匹配,因为仿真覆盖了案例变量的逻辑级别多于综合。
如@mcleod_ideafix 所示,verilog 模拟存在一些差异。它可以执行 default 子句的唯一方法是对 case 语句本身使用未定义的输入。因此,default
子句仅表示 undefined
行为。因此,最好将 x
作为状态机的下一个状态,表示未知。在这种情况下,您的状态机应该能够恢复。
default: nstate = 'x;
另请注意,case
在存在 'x' 或 'z' 的情况下会以一种奇怪的方式运行,并且可能会在模拟时给出错误的答案。您可能想查看它的其他兄弟:casez
或 casex
。如果你的综合支持它,进入 case inside
.
顺便说一句,综合可能无法弄清楚你那里有一个完整的案例。您可能想提供一个提示。在 system verilog 世界中,您应该使用 unique case
而不是 default
。在模拟中,如果您点击 'default',它将生成一个断言,而对于综合,它将是一个 full/parallel 案例提示。