SystemVerilog断言及其应用
SystemVerilog

SystemVerilog 语言简介 SystemVerilog 是一种硬件描述和验证语言(HDVL),它基于 IEEE 1364-2001 Verilog 硬件描述语言 (HDL) 并对其进行了扩展, , 包括扩充了 C 语言数据类型、结构、压缩和非压缩数组、 接口、断 言等等, 这些都使得 SystemVerilog 在一个更高的抽象层次上提高了 设计建模的能力。
SystemVerilog 由 Accellera 开发,它主要定位在 芯片的实现和验证流程上, 并为系统级的设计流程提供了强大的连接 能力。
下面我们从几个方面对 SystemVerilog 所作的增强进行简要的 介绍, 期望能够通过这个介绍使大家对 SystemVerilog 有一个概括性 的了解。
1. 接口(Interface) Verilog 模块之间的连接是通过模块端口进行的。
为了给组成设 计的各个模块定义端口, 我们必须对期望的硬件设计有一个详细的认 识。
不幸的是,在设计的早期,我们很难把握设计的细节。
而且,一 旦模块的端口定义完成后,我们也很难改变端口的配置。
另外,一个 设计中的许多模块往往具有相同的端口定义,在 Verilog 中,我们必 须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。
SystemVerilog 提供了一个新的、高层抽象的模块连接,这个连 接被称为接口(Interface)。
接口在关键字 interface 和 endinterface 之间定义,它独立于模块。
接口在模块中就像一个单一的端口一样使 用。
在最简单的形式下,一个接口可以认为是一组线网。
例如,可以 将 PCI 总线的所有信号绑定在一起组成一个接口。
通过使用接口, 我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。
随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信 号也会很容易地表示出来。
当接口发生变化时,这些变化也会在使用 该接口的所有模块中反映出来,而无需更改每一个模块。
SystemVerilog断言学习笔记复习过程

S y s t e m V e r i l o g断言学习笔记SystemVerilog断言学习笔记1一、前言随着数字电路规模越来越大、设计越来越复杂,使得对设计的功能验证越来越重要。
首先,我们要明白为什么要对设计进行验证?验证有什么作用?例如,在用FPGA进行设计时,我们并不能确保设计出来的东西没有功能上的漏洞,因此在设计后我们都会对其进行验证仿真。
换句话说,验证的目的是彻底地验证被测设计以确保设计没有功能上的缺陷。
而即将介绍的SystemVerilog断言便是一门重要的验证技术,它可以尽早发现设计的缺陷以及提高验证的效率。
二、基本概念1、什么是断言断言是设计属性的描述。
而断言可以从设计的功能描述中推知,然后转换成断言。
那么断言是如何表现的呢?当一个被检查的属性不像我们期望的那样表现时,则该断言失败;当一个禁止在设计中出现的属性发生时,则该断言失败。
2、为什么要使用SystemVerilog断言Verilog HDL也能实现断言,但其存在不足之处:•Verilog HDL是一种过程语言,不能很好地控制时序;•Verilog HDL是一种冗长的语言,随着断言数量的增加,维护代码将变得很困难;•语言的过程性使得测试同一时间段内发生的并行事件相当困难;•Verilog HDL没有提供内嵌的机制来提供功能覆盖的数据。
而SystemVerilog断言具有如下特征:•它是一种描述性语言,可以完美描述时序的状况;•语言本身非常精确且易于维护;•语言的描述性提供了对时间卓越的控制;•它提供了若干个内嵌函数来测试特定的设计情况,并且提供了一些构造来自动收集功能覆盖数据。
可见,使用SystemVerilog断言具有非常大的优势。
三、验证平台一个包含SystemVerilog断言的验证环境如下图所示:注:约束随机测试平台可以用来产生更多真实的验证情景;代码覆盖则是验证完整性的基本衡量标准。
一般情况下,测试平台需要做三件事:•产生激励;•自检机制;•衡量功能覆盖。
验证--断言

