一文理解cast转换

news2024/9/21 16:40:07

目录

写在前边

1. what?又报错:

2. 靠,难道是这样?

3. 小试牛刀

4. 实际中的“坑”

 写在后边

写在前边

关于$cast转换的结论无外乎以下四条:

  1. 如果将子类句柄复制给父类句柄,可以实现父类句柄的向下转换,可以不使用$cast完成,属于一种静态的转换,如果类型不匹配会在编译时报错;
  2. 如果将父类句柄复制给子类句柄,可是实现子类句柄的向上转换$cast在转换时需要检查要转换的两个句柄指向对象的类型,如果转换源类型与目的类型所指向对象的类型一致或者是目的类型指向的对象是源类型的父类,那么可以使用$cast进行转换。
  3. 对于类中的属性,SV会根据句柄handle本身的类型进行判定,父类句柄指访问的仍然是父类句柄类型中的属性
  4. $cast是作为任务还是作为函数使用,仿真时会根据使用的上下文决定具体调用的方式。

我相信以上的结论大家不止在一篇文章中见到,但是当自己使用cast的时候,嗯......,不是转换不成功就是会报类型不匹配的问题。后来发现,靠,我居然还是不会。不好意思,以上内容根据自己亲身经历演变而来。咱们言归正传,本文将主要针对以上结论中的红色字体内容进行深入剖析,解释。

1. what?又报错:

上来就是一个报错场景,这就是没有彻底理解以上结论造成的(如果转换源类型与目的类型所指向对象的类型一致或者是目的类型指向的对象是源类型的父类,那么可以使用$cast进行转换);以下代码声明了一个父类father,一个继承于father的子类child1。按照最初的理解,目的类型指向的对象是源类型的父类,不就是下边的cast转换吗?但是,偏偏会报错,这是为什么呢?

class father;
	string m_name;
	
	function new(string name);
	m_name = name;
	endfunction
	
	function void print();
		$display("HELLOW %s",m_name);
	endfunction
endclass:father
 
class child1 extends father;
	string plane="plane";
	
	function new(string name);
	super.new(name);
	endfunction
endclass:child1
 
module top;
	father f;
	child1 c1;
	child1 c2;
	initial begin
		f=new("father");
		$cast(c2,f);
		f.print();
		$write(",has %s", c2.plane);
		end
endmodule:top

仿真结果:

报错信息是类型不匹配, 究竟是什么原因导致的呢?

2. 靠,难道是这样?

请允许我将以上的继承关系画出来,这可能有助于我们找到答案。 

以上图片其实就想说明一个问题,father = new(),开辟的空间是左边的只有father的空间,但是child1=new()开辟的空间除了包含有child自身的(图上表示为child1拓展部分),还有其父类father的部分。以上代码首先对father进行了实例化,开辟了空间,接着进行$cast(子类句柄,子类句柄的父类对象)转换,这是不被允许的。其实上边结论说的目的类型指向的对象是源类型的父类是可以进行cast转换的,指的是$cast(子类句柄,子类里边父类的对象(右边图的father部分),而不是左边的father)。

3. 小试牛刀

class father;
	string m_name;
	bit    index = 0;
	function new(string name);
	m_name = name;
	endfunction
	
	function void print();
		$display(" 1 :HELLOW %s, index = %b",m_name, index);
	endfunction
endclass:father
 
 
class child1 extends father;
	string plane="plane";
	bit    index = 1;

	function new(string name);
	super.new(name);
	endfunction

    function void print();
		$display("2: HELLOW %s, index = %b",m_name, index);
	endfunction

endclass:child1
 
module top;
	father f;
	child1 c1;
	child1 c2;
	initial begin
		c1=new("child1");
		f=c1;
		f.print();
		c1.plane="big_plane";
		$cast(c2,f);
		f.print();
		$write(",has %s", c2.plane);
		end
endmodule:top

