断言
断言就是一段描述设计期望行为的代码。目前,对断言的使用主要在于仿真,但断言的能力不仅仅如此。断言是基于一些更加基础的信息,我们称之为属性 (Property),属性可以用来作为断言、功能覆盖点、形式检查和约束随机激励生成。断言可以应用在白盒调试或者黑盒调试两种方式中,一般情况下,白盒调试会被设计工程师采用,而黑盒调试会与验证工程师比较相关。作为设计工程师,他可以借助对设计的认识,对某些关键的设计部分添加断言,例如 fifo的读写是否溢出,数据传输时握手协议是否符合约定等,通常在采用第三方的设计IP,都会要求IP提供商附带提供该 IP接口的断言模块,以保证在系统集成的时候,在对接部分的设计能够符合 IP接口的要求。作为验证工程师,主要是在更高一个层次架构验证平台和验证策略,其未必对设计的细节很了解;为此,设计的大部分模块对他们来说是黑盒子,验证工程师关注的是各个模块之间的连接,以及设计顶层的接口是否符合设计规范,例如:APB接口设计是否符合规范,顶层以太网接口是否符合规范,上电复位的过程是否正常等。
立即断言与并发断言区别
在过程化代码 (initial/program/function/task) 中使用的 assert,其中没有任何时序概念的为立即断言。而并发断言是一种基于周期的语法结构,需要采样事件去激发周期性的数值采样,为此对同步时序电路比较有效。
sequence和property的区别
property区别于sequence很大的特点就是可以定义蕴涵操作符。
断言常见语法
常见调用函数
$isunknown
指某个信号不能为随机态
如
property SIGNAL_VALID(signal);
@(posedge PCLK)
!$isunknown(signal);//表示在每个时钟的上升沿,signal不能为x值
endproperty: SIGNAL_VALID
2.$onehot
指信号中只有一位为1
如
property CONTROL_SIGNAL_VALID(signal);
@(posedge PCLK)
$onehot(PSEL) |-> !$isunknown(signal);//PSEL信号中只有一位为1
endproperty: CONTROL_SIGNAL_VALID
$rose 和 $fell
分别指拉高和拉低信号
如
property PENABLE_SIGNAL_VALID(signal);
@(posedge PCLK)
$rose(PENABLE) |-> !$isunknown(signal)[*1:$] ##1 $fell(PENABLE);
endproperty: PENABLE_SIGNAL_VALID //分别表示拉高PENABLE信号和拉低PENABLE信号
$stable
指信号保持稳定
如
property PSEL_TO_PENABLE_ACTIVE;
@(posedge PCLK)
(!$stable(PSEL) && $onehot(PSEL)) |=> PENABLE;
endproperty: PSEL_TO_PENABLE_ACTIVE //表示PSEL信号不稳定,即跳变为1以后,拉高PENABLE信号
$past
指采样过去周期的值
如
property PENABLE_ACTIVE_to_PSEL;
@(posedge clk) $rose(PENABLE) |-> $past(PSEL,1);
//在PENABLE拉高的前1个周期,PSEL的信号应该为高
endproperty: PENABLE_ACTIVE_to_PSEL
$coutones
表示信号中有几位拉高为1
如$coutones(PSEL) == 1; //PSEL中有且仅有1bits是高,其他是低
if的用法
如当a为高时,下一个周期,b为高或者c应该为高;
如果b为高,则下一个周期bb为高
如果c为高,则下一个周期cc为高
property master_child_reqs;
@(posedge clk) a ##1 (b || c)
if(b) (##1 bb)
else (##1 cc);
endproperty
蕴含操作符
property PENABLE_DEASSERTED;
@(posedge PCLK)
$rose(PENABLE && PREADY) |=> !PENABLE;//PENABLE和PREADY拉高以后,下一个周期PENABLE应该拉低 |=> 相当于|-> ##1
endproperty: PENABLE_DEASSERTED
// 只有蕴含操作符左边表达式成立,才进行右边
重复操作符
符号 | 含义 |
---|---|
## | 延长多少周期 |
##[m:n] | 在m:n的周期内 |
##[1:$] | 表示1到最大一个时间周期 |
[*n] | 表示重复n个周期 |
[*m:n] | 表示一段时间范围的重复 |
[=m:n] | 表示m:n范围内事件的重复发生,不要求连续 |