Verilog 如果将默认案例添加到完整案例语句中,会发生什么情况?

Verilog 如果将默认案例添加到完整案例语句中,会发生什么情况?,verilog,system-verilog,hdl,Verilog,System Verilog,Hdl,如标题所述,如果将默认语句添加到完整的case语句中,会发生什么情况?这会在模拟/合成中引起任何问题吗?如果不是,将此默认语句添加到完整案例的目的是什么 比如说, ''' enum logic [1:0] {Reset, A, B, C} state, nstate; always_comb begin case(state) Reset: if(expr) nstate = A; else

如标题所述,如果将默认语句添加到完整的case语句中,会发生什么情况?这会在模拟/合成中引起任何问题吗?如果不是,将此默认语句添加到完整案例的目的是什么

比如说,

'''
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语句中时,将触发默认语句。这可能发生在模拟过程中,因为
状态
的某些(或全部)位可能不确定或高阻抗

如果未提供默认语句,则在模拟期间,
nstate
将成为一个锁存器,如果案例块中未包含
state
的当前值,则保留其以前的值。在合成中,一个完整的情况将表现相同,无论是否有默认语句,尽管提供默认情况,特别是在时钟始终块中,可能有助于合成器决定是否应使用时钟启用功能


因此,如果没有提供默认语句,模拟和合成行为可能不匹配,因为模拟覆盖的case变量逻辑级别比合成多。

当任何其他case语句中不存在
状态的当前值时,将触发默认语句。这可能发生在模拟过程中,因为
状态
的某些(或全部)位可能不确定或高阻抗

如果未提供默认语句,则在模拟期间,
nstate
将成为一个锁存器,如果案例块中未包含
state
的当前值,则保留其以前的值。在合成中,一个完整的情况将表现相同,无论是否有默认语句,尽管提供默认情况,特别是在时钟始终块中,可能有助于合成器决定是否应使用时钟启用功能


因此,如果没有提供默认语句,模拟和合成行为可能会不匹配,因为模拟覆盖的case变量逻辑级别比合成多。

正如@mcleod_ideafix所示,verilog模拟中存在一些差异。它执行default子句的唯一方法是对case语句本身使用未定义的输入。因此,
default
子句只表示
未定义的行为。因此,最好将
x
作为状态机的下一个状态,这意味着未知。在这种情况下,您的状态机应该能够恢复

default: nstate = 'x;
还要注意的是,
case
在出现“x”或“z”时会以一种奇怪的方式运行,并且在模拟时可能会给出错误的答案。您可能需要查看它的其他同级:
casez
casex
。如果您的合成支持,请将其放入
内的case


顺便说一句,合成可能无法找出你有一个完整的案例。您可能需要提供一个提示。在system verilog world中,您应该使用
唯一大小写
和no
默认值
。在模拟中,如果您点击“default”,它将生成一个断言,对于合成,它将是一个完整/并行的case提示。

正如@mcleod_ideafix所示,verilog模拟中存在一些差异。它执行default子句的唯一方法是对case语句本身使用未定义的输入。因此,
default
子句只表示
未定义的行为。因此,最好将
x
作为状态机的下一个状态,这意味着未知。在这种情况下,您的状态机应该能够恢复

default: nstate = 'x;
还要注意的是,
case
在出现“x”或“z”时会以一种奇怪的方式运行,并且在模拟时可能会给出错误的答案。您可能需要查看它的其他同级:
casez
casex
。如果您的合成支持,请将其放入
内的case

顺便说一句,合成可能无法找出你有一个完整的案例。您可能需要提供一个提示。在system verilog world中,您应该使用
唯一大小写
和no
默认值
。在模拟中,如果您点击“default”,它将生成一个断言,对于合成,它将是一个完整/并行的case提示