将原始代码进行了修改,主要在top部分,首先初始化子类,开辟空间,父类句柄指向子类对象,这是允许的。此时,父类指向的是子类空间中父类的那一部分空间,如打印结果所示。但是其所属的类型为子类。接下来进行cast转换就不存在上边的问题了。看了打印结果,心头一紧,真TMNB,这个理解就目前而言可以说服自己了。

4. 实际中的“坑”

 这部分代码放到附件了,是自己实际工作中遇到的一个小问题,最初是由于cast转换引出的,但是后续debug过程中发现并非是cast的问题。

借此插眼,配置类顶层配置好了之后一定是使用句柄传到下边的层次,可千万不要在底层类中随便实例化该配置类,不然你会发现,实例化的类是一个基类,心中还会一直默念,我明明对里边的配置做了修改,为什么没有传进来的疑问,可能一弄就是一天,吐血的经历。

感兴趣的朋友可以看看具体代码,当然,其实无关紧要,我就是觉得这个问题给我搞得多多少少有点不爽,记录以下罢了;

 写在后边

已经凌晨一点多了,后悔端午节出去吃火锅了,要不也不能熬夜对吧,哦,对了,以后这个专栏会主要记录一些本人在搭建验证环境过程中遇到的问题,针对具体一个点进行深入理解,感兴趣的小伙伴请记得关注,当然,也希望得到大佬的指点。一起加油,ICers。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/675408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

翻筋斗觅食策略改进灰狼算法

目录 一、动态扰动因子策略 二、翻筋斗觅食策略 三、改进灰狼算法收敛曲线图 灰狼优化算法(grey wolf optimization,GWO)存在收敛的不合理性等缺陷,目前对GWO算法的收敛性改进方式较少,除此之外,当GWO迭代至后期,所有灰狼个体…

企业版:Select.PDF Library for .NET

HTML 到 PDF API SelectPdf提供了一个REST API,可用于通过我们的专用云服务将html转换为任何语言的pdf。 另存为 PDF 链接 以非常简单的方式将“转换为PDF”功能添加到您的网站或博客。只需添加一个指向您的网页的链接,您就完成了。 适用于 .NET 的 PD…

Redis 通用命令

通用命令介绍 Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令,比如删除键、对键进行改名、判断键是否存在等。简单说,就是 keys 分类的命令,如下图。 上图中圈中的部分,就是所谓的通用的命令…

chatgpt赋能python:Python对于SEO的重要性:浏览网页的技术分析

Python对于SEO的重要性:浏览网页的技术分析 越来越多的网站需要搜索引擎优化(SEO),以便他们的网站上的内容能够被更多人浏览与访问。这就要求我们使用一些工具和技术,例如Python,来帮助我们分析网页的技术…

通过调整图像hue值并结合ImageEnhance库以实现色调增强

前言 PIL库中的ImageEnhance类可用于图像增强,可以调节图像的亮度、对比度、色度和锐度。 通过RGB到HSV的变换加调整可以对图像的色调进行调整。 两种方法结合可以达到更大程度的图像色调增强。 调整hue值 __author__ TracelessLe __website__ https://blog…

linux 下查看 USB 设备

文章目录 前言目录内容详解usb11-0:1.01-1.1:1.0 结构图设备信息bDeviceClassversionbusnum & devnumdevbMaxPoweridVendor & idProductproductmanufacturerbcdDevicespeedueventbmAttributesdrivers_autoprobe 前言 在 sysfs 文件系统下,查看 USB 设备&am…

PaddleOCR #使用PaddleOCR进行光学字符识别(PP-OCR文本检测识别)

引言: PaddleOCR 是一个 OCR 框架或工具包,它提供多语言实用的 OCR 工具,帮助用户在几行代码中应用和训练不同的模型。PaddleOCR 提供了一系列高质量的预训练模型。这包含三种类型的模型,使 OCR 高度准确并接近商业产品。它提供文…

【Unity 2D AABB碰撞检测】铸梦之路

