assertion的概念来源于软件设计中的错误监测,在verilog的TB中,也会通过各种task监测信号来报告状态。SV专门的assertion方便了这种监测的应用。当然伴随形式验证的发展,assertion也被用于形式验证的条件输入和期望输出。这里主要还是讲在动态仿真中的assertion的应用。在动态仿真中插入assertion能方便快速的对错误源头进行定位,减少debug时间。
assertion主要分2种,所谓的Immediate assertion和Concurrentassertion。这2种可以认为是 always @* 与always @(posedgeclk)的区别,即前者是始终在检查,而后者是在时钟沿进行采样检查的。
Immediate assertion
这种断言立即生效,可以用来检测组合信号,也可以在时钟模块中监测时序信号
time t;
always@(posedge clk)
if(state == REQ)
assert(req1 || req2) //监测信号是1,否则打印错误信息
else begin
t = $time;
#5 $error('assert failed at time %0t',t);
end
Concurrentassertion
这种断言在时钟沿生效,可以用来监测采样信号,并行断言自底向上分为4个逻辑层次分别是,逻辑层,序列层,属性层,断言层。以下通过一个例子说明
sequence req_gnt_seq;
// (~req& ~gnt) 表达式是逻辑层
(~req &gnt) ##1 (~req &~gnt); //这个是序列层,表达式1之后1个周期出现表达式2
endsequence
//=================================================
// Property Specification Layer
//=================================================
property req_gnt_prop; //属性层
@ (posedgeclk) //采样上升沿,且reset时无效
disable iff (reset)
req |-> req_gnt_seq; //req变高后出现序列req_gnt_seq
endproperty
//=================================================
// Assertion Directive Layer
//=================================================
req_gnt_assert : assert property (req_gnt_prop)//断言层,若违反则报错
else
$display('@ ns Assertion Failed', $time);
定义了assertion后,可以在TB的顶层将assertion与DUT绑定,让它去检查指定的dut,则在仿真中会动态报警。这样实现了设计与验证模块的分离,方便进行工程的管理,以下是bind的使用实例
module assertion_ip(input wire clk_ip,req_ip,reset_ip,gnt_ip);
sequence req_gnt_seq;
(~req_ip & gnt_ip) ##1 (~req_ip &~gnt_ip);
endsequence
property req_gnt_prop;
@ (posedge clk_ip)
disable iff(reset_ip)
req_ip |=> req_gnt_seq;
endproperty
req_gnt_assert : assert property (req_gnt_prop)
else
$display('@ ns Assertion Failed', $time);
endmodule
module bind_assertion(
input wire clk,req,reset,
output reg gnt);
always @ (posedge clk)
gnt <= req;
endmodule
module binding_module();
//=================================================
// Bind by Module name : This will bind all instance
// of DUT
//=================================================
// Here RTL : stands for design under test
// VIP : Assertion file
// RTL ModuleName VIP moduleName Instance Name
bind bind_assertion assertion_ip U_assert_ip (
// .vip port (RTL port)
.clk_ip (clk),
.req_ip (req),
.reset_ip (reset),
.gnt_ip (gnt)
);
endmodule
assertion更具体的语法参见LRM,由于跟uvm测试平台并不直接相关,这里不做更具体的解释。