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