uvm 形式验证_如何从零开始构建一个可用的UVM验证平台

本文介绍了Verilog中 Immediate 和 Concurrent Assertion 的概念及其在动态仿真中的应用,帮助理解和提高错误定位效率。通过示例展示了sequence、property和assertion的结合使用,并提供了bind绑定实例,强调了设计与验证模块的分离在工程管理中的优势。
摘要由CSDN通过智能技术生成

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测试平台并不直接相关,这里不做更具体的解释。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值