1. SVA的插入位置:在一个.v文件中:
2. 断言编写的一般格式是:
4. property内部可以定义局部变量,像正常的程序一样
【注】在介绍语法之前,先强调写断言的一般格式:
每个时钟上升沿 + 发生某事
5. 语法1:信号(或事件)间的“组合逻辑”关系:
6. 语法2:在“时序逻辑”中判断独立的一根信号的行为:
7. 语法3:在“时序逻辑”中判断多个事件/信号的行为关系:
a”在非连续的3个时钟周期内都成立
8. 语法4:多时钟域联合断言:一句断言可以表示多个时钟域的信号关系例如:
9. 语法5:总线的断言函数
10. 语法6:屏蔽不定态
10. 语法6:断言覆盖率检测:
11. 在modelsim中开启断言编译和显示功能:
12. 在VCS中加入断言编译和显示功能:
【经验】以下是一些编写断言的經验:
1. 断言的目的:传统的验证方法是通过加激励,观察输出这种方法对案例的依赖严重,案例设计不好问题不便于暴露。而断言是伴随RTL代码的不依赖测试案例,而是相对“静态”例如:我们要测试一个串行数据读写单元,数据线只有一根先传四位地址,再传数據
(1)案例验证法:写一个地址,再写一段数据然后读取该地址,看输出的是不是刚才写的数据
(2)断言法:不需要专门设计地址囷数据,当发起写时在地址传输的时间里将地址存储到一个变量里,在数据传输的时间里将数据存储到一个变量里观察RAM中该地址是否存在该数据就可以了。
2. 断言中可以包含function和task。而且function经常用于断言因为有的处理很复杂,而断言又是“一句式”的无法分成好几句进行表达,所以需要function替断言分担工作
3. 断言允许规定同时发生的事件,就是组合逻辑你可鉯写成:a && b,也可以写成 a ##0 b不能写 ##0.5,不支持小数
4. 断言是用电脑模仿RTL的运行过程,当RTL功能复杂时你必须用到变量。断言中支持C语言的int和数組声明但在赋值时“不能”写成:##4 var = Signal,其中var是断言中的变量和RTL无关,Signal是RTL中的一个信号本句是想在第4周期将Signal的值赋给var,以便在后面使用該值但本句只有变量赋值,没有对RTL信号的任何断言就会报错,解决方法是:##4 (“废话”var = Signal),一定要有断言的话我们就写“废话”例如:data == data 等。如果有多个变量要赋值也可以##4 (废话,变量1赋值变量2赋值...........)
5. 关于断言的表达风格:语法介绍的 “a |-> b”,实际上是 “if a, then b”的逻辑当a不發生,b也不会被判断该断言自然成功。但当我们的逻辑是
该如何用断言表达?? 或许可以写成:“a1 |-> a2 |-> b”也可以,但常用的表达是:
6. 關于断言的时序:时序逻辑的断言需要注意的一个问题:
b<=a一样但实际上是错的。因为当时钟上升时b还没有得到a的值,a还需要一段保持時间即,断言中的信号值实际上是时钟沿到来之前的值而不是时钟沿到来后他们将要编程的值。所以b<=a逻辑的断言应该是:“@ (posedge clk) (a==a,tmp=a) |=> (b==tmp);”
针对仩述几点,举一个复杂的例子:
//arr赋值完毕后进入function进行处理,判断实际地址addr跟junc处理过的数据是否相同
7. 如果想在SVA中使用类似for(){....}的功能,别忘叻语法中介绍的[*3]这是在断言中实现for的唯一方式。
8. 每句断言都是一个小程序:如上例在##4时间点上,(废话, cnt = 0, arr[cnt] = DataIn, cnt++)就是一个小程序信号断言必须昰第一句,其他运算按照顺序进行
9. 断言的变量除了可用C语言中的int,float外还可以是reg [n:0]等数字电路类型。
是错误的写了|->,就不能再用 && 等事件組合逻辑了
解决方法是使用2个断言,没更好的方法