我在FSM中有一个独特的case语句,如下所示:
enum logic [1:0] {IDLE = 2'b01,
RUN = 2'b10} state, next_state;
always_comb begin
next_state=state;
unique case(state)
IDLE: next_state = RUN;
RUN: next_state = IDLE
endcase
end
always_ff @(posedge clk or negedge rstb) begin
if(!rstb) state <= IDLE;
else state <= next_state;
end
我在0时收到“唯一案例违规”警告,可能是因为所有内容都以X
启动。我相当肯定上面的代码将始终只有一个真实案例,所以我想摆脱这个警告。
答案 0 :(得分:1)
您可以使用系统任务rawQuery
动态打开/关闭断言,包括unique case
,unique if
等。请参阅execSQL
§20.12断言控制系统任务。
请注意,$assertcontrol
是新的(在IEEE Std 1800-2012中添加)并且某些模拟器可能不支持它。还有其他系统任务可以启用/禁用自IEEE1800之前就已存在的$assertcontrol
,$asserton
等断言(我在Accellera SystemVerilog 3.0中看到它),但我不确定它们是否包括$assertoff
如果您的模拟器已经支持unique case
,那么您可以使用类似下面的代码。我建议在使用$assertcontrol
的任何文件之前编译包含此代码的文件,以降低在0时刻出现竞争条件的风险。
unique case
答案 1 :(得分:0)
最简单的解决方案是在声明中为IDLE
分配一个值(例如state
):
enum logic [1:0] {IDLE = 2'b01,
RUN = 2'b10} state = IDLE, next_state;
当然,您也可以在案例中添加default
操作。
你必须记住它只是一个警告。如果您在开始时重置(~rstb
)模块,如果忽略它,则不会发生任何错误。