推荐答案
测试一下
题目
a1和a2的检查效果完全一样:
A.错误
B.正确
参考答案与知识点
参考答案
我们分析题目:a1使用property p1,其中定义是`a=>bj=>c`,注意这里的符号:`=>` 是非序列的蕴含(实际上是overlap的蕴含,即a为真时,下一个时钟沿检查后面的序列),但写法有误:标准SVA中,`a=>bj=>c`可能意图是`a |-> b ##1 c`?实际上,`=>`在SVA中表示非重叠蕴含(即`|=>`),但这里写成了`aj=>bj=>c`,可能是个笔误。然后a2使用的property p2是`a ##1 b ##1 |-> c`,其中`##1`表示延迟一个时钟周期,`|->`是重叠蕴含。问题问a1和a2的检查效果是否完全一样。
需要理解两个property的含义:
- property p1: `a=>bj=>c`。假设实际意图是连续蕴含:如果a成立,则下一周期b成立,再下一周期c成立?但`=>`符号在SVA中表示overlap的非蕴含?实际上标准SVA:`|=>`是非重叠蕴含(下一个时钟沿),`|->`是重叠蕴含(当前时钟沿)。而`=>`不是标准符号,可能题目中的`=>`是`|=>`?但写成了`=>`。另外`bj`是笔误?可能是`b`?如果假设p1是`a |=> b |=> c`,那么含义是:在时钟上升沿,如果a为真,则下一个时钟沿b必须为真,再下一个时钟沿c必须为真。这是一个序列检查:a为真后,过一个周期b为真,再过周期c为真。
而property p2: `a ##1 b ##1 |-> c`。`##1`表示延迟1个时钟周期,所以序列是:a当前时钟沿,然后过一个周期b,然后过一个周期(即从a后第2个时钟沿)c?注意写法`##1 b ##1 |-> c`,标准语法是`a ##1 b ##1 c`这样是序列,但这里写的是`##1 |-> c`,实际上`|->`是蕴含操作符,不能直接跟在`##1`后面。可能意图是`a ##1 b |-> c`?或者`a ##1 b ##1 c`?从常见题目看,可能是`a ##1 b ##1 c`作为序列,但这里写成了`a ##1 b ##1 |-> c`,可能是笔误。通常`a ##1 b ##1 c`表示序列:a成立,一个时钟后b成立,再一个时钟后c成立。而`|-> c`表示蕴含:如果序列发生,则c成立。但这里如果是`a ##1 b ##1 |-> c`,语法不对。可能应该是`a ##1 b ##1 c`,或者`a ##1 b |-> c`。需要根据常见出题意图。
另一种常见考题:比较`a |=> b |=> c`和`a ##1 b ##1 c`的区别。实际上前者是蕴含,后者是序列。蕴含的含义是:当a成立时,检查b是否成立;若b也成立,则继续检查c;但序列则是要求a在t0,b在t1,c在t2同时成立。两者在时序上一样,但语义不同:蕴含是条件性的,而序列是无条件检查所有时间点的?实际上,`a |=> b |=> c`等价于`assert property (@(posedge clk) a |=> (b |=> c))`,意思是当a为真时,下一个周期b必须为真,并且当b为真时,下一个周期c必须为真。如果a为假,则整个断言成功(vacuous)。而序列`a ##1 b ##1 c`则要求在每一拍都检查这些信号,如果a不成立则断言失败(除非使用`cover`或`assert`加`$past`之类的)。通常,序列作为断言使用时,隐含了起始条件:每个时钟沿都尝试匹配序列,如果序列不匹配则断言失败。所以这是不同的。
但本题中p1用了`=`,p2用了`##1`和`|->`。我们需要推测正确写法。常见题目中,`a => b => c`可能被解释为`a |=> b |=> c`,而`a ##1 b ##1 c`则不同。但这里p2中有`|->`,可能意图是`a ##1 b |-> c`,即如果a和b在连续两拍成立,则c必须在下一拍成立。而p1是a成立后下一拍b成立,再下一拍c成立?这样检查的效果是一样的吗?
注意:两个property在时序上可能相同,但检查的逻辑不同。p1使用蕴含,p2使用序列+蕴含?但p2的写法不标准。我们仔细分析题目原文:
```
property p1:
@(posedge clk) aj=>bj=>c;
endproperty
```
可能是打字错误,`aj`和`bj`应该是`a`和`b`,`=>`可能是`|=>`?但这里的`=>`符号在SVA中并不存在。实际上,SVA中有`=>`作为序列连接操作符的一部分,比如`a ##1 b => c`表示序列匹配时触发?不,`=>`不是标准。标准中序列连接用`##`,蕴含用`|->`和`|=>`。所以可能是题目有意写错来考察基础知识。
我倾向于认为题目本意是:p1是`a |=> b |=> c`,即a成立后下一时钟b成立,再下一时钟c成立;p2是`a ##1 b ##1 c`,即连续三个时钟依次出现a、b、c。但p2的写法中有`|->`,可能是笔误。实际上,很多教材会用`a => b => c`表示重叠的蕴含?但通常`a |-> b |-> c`表示如果a成立,则立即检查b成立,如果b成立则立即检查c。但这里有时钟沿,所以是每个时钟沿检查。
再思考:可能p1中的`=>`是`|->`?因为有些资料用`=>`表示重叠蕴含。但SVA中`|->`才是重叠蕴含。所以需要根据常见易错点:`a |-> b`和`a => b`的区别?但这里是
涉及知识点
- 时钟
- 时序