二、基本概念 1、什么是断言 断言是设计属性的描述。而断言可以从设计的功能描述中推知,然后转换成断言。那么断言是如何表现的呢当一个被检查的属性不像我们期望的那样表现时,则该断言失败;
当一个禁止在设计中出现的属性发生时,则该断言失败。
2、为什么要使用SystemVerilog断言 Verilog HDL也能实现断言,但其存在不足之处 Verilog HDL是一种过程语言,不能很好地控制时序;
Verilog HDL是一种冗长的语言,随着断言数量的增加,维护代码将变得很困难;
语言的过程性使得测试同一时间段内发生的并行事件相当困难;
Verilog HDL没有提供内嵌的机制来提供功能覆盖的数据。
而SystemVerilog断言具有如下特征 它是一种描述性语言,可以完美描述时序的状况;
语言本身非常精确且易于维护;
语言的描述性提供了对时间卓越的控制;
它提供了若干个内嵌函数来测试特定的设计情况,并且提供了一些构造来自动收集功能覆盖数据。
可见,使用SystemVerilog断言具有非常大的优势。
三、验证平台 一个包含SystemVerilog断言的验证环境如下图所示 注约束随机测试平台可以用来产生更多真实的验证情景;
代码覆盖则是验证完整性的基本衡量标准。
一般情况下,测试平台需要做三件事 产生激励;
自检机制;
衡量功能覆盖。
1. 产生激励通俗来讲就是为被测设计提供输入信号。
2. 自检机制则是使每个测试都能自动和动态地检验期望的结果。自检过程主要着眼于协议检验和数据检验。协议检验的目的是检验控制信号的正确性;
数据检验则是检验正在处理的数据的完整性。
3. 功能覆盖用于衡量验证完整性,它包含协议覆盖和测试计划覆盖两项衡量标准。协议覆盖是用来衡量一个设计的功能说明书中确定的所有功能是否都测试过;
测试计划则是衡量测试平台的穷尽性。
而SystemVerilog断言主要着重处理协议检验和协议覆盖两大类问题。
【SystemVerilog断言学习笔记2】断言的类型 SystemVerilog中包含并发断言和即时断言两种类型的断言。所谓并发断言就是在时钟边沿对变量进行采样并完成测试表达式的计算,它可以在模块、接口、过程块或程序中定义。这里有一点是需要声明的,对于变量的采样值是时钟边沿前一时刻相应变量的值。而即时断言只能在过程块中定义的,测试表达式的计算跟Verilog HDL过程块中的行为一样,即一旦事件发生变化则表达式立刻被求值。接下来通过modelsim对这两类的断言进行仿真测试,给大家一个直观的理解。
1、并发断言 打开modelsim仿真软件,然后点击“FileNewProject“,出现如下对话框,为对话框填上工程名以及路径,其他默认,点击”OK“后会弹出询问是否创建工程路径的对话框,选择”是“。
在下面的对话框中点击“Create New File”以新建源文件。
为对话框填上新建文件名以及文件类型选为“SystemVerilog”,然后点击“OK”,“Close”。。。
为新建的sv文件编写SystemVerilog代码,如下所示 /******************************************************* 作者 CrazyBird 文件 assert_test.sv 日期 2015-5-1 功能 并行断言 ********************************************************/ timescale 1ns/1ps module assert_test output reg clk, output reg a, output reg b ; // 时钟的产生 parameter PERIOD 10; initial begin clk 0; forever PERIOD/2 clk clk; end // 激励的产生 initial begin a 0; b 1; repeat20negedge clk begin a {random}2; b {random}2; end negedge clk; stop; end // 并行断言 a_cc assert propertyposedge clk nota endmodule 该段代码断言信号a和信号b不能同时为1,否则断言失败。
选择要编译的文件assert_test.sv,接着点击“CompileCompile Selected”,如果编译正确,transcript状态栏会提示编译成功,并且文件状态会由蓝色“问号”变为绿色“打钩”,如下图所示。
编译成功后,接下来开始仿真。点击“SimulateStart Simulation”,在弹出的对话框中,展开work,选择assert_test,然后“OK”。
将Object下的信号clk、a、b添加到波形中去,做法是选中信号clk、a、b,然后右键单击“Add toWaveSelected signals”,如下图所示 点击“SimulateRestart”,“OK”,接着点击“SimulateRunRun –All”,再接着点击“WaveZoomZoom Full”,其波形如下所示 在transcript状态栏下会出现断言失败的信息,通过双击它,可在Wave中显示断言失败的地方,如下图所示 ** 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 Assertion 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. Time 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”查看断言的情况,如下所示 很明显,断言失败有6处地方。
2、即时断言 操作基本跟上面的一样,即时断言的一个例子如下所示 /******************************************************* 作者 CrazyBird 文件 assert_test.sv 日期 2015-5-1 功能 即时断言 ********************************************************/ timescale 1ns/1ps module assert_test output reg clk, output reg a, output reg b ; // 时钟的产生 parameter PERIOD 10; initial begin clk 0; forever PERIOD/2 clk clk; end // 激励的产生 initial begin a 0; b 1; repeat20negedge clk begin a {random}2; b {random}2; end negedge clk; stop; end // 即时断言 always_comb begin a_ia assert a end endmodule 该段代码断言信号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 ** 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/as