system verilog property assertion 断言

property:

  • property: “流程”

在这里插入图片描述


assert:

并发断言 (concurrent assertion)

  • 并发断言基于时钟周期,用于描述一个跨时钟周期的行为
  • 并发断言使用关键字 property…endproperty描述事件,如下
// "流程"
property
	......
endproperty
// assert关键字启动断言检查
AssertName:assert property(PropertyName);     // assert:检查是否符合该流程

在这里插入图片描述

property pCookiesInJar:
	@(posedge hour_clk) not (cookie_count<9); // cookie_count<9 则流程错误
endproperty:pCookiesInJar

// assert:检查是否符合该流程
apCookiesInJar:assert property(pCookiesInJar) statement: else punish_the_kid();    // 符合打印预设statement,不符合执行punish_the_kid()

在这里插入图片描述
clk 时钟上升沿到来之后,request = 1,启动线程序列检查:在下个时钟周期,先拉高 acknowlege,再等待一个时钟周期,拉高 data_enable, 再等待一个时钟周期,拉高 done

  • 蕴涵操作符 (类似if语句)

连接原因序列与结果序列

// 蕴涵操作符 符号“|=>” “|->”左侧的为原因序列,右侧为结果序列

|=>    // 结果序列处于起因序列的下一个时钟周期;等效于##1
|->    // 起因序列与结果序列处于同一个时钟周期
// |->  起因序列与结果序列处于同一个时钟周期
@(posedge clk0) s0 |-> @(posedge clk1) s1        // 语法序列不合法,存在不同的时钟
@(posedge clk0) s0 |-> @(posedge clk0) s1        // 正确

// |=>  结果序列处于起因序列的下一个时钟周期;等效于##1
@(posedge clk0) sig0 |=> @(posedge clk1) sig1     //操作符"|=>"用于同步clk0与clk1的上升沿,等效于##1

在这里插入图片描述每次时钟上升沿到来,只有 request = 1,assert 才会开始检测这个流程( |=> acknowlege ##1 data_enable ##1 done ),request = 0,assert 不检测。所谓 “vacuously true”

  • 将序列 (结果序列)封装
// 封装单个序列 a ##1 b ##1 c 为 s1
sequence s1;        // sequence主要描述信号与信号之间的时序关系
  a ##1 b ##1 c;    // a为高,下一拍b为高,在下一拍c为高
endsequence

// 多个序列封装进property
property p1;        // property主要将各种sequence进行封装
  s1;
endproperty

// 关键字assert启动断言
a1:assert property(@(posedge clk) a |-> p1 );    // 在每个时钟上升沿检查, |-> :表示起因序列和结果序列在同一个周期

cover property(a1) else `uvm_error("ASSERT","....");    // 断言覆盖率

即时断言 (immediate assertion)

  • 不跨越时间
    在这里插入图片描述
    检测 foo (expression表达式)
assert_name:assert(expression)  //  assert_info为该断言的名字
     $display("passed");         //expression为真时,执行语句
  else
     $display("failed");         //expression为假时,执行语句
//如果状态为REQ,但是req1或者req2均不为1时,断言将失败
always @ (posedge clk) begin
	if(state == REQ)
		assert(req1||req2) //立即断言
	else begin
		t = $time;
		#5$error("assert failed at time %0t", t);
	end
end
always @ (state)
	assert (state == $onehot) else $fatal;

disable iff 与 not

  • disable iff (expression):当expression为真时,关闭property的序列检查,否则进行检查
  • not: 表示not后的序列不能出现
property  abc(a, b ,c);     // 参数化
   disable iff(a==1);       // 当a为1时,关闭属性检查
   not @clk (b ##1 c);      // not后的序列不能出现
endproperty

//statement语句是可选的,当属性为真,执行pass_statement,否则执行fail_statement
env_property:assert property(abc(rst, in, out)) pass_statement; else fail_statement;    // not后的序列不出现,则属性为真
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值