SVA - 有没有办法使用系统verilog断言检查可变长度串行输出中的变量变量模式?

时间:2014-08-12 18:34:12

标签: system-verilog system-verilog-assertions

例如,我有一个模式pt = 1101需要在串行输出中检查s_out = 1011101110111011(LSB优先)。我想检查" pt" in" s_out"仅使用SVA而不使用always块。注意:pt和s_out的长度都是可变的。

我正在尝试将两个计数器用于pt和s_out长度,但我不知道如何在SVA中使用它们。

任何建议都会有所帮助。 谢谢, susun

1 个答案:

答案 0 :(得分:2)

您可以在序列和属性中声明内部变量。这些也可以有输入参数。以下是我如何解决您的问题:

首先,我将创建一个序列来处理匹配模式的一个匹配项。这个序列将模式作为参数,连同长度:

sequence pattern_in_output(pattern, int unsigned len);
  int unsigned count = 0;
  (
    s_out == pattern[count],
    $display("time = ", $time, " count = ", count),
    count += 1
  ) [*len];
endsequence

请注意pattern参数是无类型的。我还在那里留下了一些调试打印件,以便您了解它是如何工作的。此序列开始后,会检查lens_out周期与pattern的相应位匹配。

我不知道你确切的检查条件是什么(当你想要开始和停止的时候)所以我只是假设你有一个叫tx的信号告诉你你当前是在传输还是不是(1表示您正在传输,所以我们需要检查,0表示您不是,因此没有检查。

该属性看起来像这样:

assert property (
  @(posedge clk)

  // check first group
  $rose(tx) |-> pattern_in_output(pt, 4)

  // if 'tx' is still high, need to check for another occurence
  // - repeat this forever
  ##1 tx |-> pattern_in_output(pt, 4)

  // this line causes and internal error
  //##1 tx |-> pattern_in_output(pt, 4) [+] or !tx

  // this prints when the property exits
  ##0 (1, $display("exited at ", $time))
);

我们开始检查tx的上升沿。我们寻找我们之前定义的序列的匹配。之后,可能是我们仍在传输的情况,我们需要检查第二次出现的模式。如果在第二次出现后,tx仍为1,我们需要检查第三次,依此类推。

在这里,我不得不为你留下一半的答案而道歉。我在EDAPlayground上做这个例子并且无法使它工作(我不断得到模拟器内部错误)。行##1 tx |-> pattern_in_output(pt, 4)仅检查第二次出现。下面的那个(已注释掉的)##1 tx |-> pattern_in_output(pt, 4) [+] or !tx,应在tx仍为1时检查该模式的后续出现,并在0成为{{1}}时停止匹配

你必须自己在这里弄清楚细节,但我想你的问题已经得到了很好的回答。您可以看到如何在断言构造中使用内部变量。

P.S。如果您需要,完整代码(包括测试工具)在此处:http://www.edaplayground.com/x/4my