《SystemVerilog验证测试平台编写指南》学习笔记——对象的复制

https://blog.csdn.net/qq_39794062/article/details/113264235

上边链接的文章中的发生器首先要随机化,然年复制蓝图来创建一个新的事务,这篇文章来讲一下使用到的copy函数。

带有copy虚函数的事务基类

class Transaction;
	rand bit[31:0] src, dst, data[8];
	bit[31:0] crc;

	virtual function Transaction copy();		//复制数据域
		copy = new();
		copy.src = src;
		copy.dst = dst;
		copy.data = data;
		copy.crc = crc;
	endfunction
endclass

当扩展Transaction类来创建BadTr类的时候,copy函数仍然需要返回一个Transaction对象。这是因为扩展类的虚函数必须跟基类的Transaction::copy函数相匹配,包括所有的参数返回类型

带有copy虚函数的扩展事务类

class BadTr extends Transaction;	
	rand bit bad_crc;

	virtual function Transaction copy();
		BadTr bad;
		bad = new();
		bad.src = src;
		bad.dst = dst;
		bad.data = data
		bad.bad_crc = bad_crc;
		return bad;
	endfunction
endclass : BadTr

copy_data方法

可以将copy函数拆分成两个,创建一个独立的函数copy_data,这样每个类只负责拷贝其局部变量。

使用copy_data函数的事务基类

class Transaction;
	rand bit[31:0] src, dst, data[8];
	bit[31:0] crc;

	virtual function void copy_data(input Transaction tr);		//只负责拷贝自己的局部变量
		copy.src = src;
		copy.dst = dst;
		copy.data = data;
		copy.crc = crc;
	endfunction

	virtual function Transaction copy();		//把创建一个复制的对象单独拿出来
		copy = new();
		copy_data(copy);		//把创建的对象当作参数,调用copy_data函数
	endfunction
endclass

使用copy_data函数的扩展事务类

class BadTr extends Transaction;	
	rand bit bad_crc;

	virtual function void copy_data(input Transaction tr);
		BadTr bad;
		super.copy_data(tr);		//复制基类数据
		$cast(bad,tr);				//基类句柄类型转换成扩展类句柄类型
		bad.bad_crc = bad_crc;		//复制派生类数据
	endfunction
	
	virtual function Transaction copy();		//把创建一个复制的对象单独拿出来
		BadTr bad;
		bad = new();
		copy_data(bad);		//把创建的对象当作参数,调用copy_data函数
		return bad;
	endfunction
endclass : BadTr

指定复制的目标

上述的copy子程序总是会创建一个新的对象,一种改进方法就是指定复制对象的存放地址,当想要重用一个现有的对象而不是分配一个新对象的时候,就可以使用这种方法。(有点像Sigle单例模式~~)

class BadTr;
	...
	
	virtual function Transaction copy(Transaction to=null);
		BadTr bad;
		if(to == null)
			bad = new();
		else
			assert($cast(bad,to));		//重用已有对象
			copy_data(bad);
			return bad;
	endfunction
endclass : BadTr
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值