SVA描述(一)
SystemVerilog Assertion(SVA):是一种描述性的语言,可以很容易的描述时序相关的情况,所以主要用在协议检查和协议覆盖。SVA在systemverilog仿真器中的
调度区间在RTL之后,Testbench之前。所以同一时钟断言只能采样到上一时刻的RTL值。由于是描述性语句,所以“;”用的比较多。
断言失败后会自动打印信息到log文件,用户也可以自定义打印内容。
assertion name: assert xxxx
$display("xxxxx");
else
$display("xxxxx");
SVA分为并发断言:基于时钟的,调度区间按assertion的调度区间,可以在过程块(always initial),模块(module),接口(interface),程序(program)中定义。
即时断言:基于事件的,本质不是时序关系,会立刻求值。进行检查。只能在过程块(always initial)中定义。
两者另一个区别是:并发断言会用property来声明,即时断言不需要。
always
begin
a_ia: assert (a && b); //即时断言
end
因为并发断言应用更多,所以一下均以并发断言来说:
并发断言可以自定义一个SVA块来描述自己要求的时序,两个关键字:sequence, property。
sequence s1; //sequence允许自己定义更小的时钟描述
a ##2 b;
endsequence
property s2; //property 一个assert只能有一个
@(posedg clk) s1;
endproperty
s3 :assert property(s2); //标准形式 name : assert property();
断言中内嵌的表示信号的上升沿和下降沿的函数:$rose(expression or signal) $fell(expression or signal) $stable(expression or signal) $changed(expression)
sequence s2;
@(posedge clk) $rose(a); //时钟的上升沿仍然用posedge, 信号的上升沿才用$rose();
endsequence
断言中时序延时的描述: ##表示延时,但是注意触发加.ended,否则SVA默认都是按起始时刻来对齐的,也就是说如果断言3时刻触发,5时刻succeed,但是断言
也是会报道3时刻的对错。
sequence s2;
@(posedge clk) a ##2 b; //a为高电平延时2个时钟后如果b为高电平,则断言成功。
endsequence
property p12;
@(posedge clk) (a && b) |-> ##[1:3] c; //相当于(a && b) |-> ##1 c; 或 (a && b) |-> ##2 c; (a && b) |-> ##3 c;
endproperty
断言中时钟的定义:一般情况下,在property中定义时钟,而保证sequence独立于时钟比较好。当然从语法角度来说,时钟可以定义在property,sequence,assert
中。但是当assert定义时钟之后,property不能再重新定义时钟。
sequence s5a;
a ##2 b;
endsequence
property p5a;
@(posedge clk) s5a; //在property中定义时钟
endproperty
a5a: assert property(p5a); //assert不再定义时钟
断言通过蕴含操作符来作为断言的触发条件,交叠蕴含: “|->”来表示,表示在先行算子(蕴含前的表达式)有效的同一个时刻判断后续算子(蕴含后的表达式)。
非交叠蕴含: “|=>”来表示,表示在先行算子有效的下一时刻再判断后续算子。
property p8; property p9;
@(posedge clk) a |-> b; //同一时刻 @(posedge clk) a |=> b; //延时一个时钟
endproperty endproperty
##m延时m个clock:
[*n]重复n次:
assert property (@posedge clk) rst[*2]; end property //最开始的clock连续重复两个cycle rst
[=m]重复m次,不要求连续
[->m]重复m次,与[=m]的主要区别是,在后边加延时##1时,[=m]不准确表示延时1个clock
[->m]表示准确延时1个clock
sig1 throughout seq:throughout之前表示一个expression,之后表示一个sequence,在sequence期间,expression一直有效。
seq1 within seq2:within前后都表示sequence,在后一sequence有效期间,sequence1必须一直有效。
seq1 and seq2:两个sequence进行与运算,两个sequence必须同时start,但是不要求同时结束。
seq1 or seq2:两个sequence进行或运算,只要有一个sequence有效,该语句有效。
seq1 intersect seq2,两个seq必须完全同时开始,同时结束,同时有效。
not seq1:表示对seq的结果取反
if(expression) seq1 else seq2:if---else语句控制,但是好像不能用在local var的场景中。