• $countones ( expression) 统计1数目
计算向量中为高的位的数量
Байду номын сангаас
$past获取几个周期之前的值
格式: – $past (signal_name, number of clock cycles) – $past( expression1 [, number_of_ticks] [, expression2] [, clocking_event])
即时断言的特点:
基于模拟时间的语句 立即求值,和时序无关 必须放在过程块中,比如task,function,initial或者always块 只能用于动态模拟
例子:
断言的名称(assert_foo) 可以用%m来引用
always_comb begin assert_foo : assert(foo) $display("%m passed"); else $display("%m failed"); end 或者:assert (myfunc(a,b)) count1 = count + 1; else ->event1 或者:assert (y == 0) else flag = 1;
Backus-Naur Form (BNF)格式
关键字红色粗体 | 只能选其一 []可选项 {} 可重复0或者多个
##2 延时周期 sequence_expr ::= cycle_delay_range sequence_expr { cycle_delay_range sequence_expr } | sequence_expr cycle_delay_range sequence_expr { cycle_delay_range sequence_expr } | expression_or_dist [ boolean_abbrev ] | ( expression_or_dist {, sequence_match_item } ) [ boolean_abbrev ] | sequence_instance [ sequence_abbrev ] sequence_abbrev ::= | ( sequence_expr {, sequence_match_item } ) [ sequence_abbrev ] consecutive_repetition | sequence_expr and sequence_expr sequence_match_item ::= | sequence_expr intersect sequence_expr operator_assignment | sequence_expr or sequence_expr | inc_or_dec_expression | first_match ( sequence_expr {, sequence_match_item} ) | subroutine_call | expression_or_dist throughout sequence_expr | sequence_expr within sequence_expr = | += | -= | *= | /= | %= | &= | |= | ^= | <<= | >>= | <<<= | >>>= | clocking_event sequence_expr
systemverilog_断言_快速教程

Bind: very useful in systemverilog.Assertion:1.## “a ##3 b”意思是a 之后3个周期b….2.“|->”表示如果先行算子匹配,后序算子在同一周期开始计算3.“|=>”表示如果先行算子匹配,后序算子在下一个周期开始计算4.重复操作符:* 连续重复“[*m]”: “a[*1:3]”表示a被连续重复1~3次** 跳转重复“[->]”: “a[->3]”表示a被跳转重复3次*** 非连续重复“[=m]”: “a[=3]”表示a被非连续重复3次芯片设计:verilog断言(SVA)语法断言assertion被放在verilog设计中,方便在仿真时查看异常情况。
当异常出现时,断言会报警。
一般在数字电路设计中都要加入断言,断言占整个设计的比例应不少于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);else$display("........",$time);断言的目的是:断定“事件1”和“事件2”会发生,如果发生了,就记录为pass,如果没发生,就记录为fail。
注意:上例中没有if,只有else,断言本身就充当if的作用。
上例中,事件1和事件2可以用两种方式来写:(1) 序列块: sequence name;。
systemverilog_断言_快速教程

systemverilog_断言_快速教程Bind: very useful in systemverilog.Assertion:1.## “a ##3 b”意思是a 之后3个周期b….2.“|->”表示如果先行算子匹配,后序算子在同一周期开始计算3.“|=>”表示如果先行算子匹配,后序算子在下一个周期开始计算4.重复操作符:* 连续重复“[*m]”:“a[*1:3]”表示a被连续重复1~3次** 跳转重复“[->]”: “a[->3]”表示a被跳转重复3次*** 非连续重复“[=m]”: “a[=3]”表示a被非连续重复3次芯片设计:verilog断言(SVA)语法断言assertion被放在verilog设计中,方便在仿真时查看异常情况。
当异常出现时,断言会报警。
一般在数字电路设计中都要加入断言,断言占整个设计的比例应不少于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);else$display("........",$time);断言的目的是:断定“事件1”和“事件2”会发生,如果发生了,就记录为pass,如果没发生,就记录为fail。
注意:上例中没有if,只有else,断言本身就充当if的作用。
上例中,事件1和事件2可以用两种方式来写:(1) 序列块: sequence name;。
SystemVerilog断言及其应用