作者介绍:铸梦xy。IT公司技术合伙人,IT高级讲师,资深Unity架构师,铸梦之路系列课程创始人。 目录1.AABB 碰撞介绍2.常用2D碰撞盒3.为什么要学习如何编写碰撞检测4.2D BOX & BOX 碰撞检测原理和代码5.2D BOX &Shpere 碰撞检…

Linux信号编程、signal函数范例详解( 4 ) -【Linux通信架构系列 】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the…

chatgpt赋能python:Python求1是什么?Python求1在SEO中的应用

Python求1是什么?Python求1在SEO中的应用 介绍Python求1 Python求1,也叫做1-bit计数器,是一种用来统计网页浏览量的技术。在Web开发中,我们需要记录网页的浏览次数,以便了解网站的流量和用户的使用情况。传统的做法是…

chatgpt赋能python:Python求绝对值:从初学者到高级工程师的必备知识

Python求绝对值:从初学者到高级工程师的必备知识 Python是一种有趣且功能强大的编程语言。它非常易于学习,同时又具有广泛的应用领域,比如Web开发、数据分析、机器学习和人工智能等。在Python的数学运算中,求绝对值是一个常见的需…

chatgpt赋能python:Python浮点型的两种表示方法

Python浮点型的两种表示方法 Python是一种解释型的动态语言,可以处理多种数据类型。其中,浮点型是其中一种数据类型,它包括十进制和科学计数法两种表示方法。 十进制表示法 十进制浮点数是Python的基本浮点类型,可以表示实数。…

2023 hnust 湖南科技大学 大数据技术与应用 期末考试 复习资料

前言 感谢:lqx(主要内容来源),hqh 有自己的理解和魔改 可以参考的资料 课后题答案我爬取的老师布置的学习通课后题往年资料csdn里面找到的:1、2老师ppt上课划重点录音 不提供pdf文件,方便修改&#xff0…

探索技术极致,未来因你出‘粽’

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

chatgpt赋能python:Python游戏——为什么它成为未来最热门的游戏开发工具

Python游戏——为什么它成为未来最热门的游戏开发工具 在游戏开发中,Python一直是非常强大和受欢迎的语言。Python具有很多吸引人的特点和实用功能,它为游戏开发者提供了多种可能,我们在本文中将介绍Python游戏以及为什么它越来越受欢迎。 …

【从零开始学习JAVA | 第十一篇】ArrayList集合

目录 前言: ArrayList: 常用成员方法: 案例练习: 1.集合的遍历方式(引用数据类型): 2:集合的遍历方式(基本数据类型): 总结:…

一面、二面、三面有什么区别?

很多公司面试都分一面、二面、三面甚至更多,大家可能会好奇,为什么要面这么多面,每一面又有啥区别呢? 首先我来回答下为什么要这么多面,最核心的是最后3点: 如果光是一个人面,担心会看走眼&…

python基础学习6【DatatimeIndex与PeriodIndex函数+Timedelta类+连接数据库+agg()函数和aggregate()函数】

转换与处理时间序列数据 转换字符串时间为标准时间: Timestamp类型:最基础最常用。 pd.to_datetime(data[lock_time])#转换 如果超出时间戳最大值,最小值,时间戳存储可能不成功 : DatatimeIndex与PeriodIndex函数【其实俺暂时…

【Spring Cloud Sleuth 分布式链路跟踪】 —— 每天一点小知识

💧 S p r i n g C l o u d S l e u t h 分布式链路跟踪 \color{#FF1493}{Spring Cloud Sleuth 分布式链路跟踪} SpringCloudSleuth分布式链路跟踪💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云…

scratch lenet(9): C语言实现tanh的计算

文章目录 1. 目的2. tanh ⁡ ( x ) \tanh(x) tanh(x) 的 naive 实现2.1 数学公式2.2 naive 实现 3. tanh ⁡ ( x ) \tanh(x) tanh(x) 的快速计算3.1 Maple 中的近似公式3.2 tan_c3()3.3 Gauss 连分数公式 (Continued Fraction) 4. 最终代码和运行结果代码运行结果 5. 其他Ref…