1.含义
OK = $cast(子类句柄,父类句柄);
$cast是sv 类继承最常用的系统函数;用于带运行检查的强制类型转换;专门解决父类和子类的类型转换问题。
父类句柄可以指向子类,但是不能直接赋值给子类(编译器不知道父类要指给哪个子类,所以编译会报错);必须用$cast做安全转换。
2.常用场景
2.1 类继承向下转换
2.1.1 UVM取出transaction必须用
Transaction tr;
MyPacket pkt;
// 从 sequencer 拿到父类句柄
seq_item_port.get_next_item(tr);
// 必须转成真实子类
if($cast(pkt, tr)) begin
// 访问 pkt.data, pkt.addr 等子类成员
end
2.1.2 多态环境下访问子类的成员
父类没有子类成员,需要访问子类成员时必须用。
2.1.3 数组/队列里存放父类,需要取出子类
2.1.4 component/config都需要用$cast
2.5 枚举类型安全转换
- 从寄存器、协议包、内存里读状态值,转成 enum
- DUT 输出 int 信号 → 转成状态机枚举
- 激励随机或后门读写后强转枚举
2.6 接口/虚接口的安全赋值
s v规定,不同接口类型不能直接赋值,必须用$cast;
- UVM config_db 取出虚接口
- 基类接口句柄 → 子类接口
- 多态接口传递
2.7 有符号/无符号整数的安全转换
比如 int ↔ bit、byte ↔ logic 等,检查值是否越界并报错。