SystemVerilog断言及其应用神州龙芯集成电路设计公司陈先勇 徐伟俊 杨鑫 夏宇闻[摘要]:在介绍SystemVerilog断言的概念、使用断言的好处、断言的分类、断言的组成以及断言如何被插入到被测设计(DUT)的基础上,本文详细地介绍了如何使用不同的断言语句对信号之间的复杂时序关系进行严格的检查,并针对每个例子展示了在ModelSim 6.1b仿真环境中所显示的波形。
本文旨在帮助读者理解如何使用断言对设计中信号间复杂时序关系进行验证的方法,并由此介绍一些基本的SystemVerilog断言、操作符、代码段和断言验证方法学。
关键字:SystemVerilog,断言, DUT, SVA,Assertion1.前言当今,数字电路的规模和复杂度在不断增长,这使得对设计进行彻底的验证将成为一项巨大的挑战。
在整个芯片设计过程中,验证工作所需的时间将占去设计周期的70%~80%,验证工程师的人数将是设计工程师的两倍。
这就迫切需要提高验证工作的效率,以解决验证瓶颈问题。
传统上,对被测设计(DUT)的验证都是通过在DUT的输入端口加上具有特定时序激励,然后观察DUT的内部状态变化和最后的输出信号,以确定DUT工作是否正确。
这种方法对简单的小规模的设计很有用。
但当设计规模变大时,要想使用这种方法来验证DUT是不现实的。
因为对于规模大的设计,要想遍历设计将遇到的各种情况,验证其正确性,需要成千上万的特定时序激励。
并且如果设计稍有一点变动,这些时序激励就得重新编写。
设计的复杂性迫使验证工程师使用随机测试平台来生成更多的验证激励。
高级验证语言,如OVA,PSL等,便在创建复杂测试平台时得到了广泛的应用。
但这些验证语言和RTL级的编码语言不一致,使得验证很容易出现错误,造成调试工作的不方便。
SystemVerilog的出现可以解决这些问题。
SystemVerilog是在Verilog语言的基础上发展而来的,用SystemVerilog语言可以很容易地生成复杂的随机测试激励,并能方便地编写断言和测试代码覆盖率的代码。
systemverilog类的方法

systemverilog类的方法【最新版3篇】目录(篇1)一、SystemVerilog 类的方法概述二、SystemVerilog 类的方法分类1.构造函数和析构函数2.普通方法3.静态方法4.类方法三、SystemVerilog 类的方法的应用实例四、SystemVerilog 类的方法的优势与局限性正文(篇1)SystemVerilog 类的方法是指在 SystemVerilog 语言中,类所具有的操作和功能。
这些方法和其他编程语言中的类方法类似,可以用来描述类的状态、行为和属性。
SystemVerilog 类的方法可以分为以下几类:一、构造函数和析构函数构造函数是在创建类的实例时调用的方法,用于初始化类的属性。
析构函数则是在类的实例被销毁时调用的方法,用于清理类的资源。
二、普通方法普通方法是指类的实例可以直接调用的方法,可以用来操作类的属性和其他方法。
普通方法可以分为静态方法和类方法。
1.静态方法静态方法是指可以直接通过类名调用的方法,不需要创建类的实例。
静态方法主要用于操作类的静态属性和静态方法。
2.类方法类方法是指通过对象调用的方法,需要先创建类的实例。
类方法主要用于操作类的实例属性和实例方法。
三、SystemVerilog 类的方法的应用实例在 SystemVerilog 中,类的方法可以用于实现各种功能,例如创建对象、操作对象的属性和调用对象的方法。
下面是一个简单的实例:```class my_class extends virtual class {virtual my_class(int a, int b);virtual void display();virtual int get_a();virtual void set_a(int a);virtual int get_b();virtual void set_b(int b);};class my_class_impl extends my_class {int a, b;my_class_impl(int a, int b) : a(a), b(b) {}void display() {std::cout << "a = " << a << ", b = " << b << std::endl;}int get_a() {return a;}void set_a(int a) {this->a = a;}int get_b() {return b;}void set_b(int b) {this->b = b;}};int main() {my_class obj(10, 20);obj.display();obj.set_a(30);obj.set_b(40);std::cout << "a = " << obj.get_a() << ", b = " << obj.get_b() << std::endl;return 0;}```四、SystemVerilog 类的方法的优势与局限性SystemVerilog 类的方法具有代码可重用性、模块化程度高、易于维护等优势,可以提高代码的可读性和可维护性。
systemverilog 语法

