Verilog 如果将默认案例添加到完整案例语句中,会发生什么情况?
如标题所述,如果将默认语句添加到完整的case语句中,会发生什么情况?这会在模拟/合成中引起任何问题吗?如果不是,将此默认语句添加到完整案例的目的是什么 比如说,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
'''
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提示