【SystemVerilog断言学习笔记7】蕴含操作
0赞现在对前面几篇博客中介绍的断言进行分析,为了更好的理解,下面结合简单的代码段进行分析:
property p1;
@(posedge clk) a ##2 b;
endproperty
a1 : assert property(p1);
针对这段代码段,可以做下总结:在每个时钟上升沿都检查信号“a”的电平,当a为高电平时,经过2个时钟周期后,检查信号“b”的电平,若b为高电平,则断言成功,若b为低电平,则断言失败;如果在时钟上升沿检测到信号a为低电平,断言直接失败并打印错误信息,但这并不是有效的错误信息,因为我们并不关心只检查信号“a”的电平。这个错误只是表明在时钟上升沿没有检测到有效的起始点。虽然这些错误是良性的,但在一段时间内将产生大量无效的错误信息。为了避免这些错误信息,可以利用SVA中的蕴含操作来忽略无效起始点的检查,并将断言默认为成功,称为“空成功”。
蕴含等效于一个if-then结构,其左边称为“先行算子”,右边称为“后续算子”。只有当先行算子成功时,后续算子才能计算。如果先行算子不成功,那么该属性认为是成功即“空成功”。有一点要注意的,蕴含结构只能用在属性定义中。
蕴含包含交叠蕴含和非交叠蕴含两类。接下来分别介绍。
1、交叠蕴含
交叠蕴含用符号“|->”表示,即当先行算子成功时,在同一个时钟周期内计算后续算子。如下测试代码:
/*******************************************************
作者 : CrazyBird
文件 : assert_test4.sv
日期 : 2015-5-7
功能 : 交叠蕴含
********************************************************/
`timescale 1ns/1ps
module assert_test4(
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 = 1;
b = 1;
repeat(20)@(negedge clk)
begin
a = {$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为高电平,则断言为真成功,否则断言失败。
仿真结果如下:
红色光标处为其中一个断言空成功,红色下三角为断言失败的地方。
# ** 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_test4.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: 44 # ** Error: Assertion error. # Time: 165 ns Started: 165 ns Scope: assert_test4.a1 File: D:/electron/modelsim/assert_test2/assert_test4.sv Line: 44
2、非交叠蕴含
非交叠蕴含用符号“|=>”表示,即当先行算子成功时,在下一个时钟周期计算后续算子。如下测试代码:
/*******************************************************
作者 : CrazyBird
文件 : assert_test5.sv
日期 : 2015-5-7
功能 : 非交叠蕴含
********************************************************/
`timescale 1ns/1ps
module assert_test5(
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 = 1;
b = 1;
repeat(20)@(negedge clk)
begin
a = {$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为高电平,则断言真成功,否则断言失败。
仿真结果如下:
# ** Error: Assertion error. # Time: 45 ns Started: 35 ns Scope: assert_test5.a1 File: D:/electron/modelsim/assert_test2/assert_test5.sv Line: 44 # ** Error: Assertion error. # Time: 85 ns Started: 75 ns Scope: assert_test5.a1 File: D:/electron/modelsim/assert_test2/assert_test5.sv Line: 44 # ** Error: Assertion error. # Time: 95 ns Started: 85 ns Scope: assert_test5.a1 File: D:/electron/modelsim/assert_test2/assert_test5.sv Line: 44 # ** Error: Assertion error. # Time: 165 ns Started: 155 ns Scope: assert_test5.a1 File: D:/electron/modelsim/assert_test2/assert_test5.sv Line: 44 # ** Error: Assertion error. # Time: 175 ns Started: 165 ns Scope: assert_test5.a1 File: D:/electron/modelsim/assert_test2/assert_test5.sv Line: 44
扩展一下,在避免无效错误信息出现的前提下,前面博文介绍的“a ##2 b”等价于”a |-> ##2 b”,这一块的验证自己动手做吧。
待续~~~


