例如,我有一个模式pt = 1101需要在串行输出中检查s_out = 1011101110111011(LSB优先)。我想检查" pt" in" s_out"仅使用SVA而不使用always块。注意:pt和s_out的长度都是可变的。
我正在尝试将两个计数器用于pt和s_out长度,但我不知道如何在SVA中使用它们。
任何建议都会有所帮助。 谢谢, susun
答案 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
参数是无类型的。我还在那里留下了一些调试打印件,以便您了解它是如何工作的。此序列开始后,会检查len
个s_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