收藏 分享(赏)

SystemVerilog断言学习笔记.doc

上传人:tangtianxu1 文档编号:3232881 上传时间:2018-10-08 格式:DOC 页数:24 大小:1.28MB
下载 相关 举报
SystemVerilog断言学习笔记.doc_第1页
第1页 / 共24页
SystemVerilog断言学习笔记.doc_第2页
第2页 / 共24页
SystemVerilog断言学习笔记.doc_第3页
第3页 / 共24页
SystemVerilog断言学习笔记.doc_第4页
第4页 / 共24页
SystemVerilog断言学习笔记.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、SystemVerilog 断言学习笔记 1一、前言随着数字电路规模越来越大、设计越来越复杂,使得对设计的功能验证越来越重要。首先,我们要明白为什么要对设计进行验证?验证有什么作用?例如,在用 FPGA 进行设计时,我们并不能确保设计出来的东西没有功能上的漏洞,因此在设计后我们都会对其进行验证仿真。换句话说,验证的目的是彻底地验证被测设计以确保设计没有功能上的缺陷。而即将介绍的 SystemVerilog 断言便是一门重要的验证技术,它可以尽早发现设计的缺陷以及提高验证的效率。二、基本概念1、什么是断言断言是设计属性的描述。而断言可以从设计的功能描述中推知,然后转换成断言。那么断言是如何表现的

2、呢?当一个被检查的属性不像我们期望的那样表现时,则该断言失败;当一个禁止在设计中出现的属性发生时,则该断言失败。2、为什么要使用 SystemVerilog 断言Verilog HDL 也能实现断言,但其存在不足之处: Verilog HDL 是一种过程语言,不能很好地控制时序; Verilog HDL 是一种冗长的语言,随着断言数量的增加,维护代码将变得很困难; 语言的过程性使得测试同一时间段内发生的并行事件相当困难; Verilog HDL 没有提供内嵌的机制来提供功能覆盖的数据。而 SystemVerilog 断言具有如下特征: 它是一种描述性语言,可以完美描述时序的状况; 语言本身非常

3、精确且易于维护; 语言的描述性提供了对时间卓越的控制; 它提供了若干个内嵌函数来测试特定的设计情况,并且提供了一些构造来自动收集功能覆盖数据。可见,使用 SystemVerilog 断言具有非常大的优势。三、验证平台一个包含 SystemVerilog 断言的验证环境如下图所示:注:约束随机测试平台可以用来产生更多真实的验证情景;代码覆盖则是验证完整性的基本衡量标准。一般情况下,测试平台需要做三件事: 产生激励; 自检机制; 衡量功能覆盖。1. 产生激励通俗来讲就是为被测设计提供输入信号。2. 自检机制则是使每个测试都能自动和动态地检验期望的结果。自检过程主要着眼于协议检验和数据检验。协议检验

4、的目的是检验控制信号的正确性;数据检验则是检验正在处理的数据的完整性。3. 功能覆盖用于衡量验证完整性,它包含协议覆盖和测试计划覆盖两项衡量标准。协议覆盖是用来衡量一个设计的功能说明书中确定的所有功能是否都测试过;测试计划则是衡量测试平台的穷尽性。而 SystemVerilog 断言主要着重处理协议检验和协议覆盖两大类问题。【SystemVerilog 断言学习笔记 2】断言的类型SystemVerilog 中包含并发断言和即时断言两种类型的断言。所谓并发断言就是在时钟边沿对变量进行采样并完成测试表达式的计算,它可以在模块、接口、过程块或程序中定义。这里有一点是需要声明的,对于变量的采样值是时

5、钟边沿前一时刻相应变量的值。而即时断言只能在过程块中定义的,测试表达式的计算跟 Verilog HDL 过程块中的行为一样,即一旦事件发生变化则表达式立刻被求值。接下来通过 modelsim 对这两类的断言进行仿真测试,给大家一个直观的理解。1、并发断言打开 modelsim 仿真软件,然后点击“FileNew Project“,出现如下对话框,为对话框填上工程名以及路径,其他默认,点击”OK“后会弹出询问是否创建工程路径的对话框,选择”是“。在下面的对话框中点击“Create New File”以新建源文件。为对话框填上新建文件名以及文件类型选为“SystemVerilog” ,然后点击“O

