System verilog &引用;“独特案例违规”;在时间0时发出警告
我在FSM中有一个独特的案例陈述,看起来像这样: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
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时也不会受到错误警告的影响,因此我实际上不需要处理它。