常见$cast, 但对其功能(向下类型转换)和具体应用场景却一知半解, 现将一点心得记录在此。
-
类型向下转换 :将父类句柄(father_handle) 赋给 扩展类(child_handle)
child_handle = father_handle -
类型向上转换: 将扩展类句柄(child_handle) 赋给 基类(father_handle)
father_handle = child_handle
下面插入SV绿皮书 8.3.1 中的代码, 又加入了print()来说明virtual 的用法。
class Transaction;
rand bit [31:0] src;
virtual function void display(input string prefix = "");
$display("%s Transaction : src=%0d", prefix,src);
endfunction
function void print();
$display("the function in base class of Transaction");
endfunction
endclass
class BadTr extends Transaction;
bit bad_csm = 1;
virtual function void display(input string prefix = "");
$display("%s BadTr : bad_csm=%b", prefix,bad_csm);
super.display(prefix);
endfunction
function void print();
$display("the function in extended class of BadTr");
endfunction
endclass
- 类型向上转换 可以直接赋值(tr = bad),赋值后基类句柄(tr)指向了扩展类(BadTr),但是如果想通过次句柄(tr,现在指向了BadTr)直接引用仅存在扩展类中的变量(bad_csm),$display行会报错,见下面代码。
Transaction tr;
BadTr bad;
function new (string name = "er_ecp_agent_update" , uvm_component parent = null);
super.new(name, parent);
bad = new();
tr = bad;
$display("tr.bad_csm = %d",tr.bad_csm);
endfunction
*E,NOTCLM : bad_csm is not a class item.
如果用$cast 做类型向上转换,同样会报错
Transaction tr;
BadTr bad