systemverilog 语法SystemVerilog是一个硬件描述语言(HDL),它具有一些基本语法结构,与其他编程语言并无差异。
本文将介绍常见的SystemVerilog 语法。
1. 模块声明SystemVerilog使用模块来描述电路的结构,其中包含了输入端口、输出端口以及内部信号。
下面是一个简单的模块声明示例:module my_module(input input_port, output output_port);// Verilog代码在这里endmodule2. 变量声明变量可分为多种类型:- 整型变量(int):用于整数值。
- 浮点型变量(real):用于浮点值。
- 位变量(bit):只能存储0和1。
- 向量型变量(vector):用于存储多位的值。
下面是声明一个整型变量的示例:int my_variable;3. Control FlowSystemVerilog支持条件和循环语句,使得描述一些分支判断或循环的电路的时候变得更加直观。
- if/else语句:if语句用于条件分支,else语句用于指定当条件不满足时的操作。
下面是if/else语句的基本形式:if (condition) begin// 操作一endelse begin// 操作二end- for循环:for循环让您可以重复执行某些操作,直到满足指定的条件。
下面是for循环语句的一般形式:for(initialization, condition, increment) begin// 操作end其中,初始化指定循环计数器的值,条件指定循环何时结束,增量指定每次循环计数器自增的值。
4. 综合测试(assertions)综合测试是一种在设计中添加的指令,通过检查某些条件是否满足来确保设计的正确性。
可以使用综合测试指令对电路进行严格测试。
下面是一个简单的综合测试指令:assert(signal1 == signal2) else $display("Error");这里的断言语句表示,如果信号signal1不等于信号signal2,则显示错误消息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SystemVeri log断言及其应用
神州龙芯集成电路设计公司
陈先勇 徐伟俊杨鑫夏宇闻
摘要:在介绍Systemgerilog断言的概念、使用断言的好处、断言的分类、断言的组成以及断言如何 被插入到被测设计(DUT)的基础上,本文详细地介绍了如何使用不同的断言语句对信号之间的复杂
图3
在sclk(0)处,仿真刚开始,a还没有被赋值,为 不定态x,所以在sclk(0)处,断言失败。在sclk(1)处, 采样当a为0,断言失败。在其余时钟上升沿处,分 析方法类似。最后断言在第0、1、2、7、12、13、14个时 钟上升沿失败,在其余时钟上升沿成功。
我们除了可以使用仿真环境默认的断言错误提 示信息外,还可以在断言中添加自己的提示信息,如
。
例4所示。 例4:
sequence s l—s;
@(posedge sc收)a;
endsequence
al—a.assert property(s 1一S)- ¥display(“assertion success”,¥time)
eIse
¥display(“assertion faild”,Stime);
DUT工作是否正确。这种方法对简单的小规模的设 计很有用。但当设计规模变大时,要想使用这种方法 来验证DUT是不现实的。因为对于规模大的设计, 要想遍历设计将遇到的各种情况,验证其正确性,需 要成千上万的特定时序激励。并且如果设计稍有一 点变动,这些时序激励就得重新编写。设计的复杂性 迫使验证工程师使用随机测试平台来生成更多的验 证激励。高级验证语言,如OVA,PSL等,便在创建 复杂测试平台时得到了广泛的应用。但这些验证语
比如要验证这样一个属性:“当信号a在某一 个时钟周期为高电平时,那么在接下来的2~4个时 钟周期内,信号b应该为高电平”。用Verilog语言 描述这样一个属性需要一大段代码,而用SVA描述 就只需要几行代码。下面的代码为SVA。 例l:
property a2b—p;
@(posedge sclk)¥rose(a)I->[2:4]Srose(b); endproperty a2b—a:assert property(a2b—p); a2b—c:coveF property(a2b—p);
SystemVerilog的出现可以解决这些问题。Sys— temVerilog是在Verilog语言的基础上发展而来的, 用SystemVerilog语言可以很容易地生成复杂的随 机测试激励,并能方便地编写断言和测试代码覆盖 率的代码。断言在验证过程中的用途如图1所示。
传统上,对被测设计(DUT)的验证都是通过在 DUT的输入端口加上具有特定时序激励,然后观察 DUT的内部状态变化和最后的输出信号,以确定
●¥rose(布尔表达式或信号名) 当信号/表达式的最低位由0或x变为1时返 回真值。 ●Sfell(布尔表达式或信号名) 当信号/表达式的最低位由1变为0或X时返 回真值。 ●Sstable(布尔表达式或信号名) 当信号/表达式的最低位不发生变化时返回真 值。 例6:
endsequence
al—a:assert property(s1一s); cl_c:cover property(s1一s); 其检查波形和断言出错信息,如图3所示。
3.2断言的组成和建立过程 任何复杂的时序模型,其功能总是由多 个逻辑事件的组合来表示的。这些事件可以 是简单的同一时钟沿被求值的布尔表达式,也可以 是经过几个时钟周期求值计算得到的事件。SVA使 用关键字sequence(序列)来表示这些事件。许多序 列可以被有序地组合起来形成设计的属性,SVA用 关键字property来表示属性。最后属性要在断言中 被调用才能真正发挥作用。同时我们还应该用覆盖 语句来记录断言成功的次数。由此可以看出断言的 建立过程为“编写布尔表达式一>编写序列(se— quence)一>编写属性(property)一>编写断言(as— sert property)和覆盖语句(cover property)”。它们的 语法格式如表1所示。
SystemVerilog语言是Verilog语言的增强,它增 强了Verilog原有的编程能力,又引入了新的数据类 型和验证方法。SystemVerilog断言(以下简称SVA) 就属于这些新的验证方法中的一种。
那么什么是断言呢?断言就是对设计 属性(行为)的描述,它是用描述性语言 来捕述设计的属性。在仿真过程中,如果 一个被捕述的属性不是我们期望的那样, 那么断言就会失败;或者在仿真过程中, 如果出现了一个不应该出现的属性,那么 断言也会失败。
“property”。我们在进行时序检查时,通常使 用并发断言,而很少使用即时断言。
断言的具体应用举例
4.1简单逻辑值检查 假设要检查“信号a在每个时钟上升沿都为高 电平,如果信号在任何一个时钟上升沿不为高电平, 断言将失败”。这可以通过下面的代码实现: 例3:
sclk)a;
l,●●^,^…^…:……一
I■…●H田_n国a 集成电路 Chi
Integrated Circuit
珏”7江。。
t 3.SVA分类及组成
表1序列、属性、断言语法格式
3.1断言分类 SVA分为并发断言和即时断言。 并发断言的计算基于时钟周期,在时钟边 沿根据变量的采样值计算表达式。它可以放在过程 块(procedural block)、模块(module)、接口(inter- face)或一个程序块(program)的定义中。并发断言 可以在静态(形式化)验证工具和动态(仿真)验证 工具中使用。上面的例子就是并发断言。 即时断言基于事件的变化,表达式的计算就像
第2次断言成功。在sclk(9)处,采样到信号a的 上升沿,断言被激活。在随后的第3个时钟周期又采 样到信号b的上升沿,断言成功,随即断言退出激活 状态。
第3次断言失败,其断言检测过程和第1、2次 类似,请读者自己分析。
由此我们可以看出SVA在时序检查时的巨大 优势:只需几句代码就可以检查一类时序问题。而且 在检查时,仿真验证系统不仅会打印出错信息,还会 在波形中进行标记。这对于我们检查信号间的时序 关系非常方便。
那么为什么要使用断言呢?原有的Verilog语言 是~种过程性语言,设计它的目的是用于硬件描述, 不是用于仿真验证,因此它不能很好地控制时序。 要描述万复方杂数的据时序关系,Verilog语言需要编写冗长 的代码,很容易出错,且不易维护。SVA是一种描述 性语言,可以完美地描述和控制时序相关的问题,而 且语言本身简洁易读,容易维护。SVA还提供了许 多内嵌的函数用于测试特定的时序关系和自动收集 功能覆盖率数据。并且当断言失败时,仿真系统会 根据失败断言的严重程度来决定是打印一条错误提 示信息还是退出仿真过程,便于定位出错的位置。
例5:
sequence s2一s;
@(posedge selk)a槲2 b:
endsequence
a2_a:assert property(s2一s); c2一c:cover property(s2一s); 其检查波形,如图5所示。
4.2信号边沿检查 SVA提供了3个内嵌函数,用于检查信号的边 沿变化。
1. 前言
言和RTL级的编码语言不一致,使得验证很容易出 现错误,造成调试工作的不方便。
当今,数字电路的规模和复杂度在不断增长,这 使得对设计进行彻底的验证将成为一项巨大的挑 战。在整个芯片设计过程中,验证工作所需的时间将 占去设计周期的70%~80%,验证工程师的人数将 是设计工程师的两倍。这就迫切需要提高验证工作 的效率,以解决验证瓶颈问题。
图4
0 20 40
60 80 1 00 1 20 1 40 1 60 1 80
200 220 240 260 280
上面例子中的a可以为单个信号,也可以为同
一时钟周期的布尔表达式,如a&&b,allb,还可以为 跨越多个时钟周期的布尔表达式,如a##2 b。下面
的例万子方检数查据如果信号a在某个时钟周期为高电平, 两个时钟周期后信号b也必须为高电平。
其提示信息,如图4所示。
VSIM 59>fL-#n.oll #a¥sef[ton foild #Oeoel"}Ion foild 辑aooeltIot‘i foild #。js oerlIon 3LJcceos 辑a ooeltior‘t oLlcce u}o #a{oeftlon¥Ljcceso #Oo ee rtlon ot.Jcceoo #。jo::erl+lor-+f.3fld #Oj。gell+lOn#ucceo: #a:+seftIon 9·.』cceoo #Oo oenIOt't oLJcceoo #as:geltIon sLJcces嚣 #Oooeltlon falld #a¥!eltIon foild #Osoertior+foild
property和endproperty为SVA的关键字,用于 描述属性。a2b—P为属性的名字。¥rose为SVA的内
嵌函数,用于检查信号的上升沿。assert property也为 SVA的关键字,表示并发断言。a2b—a为断言的名 字,它把属性a2b—P作为参数。a2b—c为覆盖语句, 它用于记录断言的成功。下图为本断言在ModelSim 6.1b环境中的仿真波形和断言出错信息。
图2断言例1的波形和断言错误提示信息
断言信号为高阻态表示断言没有被激活,断言 信号为1表示断言被激活,正在检查时序属性。倒 三角表示断言在此刻失败,正三角表示断言在此刻 成功。从上图可以看出,断言a2b_a一共进行了3次 时序检查,第1、3次失败,第2次成功。
第1次断言失败。在sclk(2)处,信号a被拉高, 但这时采到的a的值仍为0。在sclk(3)处,信号a被 拉低,但这时采到的a的值为1,而前一个时钟采到 a的值为0,表示a的上升沿到来,liP¥rose(a)成立,整 个断言被激活,然后进行后序时序检查。在接下来 的2~4个时钟周期,并没有采样到信号b的上升 沿,则在sclk(7)处断言被标记为失败,断言退出激活 状态。