如果将 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' 的情况下会以一种奇怪的方式运行,并且可能会在模拟时给出错误的答案。您可能想查看它的其他兄弟:casezcasex。如果你的综合支持它,进入 case inside.

顺便说一句,综合可能无法弄清楚你那里有一个完整的案例。您可能想提供一个提示。在 system verilog 世界中,您应该使用 unique case 而不是 default。在模拟中,如果您点击 'default',它将生成一个断言,而对于综合,它将是一个 full/parallel 案例提示。