时间0处的“唯一案例违规”警告

时间:2015-03-23 13:48:10

标签: system-verilog

我在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启动。我相当肯定上面的代码将始终只有一个真实案例,所以我想摆脱这个警告。

2 个答案:

答案 0 :(得分:1)

您可以使用系统任务rawQuery动态打开/关闭断言,包括unique caseunique 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)模块,如果忽略它,则不会发生任何错误。