SVA学习笔记

SVA 学习笔记

简介

断言即在设计中添加一系列语法规则,在断言条件不满足时打印失败信息,相当于扩展版的if $display 功能,传统的display功能无法检测时序逻辑是否正常,断言可以。

用途

断言主要用于一些如gmii、DDR等复杂协议的检测,在设计完成后,进行仿真时,加入断言可以通过在测试阶段更加快速的定位设计缺陷。

小TIPS

添加断言后,代码无法综合,但是可以编译,可以添加宏定义,将断言语句包裹起来起来,在综合时取消宏定义。断言检测的是时序逻辑是否正常,因此需要跑起来,即添加激励后运行才可以检测。如下:

always @(posedge clk or negedge rst_n)begin
	if(!rst_n)
		data <= 0;
	else begin
		if(!data_valid)
			data <= data_in;
		else 
			data <= data;
	end
end

在上例中,数据应该在data_valid有效时进行改变,在data_valid为低时数据应该保持不变,但是在一些复杂的逻辑中,设计结果往往不如人意, 为了确保数据只在数据有效时发生变化可以在当前模块内添加如下断言:

	`ifdef SIMULATION
		property data_valid;
			@(posedge clk) data_valid |-> (data == data_in);
		endproperty
		assert property(data_valid);
	`endif

在编译时在顶层定义 SIMULATION将使能断言,当data_valid有效时,data不等于data_in时,在编译时就会报offending

调用方法

assert(property (property_name); //assert 括号内部为0就会报 offending

一、及时断言

1、丙戌放在过程快中

与并发断言可以用property进行区别

及时断言只有在被测信号发生变化时被检测。

二、并发断言

1、并发断言基于时钟周期

2、在时钟边沿,根据调用的变量的采样值计算测试表达式

3、并发断言可以放进过程快、模块、接口、程序中

并发断言将在每个时钟的边沿进行检测

总结:

及时断言类似always (*)

并发断言类似always @()

三、断言块

断言块相当于一个包裹所有断言的容器,类似一个程序,包裹着很多代码,而断言块内包含许多断言

sequence name_of_sequence;
	assert logic
endsequence

对这个断言块进行检测的方法是:

assertion_name:assert property (property_name);

四、具体语法

4.1 边沿检测

$rose(boolean expression or signal);//上升沿时检测

$fell(boolean expression or signal);//下降沿时检测

$stable(boolean expression or signal);//不发生变化时返回真

手动控制assert成功和失败的逻辑

assert property(property_name)

    sucess logic

else 

    fall logic;

多个检测序列可以组合使用

例:


sequence s11a;

    @(posedge clk)(a&&b) ##1 c;

endsequence

sequence s11b;

    @(posedge clk)##2 !d;

endsequence

property p11;

    s11a |-> s11b;

endproperty

4.1.1 重复检测

a [*3] 表示连续三个时钟周期a为高电平,重复检测的语法可以用于检测序列

如(a ## 2 b)[*3] 就会连续检测3次 a ##2 b,对于需要延时的序列也可以用这种重复检测

a[*1:5] 表示从某个时钟周期开始,a将重复1~5个时钟周期

a[->3] 表示信号a 从某个时钟周期开始,连续或间断3个时钟周期为高

a[=3] 与前面a[->3]类似,不同点在于[->] 满足后不能有时间间隔就要满足下一个条件 [=]后面可以有时间间隔

4.1.2 不同sequence之间的连接

在property 可以用and、or、intersect、throught将不同的sequence相连。

其中and 和 intersect 作用类似,or 和 throughout类似不同点在于

and 只匹配 起始点,intersect 还需要匹配结束点

or 和 throughout 的不同点一样

利用这个机制可以使用intersect来控制序列长度

例:

property p35;

(@(posedge clk ) 1[*2:5] intersect (a ##[1:$] b ## [1:]))

endproperty

上述assert将检测的序列限制在2:5个周期。

first_match 使用first_match 则只需要第一次匹配,后面结果不影响

例子:

property p30;

    @(posedge clk) first_match(s30a or s30b);

endproperty

within 也能将不同sequence 相连 seq1 within seq2的条件下

seq1必须发生在seq2之内

4.2 良好的编程习惯

通常情况下,将组合逻辑写进一个sequence 块中,而将时钟写进property中能使代码具有更强的可重用性

例:

sequence s5a;
a ##2 b;
endsequence
property p5a;
    @(posedge clk) s6a;
endproperty 
a5a: assert property(p5a);

4.3 内建的系统函数

$onehot(experssion) 检验表达式满足one-hot 即只有一位有效

$onehot0(expression) 检验表达式满足只有一位或没有有效的

$isunknown(expression) 检验表达式是否为x或z

$countones(expression); 计算向量中为1的个数,当使用disable iff(!rst_n) 时在rst_n 为低电平时,将默认不检测

4.4 形参传递

可以将property 使用同的参数进行例化

例:

property arb(a,b,c,d);

    @(posedge clk) ($fell(a) ##[2:5] $fell(b))|->##1 ($fell(c)&&fell(d))/
##0(!c&&!d)[*4] ##1 (c&&d) ##1 b;

endproperty

调用时:

assert property(arb(a1,b1,c1,d1));

4.5 蕴含中使用if else

使用蕴含时可以使用if else进行条件分支处理

例:

property p_if_esle;
    @(psoedge clk)
    ($fell(start) ##1 (a||b) |-> 
       if(a)
         (c[->2] ##1 e)
        else 
         (d[->2] ##1 f);
endproperty
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: SVA (SystemVerilog Assertions)是一种用于验证硬件设计的语言扩展,其中包括属性(property)的定义和使用。属性是一种描述设计行为的语句,可以用于检查设计是否满足特定的规范或约束。 在SVA中,属性可以使用蕴含(implication)结构来定义。蕴含结构由先行算子(antecedent)和后续算子(consequent)组成,先行算子是约束条件,只有约束条件成功时,后续算子才会被计算。蕴含结构可以分为交叠蕴含和非交叠蕴含两种形式。 交叠蕴含使用符号"|->"表示,表示如果先行算子匹配,在固定个时钟周期后计算后续算子表达式。例如,在每个时钟上升沿,检查信号a是否为高电平,如果a为高,那么b在接下来两个时钟沿后也必须为高。\[2\] 非交叠蕴含使用符号"|=>"表示,表示如果先行算子匹配,在下一个时钟周期计算后续算子表达式。例如,在每个时钟上升沿,检查信号a是否为高电平,如果a为高,那么b在下一个时钟沿也必须为高。\[3\] 通过使用蕴含结构,我们可以在属性定义中指定约束条件和期望的行为,以便进行设计验证。 #### 引用[.reference_title] - *1* *2* *3* [SVA介绍----蕴含操作符](https://blog.csdn.net/qq_39556143/article/details/94591578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值