0

我正在尝试验证两个模块之间的非常简单的握手。一个模块在慢时钟上并提高“req”,较快的模块应该在下一个快速时钟上提高“ack”并保持它直到下一个慢时钟构成。最终结果如下所示:

req-ack 波形图示例

这就是我写期望的方式:

expect expect_ack_when_req_go is
      (@req_rise_e) => @ack_rise_e
      else dut_error("ERROR: ack expected to be asserted when req rises!");

*@req_rise_e 和@ack_rise_e 都是在慢时钟上采样的。

运行模拟器会产生错误,因为第一个表达式似乎成功但第二个没有。尽管在将事件跟踪到 wave 时,我可以看到两个事件一起发生(如 wave 中所示:event_req,event_ack)。

4

1 回答 1

3

你试图做重叠的暗示,即你的两个事件都发生在同一个周期中。操作员所做的=>是检查结果是否发生在下一个采样事件上,在这种情况下是下一个慢时钟沿。这在SystemVerilog断言用语中称为非重叠蕴涵。

您可以通过编写以下内容来获得所需的行为:

expect expect_ack_when_req_go is
  (@req_rise_e) => detach({@ack_rise_e; ~[1]})
  else dut_error("ERROR: ack expected to be asserted when req rises!");

完整的解释在这里

在方法论上,我建议不要以不同的方式编写时间表达式。我假设您正在验证正在驱动的模块,ack并且该模块在两个时钟上都工作。我还假设该模块req使用快速时钟进行采样。将您的支票表述为:

expect expect_ack_when_req_go is
  (@req_rise_at_fast_clock_e) => @ack_rise_at_slow_clock_e
  else dut_error("ERROR: ack expected to be asserted when req rises!");

这样您就不必乱搞,detach(...)并且与expect您所需行为的自然语言描述更加匹配。

于 2017-09-26T12:36:07.017 回答