【SV】中$cast 的用法

本文探讨了SystemVerilog中$cast的作用和应用场景,包括类型向下和向上转换。类型向上转换允许直接赋值,但无法访问扩展类的特有变量;而类型向下转换需要$cast来确保安全性。$cast在IQC_X项目和agent实例化等场景中有实际应用,简化了代码并避免错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见$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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值