例如,我有一个模式 pt=1101 需要在串行输出 s_out= 1011101110111011 (LSB 优先)中进行检查。我试图检查“s_out”中的“pt”只使用SVA而不使用always块。注意:pt 和 s_out 的长度都是可变的。
我正在尝试对 pt 和 s_out 长度使用两个计数器,但我不知道如何在 SVA 中使用它们。
任何建议都会很有帮助。谢谢你,苏珊
例如,我有一个模式 pt=1101 需要在串行输出 s_out= 1011101110111011 (LSB 优先)中进行检查。我试图检查“s_out”中的“pt”只使用SVA而不使用always块。注意:pt 和 s_out 的长度都是可变的。
我正在尝试对 pt 和 s_out 长度使用两个计数器,但我不知道如何在 SVA 中使用它们。
任何建议都会很有帮助。谢谢你,苏珊
您可以在序列和属性中声明内部变量。这些也可以有输入参数。以下是我处理您的问题的方法:
首先,我将创建一个序列来处理匹配模式的一次出现。这个序列将模式作为参数,连同长度:
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
,应该检查任何后续出现的模式 while tx
is still1
并在它变为 时停止匹配0
。
你必须自己摆弄这里的细节,但我想你的问题已经得到了很好的回答。您可以看到如何在断言构造中使用内部变量。
PS如果你想要它,完整的代码(包括测试工具)在这里:http ://www.edaplayground.com/x/4my