`timescale 1ns/1ps
`include "uvm_pkg.sv" //添加了uvm_pkg可以在断言模块里面使用uvm语句
module sva_inst(input sig1,
input sig2,
input sig3);
import uvm_pkg::* ;
sequence s1;
<boolen expression of sig1>;
endsequence
property p1;
s1;
endproperty
sequence s2;
<boolen expression of sig2>;
endsequence
property p2;
s2;
endproperty
property p3;
<boolen expression of sig3>;
endproperty
<string_name>: assert property <property name>
$display("xxx check success"); // 一般情况下,success的可以不写
else
$error("xxx check fail"); // 也可以写fatal,但是如果写fatal会停止仿真
|
|
vvv
v
//由于添加了uvm_pkg这里可以使用uvm_error,这样可以在log里面打印断言的时间节点
assert_p1 : assert property p1
else `uvm_error(get_type_name(), “property xxx check error”); // 由于添加了uvm_pkg这里可以使用uvm_error
assert_p2 : assert property p2
else `uvm_error(get_type_name(), “property xxx check error”); // 由于添加了uvm_pkg这里可以使用uvm_error
//收集断言的覆盖率
cover_p1 : cover property(p1);
cover_p2 : cover property(p2);
endmodule
//对于一个module而言,如果信号太多了,可以以virtual interface的方式代替
module sva_inst(sva_interface sva_vif);
xxxxxx;
endmodule
//如果用virtual interface代替了输入接口的各个信号,那么需要声明一个sva_interface
interface sva_interface();
logic sig1;
logic sig2;
endinterface
//之后将interface中的信号连接到rtl中的对应信号
assign sva_vif.sig1 = rtl_path.sig1_corresponding_name;
assign sva_vif.sig2 = rtl_path.sig2_corresponding_name;
assign sva_vif.sig3 = rtl_path.sig3_corresponding_name;
//使用了virtual interface之后,module sva_inst里面的sig就会被sva_vif.sig代替
//原先的代码:
sequence s1;
<boolen expression of sig1>;
endsequence
//添加sva_vif之后的代码:
sequence s1;
<boolen expression of sva_vif.sig1>;
endsequence
//如果property中带有接口那么接口也会被sva_vif.sig代替
property p1(sva_vif.sig1, sva_vif.sig2);
<boolen expression of sig1 and sig2>;
endproperty
//之后例化sva_interface以及sva_inst
module dut_wrapper();
sva_interface sva_vif();
assign sva_vif.sig1 = rtl_path.sig1_corresponding_name;
assign sva_vif.sig2 = rtl_path.sig2_corresponding_name;
assign sva_vif.sig3 = rtl_path.sig3_corresponding_name;
//如果sva_vif的连接的代码行太多了,最好写在一个.sv文件里面,那么就需要将该文件include到module top里面
`include "<link.sv所在的文件位置>.sva_interface_link.sv"
sva_inst m_sva_inst(sva_vif);
endmodule
//可以在verdi中添加选项,将断言的波形也添加到fsdb文件中
module tb;
dut_wrapper u_dut_wrapper;
xxxxxx
initial begin
run_test();
end
initial begin
$fsdbAutoSwitchDumpfile(1000, "sim.fsdb", 50, "fsdb.log");
$fsdbDumpvars("+all");
$fsdbDumpSVA(); //添加断言的波形
end
endmodule
SVA—在UVM仿真环境中添加sva模块并在波形中显示
于 2024-08-17 16:33:40 首次发布