systemverilog断言快速教学教材.doc

上传人:小** 文档编号:2081602 上传时间:2019-04-18 格式:DOC 页数:8 大小:32.94KB
下载 相关 举报
systemverilog断言快速教学教材.doc_第1页
第1页 / 共8页
systemverilog断言快速教学教材.doc_第2页
第2页 / 共8页
systemverilog断言快速教学教材.doc_第3页
第3页 / 共8页
systemverilog断言快速教学教材.doc_第4页
第4页 / 共8页
systemverilog断言快速教学教材.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、-_Bind: very useful in systemverilog.Assertion: 1# “a #3 b”意思是 a 之后 3 个周期 b.2“|-”表示如果先行算子匹配,后序算子在同一周期开始计算3“|=” 表示如果先行算子匹配,后序算子在下一个周期开始计算4重复操作符:* 连续重复 “*m”: “a*1:3” 表示 a 被连续重复 13 次* 跳转重复 “-”: “a-3” 表示 a 被跳转重复 3 次* 非连续重复 “=m”: “a=3” 表示 a 被非连续重复 3 次芯片设计:verilog 断言( SVA)语法断言 assertion被放在 verilog设计中,方便在仿

2、真时查看异常情况。当异常出现时,断言会报警。一般在数字电路设计中都要加入断言,断言占整个设计的比例应不少于 30%。以下是断言的语法:1. SVA的插入位置:在一个.v 文件中:module ABC ();rtl 代码SVA断言endmodule注意:不要将 SVA写在 enmodule外面。2. 断言编写的一般格式是:【例】 断言名称 1:assert property(事件 1) /没有分号$display(“.“,$time); /有分号else$display(“.“,$time); /有分号断言名称 2:assert property(事件 2)$display(“.“,$time)

3、;else$display(“.“,$time);-_断言的目的是:断定“事件 1”和“事件 2”会发生,如果发生了,就记录为 pass,如果没发生,就记录为 fail。注意:上例中没有 if,只有 else,断言本身就充当 if的作用。上例中,事件 1和事件 2可以用两种方式来写:(1) 序列块: sequence name;。; endsequence(2) 属性块: property name;。;endsequence从定义来讲,sequence 块用于定义一个事件(砖),而 property块用于将事件组织起来,形成更复杂的一个过程(楼)。sequence 块的内容不能为空,你写乱字

4、符都行,但不能什么都没有。sequence 也可以包含另一个 sequence, 如:sequence s1;s2(a,b);endsequence /s1和 s2都是 sequence块sequence块和 property块都有 name,使用 assert调用时都是:“assert property(name);”在 SVA中,sequence 块一般用来定义组合逻辑断言,而 property一般用来定义一个有时间观念的断言,它会常常调用 sequence,一些时序操作如“|-” 只能用于 property就是这个原因。注:以下介绍的 SVA语法,既可以写在 sequence中,也可以写

