Verilog 如何编写定时时间较长的恢复重置正式测试

Verilog 如何编写定时时间较长的恢复重置正式测试,verilog,system-verilog,formal-languages,formal-verification,asic,Verilog,System Verilog,Formal Languages,Formal Verification,Asic,我曾经通过动态测试验证由一个串行端口和一组寄存器组成的模块。其中一个测试是恢复重置测试。时序是(i)从串行端口将随机数据写入寄存器(占用40个时钟周期)(ii)将该寄存器复位并释放(iii)从串行端口读取该寄存器(占用另一个40个时钟周期) 这很容易在动态测试中实现。现在我想正式地写这个计时,但是我发现正式的工具很难确定这个断言,因为计时太长,大约82个周期,正式的工具无法探索这么多的空间状态。可以正式编写这样的测试吗 此外,常见的复位形式化测试非常简单,只需1个周期,形式化工具从复位状态开始探

我曾经通过动态测试验证由一个串行端口和一组寄存器组成的模块。其中一个测试是恢复重置测试。时序是(i)从串行端口将随机数据写入寄存器(占用40个时钟周期)(ii)将该寄存器复位并释放(iii)从串行端口读取该寄存器(占用另一个40个时钟周期)

这很容易在动态测试中实现。现在我想正式地写这个计时,但是我发现正式的工具很难确定这个断言,因为计时太长,大约82个周期,正式的工具无法探索这么多的空间状态。可以正式编写这样的测试吗


此外,常见的复位形式化测试非常简单,只需1个周期,形式化工具从复位状态开始探索空间状态。但是现在我试着写一个测试,说在DUT做了一些事情之后,把reg放在reset中,读出它,值仍然是reset值。

你的问题可能是工具正在探索它可以应用reset的所有可能状态。也就是说,如果我用4加载寄存器A,用8加载寄存器B,然后应用reset,会发生什么。现在尝试寄存器A是5,寄存器B是8,我应用重置,会发生什么。现在尝试寄存器A为6和。。。。你明白了

您可以编写这些测试,但需要做几件事:

  • 不要在开始时重置。这样,所有寄存器都是未定义的,可以接受任何值。这使得工具可以轻松访问设计中的所有状态
  • 如有必要,添加一个约束,以便仅出现一个重置脉冲,否则可能尝试1次重置、2次重置、3次重置。。。希望它能意识到他们最终都处于同一个状态
  • 您可能需要将其他输入约束为空闲,这样它就不会试图用这种方式来探索状态,但这可能是不必要的
注意:重置测试的约束集往往与其他功能测试的约束集不同,因此您需要单独的正式运行