6、K” ,“Close”。为新建的 sv 文件编写 SystemVerilog 代码,如下所示:/*作者 : CrazyBird文件 : assert_test.sv日期 : 2015-5-1功能 : 并行断言*/timescale 1ns/1psmodule assert_test(output reg clk,output reg a,output reg b);/ 时钟的产生parameter PERIOD = 10;initialbeginclk = 0;forever #(PERIOD/2)clk = clk;end/ 激励的产生initialbegina = 0;b = 1;repe

7、at(20)(negedge clk)begina = $random()%2;b = $random()%2;end(negedge clk);$stop;end/ 并行断言a_cc: assert property(posedge clk) not(aendmodule该段代码断言信号 a 和信号 b 不能同时为 1,否则断言失败。选择要编译的文件 assert_test.sv,接着点击 “CompileCompile Selected”,如果编译正确,transcript 状态栏会提示编译成功,并且文件状态会由蓝色“问号”变为绿色“打钩”,如下图所示。编译成功后,接下来开始仿真。点击“S

8、imulateStart Simulation”,在弹出的对话框中,展开 work,选择 assert_test,然后“OK”。将 Object 下的信号 clk、a、b 添加到波形中去,做法是选中信号 clk、a 、b,然后右键单击 “Add toWaveSelected signals”,如下图所示:点击“Simulate Restart”,“OK” ,接着点击 “SimulateRunRun All”,再接着点击“WaveZoomZoom Full”,其波形如下所示:在 transcript 状态栏下会出现断言失败的信息,通过双击它,可在 Wave 中显示断言失败的地方,如下图所示:#

9、* Error: Assertion error.# Time: 25 ns Started: 25 ns Scope: assert_test.a_cc File: D:/electron/modelsim/assert_test/assert_test.sv Line: 38# * Error: Assertion error.# Time: 35 ns Started: 35 ns Scope: assert_test.a_cc File: D:/electron/modelsim/assert_test/assert_test.sv Line: 38# * Error: Asserti

10、on error.# Time: 55 ns Started: 55 ns Scope: assert_test.a_cc File: D:/electron/modelsim/assert_test/assert_test.sv Line: 38# * Error: Assertion error.# Time: 105 ns Started: 105 ns Scope: assert_test.a_cc File: D:/electron/modelsim/assert_test/assert_test.sv Line: 38# * Error: Assertion error.# Tim

11、e: 155 ns Started: 155 ns Scope: assert_test.a_cc File: D:/electron/modelsim/assert_test/assert_test.sv Line: 38# * Error: Assertion error.# Time: 205 ns Started: 205 ns Scope: assert_test.a_cc File: D:/electron/modelsim/assert_test/assert_test.sv Line: 38也可以通过点击“ViewCoverageassertions” 查看断言的情况,如下所示

12、:很明显,断言失败有 6 处地方。2、即时断言操作基本跟上面的一样,即时断言的一个例子如下所示:/*作者 : CrazyBird文件 : assert_test.sv日期 : 2015-5-1功能 : 即时断言*/timescale 1ns/1psmodule assert_test(output reg clk,output reg a,output reg b);/ 时钟的产生parameter PERIOD = 10;initialbeginclk = 0;forever #(PERIOD/2)clk = clk;end/ 激励的产生initialbegina = 0;b = 1;rep

13、eat(20)(negedge clk)begina = $random()%2;b = $random()%2;end(negedge clk);$stop;end/ 即时断言always_combbegina_ia: assert (aendendmodule该段代码断言信号 a 和信号 b 同时为 1,否则断言失败。其断言情况如下所示:# * Error: Assertion error.# Time: 0 ps Scope: assert_test.a_ia File: D:/electron/modelsim/assert_test/assert_test.sv Line: 41#

14、* Error: Assertion error.# Time: 40 ns Scope: assert_test.a_ia File: D:/electron/modelsim/assert_test/assert_test.sv Line: 41# * Error: Assertion error.# Time: 60 ns Scope: assert_test.a_ia File: D:/electron/modelsim/assert_test/assert_test.sv Line: 41# * Error: Assertion error.# Time: 70 ns Scope:

15、assert_test.a_ia File: D:/electron/modelsim/assert_test/assert_test.sv Line: 41# * Error: Assertion error.# Time: 110 ns Scope: assert_test.a_ia File: D:/electron/modelsim/assert_test/assert_test.sv Line: 41# * Error: Assertion error.# Time: 120 ns Scope: assert_test.a_ia File: D:/electron/modelsim/

16、assert_test/assert_test.sv Line: 41# * Error: Assertion error.# Time: 130 ns Scope: assert_test.a_ia File: D:/electron/modelsim/assert_test/assert_test.sv Line: 41# * Error: Assertion error.# Time: 160 ns Scope: assert_test.a_ia File: D:/electron/modelsim/assert_test/assert_test.sv Line: 41# * Error

17、: Assertion error.# Time: 170 ns Scope: assert_test.a_ia File: D:/electron/modelsim/assert_test/assert_test.sv Line: 41# * Error: Assertion error.# Time: 180 ns Scope: assert_test.a_ia File: D:/electron/modelsim/assert_test/assert_test.sv Line: 41很明显,断言失败有 10 处地方。【SystemVerilog 断言学习笔记 3】SVA 块的建立 不管学

18、什么东西,如果掌握了技巧、规律,我们将很容易上手。同样,如果我们掌握了建立 SystemVerilog 断言(简称 SVA)块的步骤,在后面 SVA 的深入学习中将起到事半功倍的效果。SVA 块的建立步骤如下。步骤一、建立布尔表达式步骤二、建立序列表达式关键词序列”sequence”可以用来表示逻辑事件,包括同一个时钟边沿被求值的布尔表达式或者经过几个时钟周期的求值事件。序列基本语法:sequence name_of_sequence; ; endsequence步骤三、建立属性关键词属性”property”可以用来表示复杂序列的行为。属性基本语法:property name_of_prope

19、rty; ; or ; endproperty步骤四、断言属性关键词断言”assert”可以用来检查属性。断言基本语法:assertion_name: assert property(property_name);【SystemVerilog 断言学习笔记 4】边沿检测内嵌函数SVA 中内嵌了信号边沿检测函数,方便用户监视信号从一个时钟周期到另一个时钟周期的跳变。其中,有三个非常有用的内嵌函数如下:(1)$rose(boolean expression or signal_name):当表达式/信号的最低位由 0 变为 1 时返回真;(2)$fell(boolean expression or

20、 signal_name):当表达式/信号的最低位由 1 变为 0 时返回真;(3)$stable(boolean expression or signal_name):当表达式/信号不发生变化时返回真。针对上述的描述,可以得出两个结论: (1)这三个内嵌函数是工作在时钟边沿上的; (2)这三个内嵌函数只检测信号的最低位,而忽略其他位。接下来,带着这两个结论以及运用上一篇博客对 SVA 块的建立步骤对三个内嵌函数进行验证。1、$rose()函数的验证为了验证内嵌函数$rose() 是工作在时钟边沿上的,这里给出一个简单的反例即不受时钟控制:/*作者 : CrazyBird文件 : rose_t

21、est.sv日期 : 2015-5-6功能 : $rose()函数的验证*/timescale 1ns/1psmodule rose_test(output reg clk,output reg 1:0 a);/ 时钟的产生parameter PERIOD = 10;initialbeginclk = 0;forever #(PERIOD/2)clk = clk;end/ 激励的产生initialbegina = 0;repeat(20)(negedge clk)begina = $random()%2*2;end(negedge clk);$stop;end/ 断言always_combbe

22、gina_ia : assert($rose(a);endendmodule对该程序进行编译将出现以下错误:从错误中可以看出,$rose() 函数是时钟敏感的。改正后的代码如下所示:/*作者 : CrazyBird文件 : rose_test.sv日期 : 2015-5-6功能 : $rose()函数的验证*/timescale 1ns/1psmodule rose_test(output reg clk,output reg 1:0 a);/ 时钟的产生parameter PERIOD = 10;initialbeginclk = 0;forever #(PERIOD/2)clk = clk

23、;end/ 激励的产生initialbegina = 0;repeat(20)(negedge clk)begina = $random()%2*2;end(negedge clk);$stop;end/ 序列的建立sequence s1;(posedge clk) $rose(a); / 受时钟边沿控制,正确/$rose(a); / 不受时钟控制,错误endsequence/ 属性的建立property p1;s1;endproperty/ 断言属性a_cc: assert property(p1);endmodule对改正后的代码进行仿真,可得到如下的时序图:其中,红色光标所在处表示断言成

24、功,而红色下三角表示断言失败。可以很容易分析到,断言成功的地方肯定是当前时刻信号的最低位是高电平,上一时刻信号的最低位是低电平。断言失败的地方信号的最低位要么当前时刻是低电平,上一时刻是高电平,要么当前时刻和上一时刻的电平没有发生变化,不管其他位是如何变化的。从而验证了内嵌函数$rose()只检测信号的最低位,而忽略其他位。对于内嵌函数$fell() 和 $stable()的验证与$rose()类似,同样可以验证“ 内嵌函数是工作在时钟边沿上的”和“ 内嵌函数只检测信号的最低位,而忽略其他位”这两个结论的正确性。下面只给出他们的仿真结果。2、$fell()的验证3、$stable()的验证先介

25、绍到这吧,待续【SystemVerilog 断言学习笔记 5】“#” 的解读与运用有时候,我们需要检查几个时钟周期才能完成的事务。在 SVA 中,可以用“#”表示时钟周期延迟,如“ a #2 b”即当 a 为高电平时,2 个时钟周期之后 b 应为高电平。下面举个简单的例子来说明:测试代码:/*作者 : CrazyBird文件 : assert_test2.sv日期 : 2015-5-7功能 : 时钟周期延时 “#”的测试*/timescale 1ns/1psmodule assert_test2(output reg clk,output reg a,output reg b);/ 产生时钟p

26、arameter PERIOD = 10;initialbeginclk = 0;forever #(PERIOD/2)clk = clk; end/ 产生激励initialbegina = 1;b = 1;repeat(20)(negedge clk)begina = $random()%2;b = $random()%2;end(negedge clk);$stop;end/建立序列sequence s1;a #2 b;endsequence/ 建立属性property p1;(posedge clk) s1;endproperty/ 断言属性a1 : assert property(p1

27、);endmodule按照代码的描述,其任务是检查信号 a 在给定的时钟上升沿是否为高电平。若 a 为低电平,断言直接失败;若 a 为高电平,则延迟 2 个时钟周期后检查 b 是否为高电平。若 b 为高电平,表示断言成功;若 b 为低电平,表示断言失败。其仿真结果如下所示:# * Error: Assertion error.# Time: 15 ns Started: 15 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion

28、 error.# Time: 45 ns Started: 25 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 65 ns Started: 65 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time:

29、 75 ns Started: 55 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 95 ns Started: 75 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 115 ns Starte

30、d: 115 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 125 ns Started: 125 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 125 ns Started: 105 ns

31、Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 135 ns Started: 135 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 145 ns Started: 145 ns Scope: ass

32、ert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 175 ns Started: 175 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 175 ns Started: 155 ns Scope: assert_test2.

33、a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 185 ns Started: 185 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 195 ns Started: 195 ns Scope: assert_test2.a1 File: D

34、:/electron/modelsim/assert_test2/assert_test2.sv Line: 49待续【SystemVerilog 断言学习笔记 6】禁止属性的使用当我们期望属性永远为假时,可以用关键字“not” 来禁止属性,即当属性为真时断言失败。接下来验证 “not”是如何运作的。测试代码:/*作者 : CrazyBird文件 : assert_test2.sv日期 : 2015-5-7功能 : 禁止属性 “not”的测试*/timescale 1ns/1psmodule assert_test2(output reg clk,output reg a,output reg

35、 b);/ 产生时钟parameter PERIOD = 10;initialbeginclk = 0;forever #(PERIOD/2)clk = clk; end/ 产生激励initialbegina = 1;b = 1;repeat(20)(negedge clk)begina = $random()%2;b = $random()%2;end(negedge clk);$stop;end/ 建立序列sequence s1;a #2 b;endsequence/ 建立属性property p1;(posedge clk) not(s1);endproperty/ 断言属性a1 : a

36、ssert property(p1);endmodule注意“not” 所在的位置,如果是下面的写法,编译将报错:/ 建立序列sequence s1;a #2 b;endsequence/ 建立属性property p1;not(posedge clk) s1);endproperty或者/ 建立序列sequence s1;(posedge clk) a #2 b;endsequence/ 建立属性property p1;not(s1);endproperty测试结果:# * Error: Assertion error.# Time: 25 ns Started: 5 ns Scope: a

37、ssert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 55 ns Started: 35 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 65 ns Started: 45 ns Scope: assert_test2.a1

38、 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 105 ns Started: 85 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 115 ns Started: 95 ns Scope: assert_test2.a1 File: D:/el

39、ectron/modelsim/assert_test2/assert_test2.sv Line: 49# * Error: Assertion error.# Time: 185 ns Started: 165 ns Scope: assert_test2.a1 File: D:/electron/modelsim/assert_test2/assert_test2.sv Line: 49很明显,当时钟上升沿到来时,若 a 为高电平, 2 个时钟周期后,若 b 也为高电平,则断言失败,且失败标注在序列的结束位置。当时钟上升沿到来时,若 a 为低电平,则断言直接成功;若 a 为高电平,2 个

40、时钟周期后 b 为低电平,则断言成功。这刚好跟 “a #2 b”的属性相反,故验证了“not”是可以禁止属性的。待续【SystemVerilog 断言学习笔记 7】蕴含操作 现在对前面几篇博客中介绍的断言进行分析,为了更好的理解,下面结合简单的代码段进行分析:property p1;(posedge clk) a #2 b;endpropertya1 : assert property(p1);针对这段代码段,可以做下总结:在每个时钟上升沿都检查信号“a”的电平,当 a 为高电平时,经过 2 个时钟周期后,检查信号“b”的电平,若b 为高电平,则断言成功,若 b 为低电平,则断言失败;如果在时

41、钟上升沿检测到信号 a 为低电平,断言直接失败并打印错误信息,但这并不是有效的错误信息,因为我们并不关心只检查信号“a”的电平。这个错误只是表明在时钟上升沿没有检测到有效的起始点。虽然这些错误是良性的,但在一段时间内将产生大量无效的错误信息。为了避免这些错误信息,可以利用 SVA 中的蕴含操作来忽略无效起始点的检查,并将断言默认为成功,称为“空成功”。蕴含等效于一个 if-then 结构,其左边称为“先行算子” ,右边称为“后续算子” 。只有当先行算子成功时,后续算子才能计算。如果先行算子不成功,那么该属性认为是成功即“空成功”。有一点要注意的,蕴含结构只能用在属性定义中。蕴含包含交叠蕴含和非

42、交叠蕴含两类。接下来分别介绍。1、交叠蕴含交叠蕴含用符号“|-”表示,即当先行算子成功时,在同一个时钟周期内计算后续算子。如下测试代码:/*作者 : CrazyBird文件 : assert_test4.sv日期 : 2015-5-7功能 : 交叠蕴含*/timescale 1ns/1psmodule assert_test4(output reg clk,output reg a,output reg b);/ 产生时钟parameter PERIOD = 10;initialbeginclk = 0;forever #(PERIOD/2)clk = clk; end/ 产生激励initia

43、lbegina = 1;b = 1;repeat(20)(negedge clk)begina = $random()%2;b = $random()%2;end(negedge clk);$stop;end/ 建立属性property p1;(posedge clk) a |- b;endproperty/ 断言属性a1 : assert property(p1);endmodule该代码在时钟上升沿检测信号“a”是否为高电平,若 a 为低电平,则断言默认成功即空成功;若 a 为高电平,则在同一个时钟上升沿检测信号“b”的电平,若 b 为高电平,则断言为真成功,否则断言失败。仿真结果如下:红

44、色光标处为其中一个断言空成功,红色下三角为断言失败的地方。# * Error: Assertion error.# Time: 45 ns Started: 45 ns Scope: assert_test4.a1 File: D:/electron/modelsim/assert_test2/assert_test4.sv Line: 44# * Error: Assertion error.# Time: 75 ns Started: 75 ns Scope: assert_test4.a1 File: D:/electron/modelsim/assert_test2/assert_te

45、st4.sv Line: 44# * Error: Assertion error.# Time: 85 ns Started: 85 ns Scope: assert_test4.a1 File: D:/electron/modelsim/assert_test2/assert_test4.sv Line: 44# * Error: Assertion error.# Time: 95 ns Started: 95 ns Scope: assert_test4.a1 File: D:/electron/modelsim/assert_test2/assert_test4.sv Line: 4

46、4# * Error: Assertion error.# Time: 165 ns Started: 165 ns Scope: assert_test4.a1 File: D:/electron/modelsim/assert_test2/assert_test4.sv Line: 442、非交叠蕴含非交叠蕴含用符号“|=”表示,即当先行算子成功时,在下一个时钟周期计算后续算子。如下测试代码:/*作者 : CrazyBird文件 : assert_test5.sv日期 : 2015-5-7功能 : 非交叠蕴含*/timescale 1ns/1psmodule assert_test5(output reg clk,output reg a,output reg b)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报