System verilog &引用;“独特案例违规”;在时间0时发出警告

System verilog &引用;“独特案例违规”;在时间0时发出警告,system-verilog,System Verilog,我在FSM中有一个独特的案例陈述,看起来像这样: 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 @(po

我在FSM中有一个独特的案例陈述,看起来像这样:

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
枚举逻辑[1:0]{IDLE=2'b01, RUN=2'b10}状态,下一个_状态; 总是从梳子开始 下一个状态=状态; 唯一情况(状态) 空闲:下一个_状态=运行; 运行:下一状态=空闲 尾声 结束 始终_ff@(posedge clk或negedge rstb)开始
如果(!rstb)状态,最简单的解决方案是在声明内部为
状态分配一个值(例如
空闲
):

enum logic [1:0] {IDLE = 2'b01,
                  RUN = 2'b10} state = IDLE, next_state;
当然,您也可以在案例中添加
default
操作


你必须记住这只是一个警告。如果在开始时重置(
~rstb
)模块,如果忽略它,则不会发生任何错误。

您可以使用系统任务
$assertcontrol
动态打开/关闭断言,包括
唯一大小写
唯一If
等。请参阅§20.12断言控制系统任务

请注意,
$assertcontrol
是新的(添加到中),一些模拟器可能不支持它。还有一些其他系统任务可以启用/禁用断言,例如自IEEE1800之前就存在的
$asserton
$assertoff
(我在Accelera SystemVerilog 3.0中看到了它),但我不确定它们是否包含
唯一案例

如果您的模拟器已经支持
$assertcontrol
,那么您可以使用如下代码。我建议先编译包含此代码的文件,然后再编译任何使用
unique case
的文件,以降低时间0时出现争用情况的风险

parameter ON=3, OFF=4;
parameter UNIQUE=32, UNIQUE0=64, PRIORITY=128;
initial begin
  // Turn OFF the violation reporting for unique case, unique0 case, priority case, unique if, etc.
  $assertcontrol( OFF , UNIQUE | UNIQUE0 | PRIORITY );

  // Wait some time
  @(negedge rstb) #1ns; // or whatever delay statement you want

  // Turn ON the violation reporting for unique case, unique0 case, priority case, unique if, etc.
  $assertcontrol( ON , UNIQUE | UNIQUE0 | PRIORITY );
end

我知道我可以无视警告,但我喜欢尽我所能去清理。如果我分配
state=IDLE
,那么我会得到一个错误,因为
state
有多个驱动程序。@nguthrie:你在用什么IDE?这对我来说很有效,Cadence精辟。似乎是一个bug,因为我在规范的第10.5节中发现了这一点:
变量声明赋值是过程赋值的一个特例,因为它为变量赋值。它允许将初始值放在声明变量的同一语句中的变量中
。当然,做这个作业会掩盖一个真正的问题,因为某些原因没有重置。我真正想要的是一种在时间0时抑制警告的方法。这可能是特定于工具的。您可以使用
ncelab-svperf-up
禁用
唯一案例
警告。我不确定您是否只能在时间0时禁用警告。这么有趣的故事:我使用的模拟器版本不支持
$assertcontrol
。我升级到了最新版本,它支持它。但是,它在时间0时也不会受到错误警告的影响,因此我实际上不需要处理它。