5、在 property中,语法是通用的。3. 带参数的 property、带参数的 sequenceproperty也可以带参数,参数可以是事件或信号,调用时写成:assert property (p1(a,b)被主 sequence调用的从 sequence也能带参数,例如从 sequence名字叫 s2,主 sequence名字叫 s1:sequence s1;s2(a,b);endsequence4. property内部可以定义局部变量,像正常的程序一样。-_property p1;int cnt;.endproperty【注】在介绍语法之前,先强调写断言的一般格式:一般,断言是基于时序

6、逻辑的,单纯进行组合逻辑的断言很少见,因为太费内存(时序逻辑是每个时钟周期判断一次,而组合逻辑却是每个时钟周期内判断多次,内存吃不消)。因此,写断言的一般规则是: time + event,要断定发生什么 event,首先要指定发生event的时间,例如每个时钟上升沿 + 发生某事某信号下降时 + 发生某事5. 语法 1:信号(或事件)间的“组合逻辑” 关系:(1) 常见的有: 当 clk上升沿时,如果发生 A事件,断言将报警。边沿触发内置函数:(假设存在一个信号 a)$rose( a ); 信号上升$fell( a ); 信号下降$stable( a ); 信号值不变7. 语法 3:在“时序

7、逻辑” 中判断多个事件 /信号的行为关系:(1) intersect(a,b) 断定 a和 b两个事件同时产生,且同时结束。(2) a within b 断定 b事件发生的时间段里包含 a事件发生的时间段。(3) a #2 b 断定 a事件发生后 2个单位时间内 b事件一定会发生。a #1:3 b 断定 a事件发生后 13个单位时间内 b事件一定会发生。a #3:$ b 断定 a事件发生后 3个周期时间后 b事件一定会发生。(4) c throughout (a #2 b) 断定在 a事件成立到 b事件成立的过程中,c事件“一直”成立。-_(5) (posedge clk) a |- b 断定

8、 clk上升沿后,a 事件“开始发生” ,同时,b事件发生。(6) (posedge clk) a.end |- b 断定 clk上升沿后,a 事件执行了一段时间“结束” 后,同时,b 事件发生。注:“a |- b“ 在逻辑上是一个判断句式,即:if ab;elsesucceed;因此,一旦 a 发生,b 必须发生,断言才成功。如果 a没发生,走 else,同样成功。 (7) (posedge clk) a |= b 断定 clk上升沿后,a 事件开始发生,下一个时钟沿后,b 事件开始发生。 (8) (posedge clk) a |=#2b 断定 clk上升沿后,a 事件开始发生,下三个时钟

9、沿后,b 事件开始发生。(9) (posedge clk) $past(a,2) = 1b1 断定 a信号在 2个时钟周期“以前” ,其电平值是 1。(10) (posedge clk) a *3 断定“ (posedge clk) a” 在连续 3个时钟周期内都成立。 (posedge clk) a *1:3 断定“ (posedge clk) a” 在连续 13个时钟周期内都成立。 (posedge clk) a -3 断定“ (posedge clk) a” 在非连续的 3个时钟周期内都成立。举一个复杂点的例子:property ABC;int tmp;(posedge clk) ($r

10、ose(a),tmp = b) |- #4 (c = (tmp*tmp+1) #3 d*3;endproperty 上例的一个 property说明:当 clk上升沿时,断言开始。首先断定信号 a由低变高,将此时的信号 b的值赋给变量 tmp,4 个时钟周期后,断定信号 c的值是 4个周期前 b2+1,再过3个周期,断定信号 d一定会起来,再过 3个周期,信号 d又起来一次。只有这些断定都成功,该句断言成功。otherwise,信号 a从一开始就没起来,则断言也成功。-_8. 语法 4:多时钟域联合断言:一句断言可以表示多个时钟域的信号关系,例如: (posedge clk1) a |- #1

11、 (posedge clk2) b当 clk1上升沿时,事件 a发生,紧接着如果过来第二个时钟 clk2的上升沿,则 b发生。“#1”在跨时钟时不表示一个时钟周期,只表示等待最近的一个跨时钟事件。所以此处不能写成#2 或其他。但是可以写成: (posedge clk1) a |= (posedge clk2) b9. 语法 5:总线的断言函数总线就是好多根 bit线,共同表示一个数。SVA 提供了多 bit状态一起判断的函数,即总线断言函数:(1) $onehot(BUS) BUS中有且仅有 1 bit是高,其他是低。(2) $onehot0(BUS) BUS中有不超过 1 bit是高,也允许

12、全 0。(3) $isunknown(BUS) BUS中存在高阻态或未知态。(4) countones(BUS)=n BUS中有且仅有 n bits是高,其他是低。10. 语法 6:屏蔽不定态当信号被断言时,如果信号是未复位的不定态,不管怎么断言,都会报告:“断言失败” ,为了在不定态不报告问题,在断言时可以屏蔽。如: (posedge clk) (q = $past(d),当未复位时报错,屏蔽方法是将该句改写为:(posedge clk) disable iff (!rst_n) (q = $past(d) /rst是低电平有效10. 语法 6:断言覆盖率检测:name: cover pro

13、perty (func_name)11. 在 modelsim中开启断言编译和显示功能:(1)【编译 verilog代码时按照 system verilog进行编译】 vlog -sv abc.v(2)【仿真命令加一个-assertdebug】 vsim -assertdebug -novopt testbench(3)【如果想看断言成功与否的分析,使用打开断言窗口的命令】 view assertions12. 在 VCS中加入断言编译和显示功能:在 fsdb文件中加一句话:$fsdbDumpSVA-_在 VCS编译参数:system “vcs $VCS_SIMULATION“ 中加入一些 o

14、ptions:-assert enable_diag-assert vpiSeqBeginTime-assert vpiSeqFail-assert report=路径-assert finish_maxfail=100*【经验】以下是一些编写断言的经验:1. 断言的目的:传统的验证方法是通过加激励,观察输出。这种方法对案例的依赖严重,案例设计不好,问题不便于暴露。而断言是伴随 RTL代码的,不依赖测试案例,而是相对“静态” 。例如:我们要测试一个串行数据读写单元,数据线只有一根,先传四位地址,再传数据。(1)案例验证法:写一个地址,再写一段数据,然后读取该地址,看输出的是不是刚才写的数据。(

15、2)断言法:不需要专门设计地址和数据,当发起写时,在地址传输的时间里将地址存储到一个变量里,在数据传输的时间里将数据存储到一个变量里,观察 RAM中该地址是否存在该数据就可以了。断言设计相当于在电脑上把 RTL实现的功能再实现一遍。2. 断言中可以包含 function和 task。而且 function经常用于断言,因为有的处理很复杂,而断言又是“一句式 ”的,无法分成好几句进行表达,所以需要 function替断言分担工作。3. 断言允许规定同时发生的事件,就是组合逻辑,你可以写成:a ”针对上述几点,举一个复杂的例子:断言 wr的功能是检查串行地址输入是否正确,串行地址输入线是 Data

16、In 。$time 返回值以0.1ns为单位(因为我在 testbench中的单位规定是timescale 1ns/100ps,精度是 100ps = 0.1ns),所以$time/10 才是 ns。/wr: assert property(wr_p)$display(“succeed:“,$time/10);else$display(“error: “,$time/10);/断言可以声明一个 int数组 arr4,/“(posedge clk) !vld_pulse_r0 ”就是 junction调用。property wr_p;int arr4;(posedge clk) !vld_pulse_r0 -_endproperty/function 3:0 junc;input a,b,c,d;reg 3:0 a1;reg 3:0 b1;reg 3:0 c1;reg 3:0 d1;a1 = 3b0,a;b1 = 3b0,b;c1 = 3b0,c;d1 = 3b0,d;junc = a1+(b1 rd_ept)endproperty是错误的,写了|-,就不能再用 & 等事件组合逻辑了。解决方法是使用 2个断言,没更好的方法。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。