SVA—在UVM仿真环境中添加sva模块并在波形中显示

`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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值