1

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

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

任何建议都会很有帮助。谢谢你,苏珊

4

1 回答 1

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参数是无类型的。我还在那里留下了一些调试打印,让你看看它是如何工作的。len一旦这个序列开始,它就会检查s_outpattern.

我不知道您检查的确切条件是什么(您想要启动和停止的确切时间)所以我只是假设您有一个信号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,应该检查任何后续出现的模式 while txis still1并在它变为 时停止匹配0

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

PS如果你想要它,完整的代码(包括测试工具)在这里:http ://www.edaplayground.com/x/4my

于 2014-09-16T20:30:32.870 回答