【问题标题】:How to use an input value with repetition operator?如何将输入值与重复运算符一起使用?
【发布时间】:2022-01-05 09:12:55
【问题描述】:

如何在 SV 断言中使用带有重复运算符的设计输入? 基本上,我要实现的是:

property ( ( disable iff((a) or (b) or (c) or (d))
          $rose(req) |-> req[*32] 

我正在尝试用 t_req 替换 32,这是设计模块的输入,可以由用户更改。

有什么方法可以使断言动态化,从而使值 32 不被硬编码?

【问题讨论】:

标签: system-verilog system-verilog-assertions


【解决方案1】:

一种方法是计算req 的高电平持续了多长时间,然后将其与t_req 进行比较。为此,您需要在断言中嵌入一些代码。你可以使用这个操作符来做到这一点:

( <a sequence>, <some code>, <some more code>, ...)

当序列匹配时,代码被执行。你不能写任何代码。你只能做三件事:

  • 分配给局部变量
  • 增加/减少一个局部变量
  • 调用函数或任务

局部变量是在属性中声明的变量。函数或任务不得分配给任何其他变量。

所以,这里有一个建议:

property req_check;
    int unsigned pulse_width;
    ($rose(req), pulse_width=0) |-> (req, pulse_width++) ##1 (!req && check(pulse_width) );
endproperty

assert property ( disable iff ((a) or (b) or (c) or (d)) req_check);

function bit check(int unsigned width);
    return (width == t_req);
endfunction

【讨论】:

猜你喜欢
  • 2017-02-05
  • 2017-11-22
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多