sva提供的system task:
1)$onehot(expression),在expression中只有一个1或者没有1时,表示结果正确
2)$isunknown(expression),在expression中包含x、z时,表示结果正确
3)$countones(expression),返回expression中1的个数, ones=$countones(busgnt)
4)$assertoff(level, list of module) $asserton $assertkill
sva中可以定义local var,
赋值与比较,前都必须有一个sequence,或者显示指明1’b1
sequence rdc;
##[1:5] rdDone;
endsequence
sequence datacheck;
int local_data;
(rdc, local_data = rData) ##5 (wData == (local_data + 'hff));
endseqence
baseP:assert property (@(posedge clk) RdWr |-> dataCheck) else gotoFail;
sequence s1;
int x;
((1'b1, x = data) ##0 ((a ##1 b) or (d ##1 e) ) ##1 (data1 == x+1);
endsequence
延时中不可以使用参数,变量定义时,不能用参数,因为变量在elabration时,需要使用
property checkDelay;
int lv;
(readReq, lv=dataDelay) |=> ##[0:lv] readData; (错误)
endproperty
endsequence
SVA描述(一)的更多相关文章
- [内核笔记1]内核文件结构与缓存——inode和对应描述
由来:公司内部外网记录日志的方式现在都是通过Nginx模块收到数据发送到系统消息队列,然后由另外一个进程来从消息队列读取然后写回磁盘这样的操作,尽量的减少Nginx的阻塞. 但是由于System/V消 ...
- PhpStorm和WAMP配置调试参数,问题描述Error. Interpreter is not specified or invalid. Press “Fix” to edit your project configuration.
PhpStorm和WAMP配置调试参数 问题描述: Error. Interpreter is not specified or invalid. Press “Fix” to edit your p ...
- 杂项之python描述符协议
杂项之python描述符协议 本节内容 由来 描述符协议概念 类的静态方法及类方法实现原理 类作为装饰器使用 1. 由来 闲来无事去看了看django中的内置分页方法,发现里面用到了类作为装饰器来使用 ...
- ASP.NET MVC 描述类型(二)
ASP.NET MVC 描述类型(二) 前言 上个篇幅中说到ControllerDescriptor类型的由来过程,对于ControllerDescriptor类型来言ActionDescriptor ...
- ASP.NET MVC 描述类型(一)
ASP.NET MVC 描述类型(一) 前言 在前面的好多篇幅中都有提到过ControllerDescriptor类型,并且在ASP.NET MVC 过滤器(一)篇幅中简单的描述过,今天我们就来讲一下 ...
- python描述符理解
Python中的描述符是一个相对底层的概念 descriptor Any object which defines the methods get(), set(), or delete(). Whe ...
- 网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述
上一篇文章网站实现微信登录之嵌入二维码中描述了如何在自己的登录页面内嵌入登录二维码,今天的这篇文章主要是描述下在扫码成功之后微信重定向回网站后登录逻辑的处理,其实也就是验证身份信息,授权用户登录的逻辑 ...
- 网站实现微信登录之嵌入二维码——基于yii2开发的描述
之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...
- 深入学习jQuery描述文本内容的3个方法
× 目录 [1]html() [2]text() [3]val()[4]总结 前面的话 在javascript中,描述元素内容有5个属性,分别是innerHTML.outerHTML.innerTex ...
随机推荐
- ACE学习简单记录
一.ACE_Reactor的使用方法 1.创建ACE_Event_Handler的派生类. class MyHandler : public ACE_Event_Handler { public: M ...
- VC/MFC程序开启关闭和打开自己或其他软件,更改窗口类
一. 关闭自身软件 直接在需要关闭的位置输入 HANDLE hself = GetCurrentProcess(); TerminateProcess(hself, 0); 二.关闭其他软件 流程: ...
- Unity3D笔记 愤怒的小鸟<六> 弹弓发射小鸟
要实现的目标 实现个性化的鼠标 实现弹弓 选择小鸟.拉升弹弓.发射小鸟 弹弓橡皮筋 声音 1.实现个性化鼠标 效果 2.添加弹弓 建立两个材质 创建一个空GameObject 把两个shoot拖进来统 ...
- Logstash在Linux上安装部署
Logstash 简介: Logstash 是一个实时数据收集引擎,可收集各类型数据并对其进行分析,过滤和归纳.按照自己条件分析过滤出符合数据导入到可视化界面.它可以实现多样化的数据源数据全量或增量传 ...
- BAT等大厂已开源的70个实用工具盘点(附下载地址)
前面的一篇文章<微软.谷歌.亚马逊.Facebook等硅谷大厂91个开源软件盘点(附下载地址)>列举了国外8个互联网公司(包括微软.Google.亚马逊.IBM.Facebook.Twit ...
- Mapreduce 原理及程序分析
1.MapReduce(Map+Reduce) 提出一个问题: 目标:你想数出一摞牌中有多少张黑桃. 直观方式:一张一张检查并且数出有多少张是黑桃数目 MapReduce方法则是: 给在座的所有玩家中 ...
- CCCC训练赛一些模板 struct sstream
重载与构造 struct node { friend bool operator< (node n1, node n2) { return n1.priority > n2.priorit ...
- MySQL ·InnoDB 文件系统之文件物理结构
从上层的角度来看,InnoDB层的文件,除了redo日志外,基本上具有相当统一的结构,都是固定block大小,普遍使用的btree结构来管理数据.只是针对不同的block的应用场景会分配不同的页类型. ...
- inaccessible
$w = (object)array('key0'=>'a','key1'=>'b',0,1,2,0=>'0w',1=>'1w','11'=>'11str'); var_ ...
- sum统计某字段满足某种条件的记录数
(1)count来查询: 查询 lw_devices_type_relation 表中满足is_standard为1的数量. (2)sum来查询: ) from lw_devices_type_rel ...