一文理解cast转换

news/2024/11/24 8:00:32/

目录

写在前边

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;endfunctionfunction void print();$display("HELLOW %s",m_name);endfunction
endclass:fatherclass child1 extends father;string plane="plane";function new(string name);super.new(name);endfunction
endclass:child1module top;father f;child1 c1;child1 c2;initial beginf=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;endfunctionfunction void print();$display(" 1 :HELLOW %s, index = %b",m_name, index);endfunction
endclass:fatherclass child1 extends father;string plane="plane";bit    index = 1;function new(string name);super.new(name);endfunctionfunction void print();$display("2: HELLOW %s, index = %b",m_name, index);endfunctionendclass:child1module top;father f;child1 c1;child1 c2;initial beginc1=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.ppmy.cn/news/525462.html

相关文章

安全合规进入场景细分时代

2022年6月1日,《中华人民共和国网络安全法》(以下简称《网络安全法》)正式实施迎来5周年。 作为国家实施网络空间管辖的第一部法律,《网络安全法》标志着我国网络安全工作有了基础性的法律框架,意味着建设网络强国的制…

ons模拟器 linux,ons模拟器

《ons模拟器》是一个开源Galgame游戏引擎,可以在多种平台和设备上运行文字冒险类游戏。文字冒险游戏是以精彩的剧情为卖点的游戏,以文字叙述为主,并以CG或动画为辅演出剧情,并设有分支和多个结局。是冒险游戏的一个分支&#xff0…

线上学python哪家好-广州学Python学校哪家好

导语概要 广州达内python开发培训学python全栈式开发+人工智能做时代前端的工程师快速咨询横跨多个互联网核心领域的PythonPython工程师可从事多领域编程工作课程简介企业中Linux应用广泛,无论 广州达内python开发培训 学python全栈式开发+…

python语言培训班-深圳Python语言培训班

导语概要 深圳达内python开发培训学python全栈式开发+人工智能做时代前端的工程师快速咨询横跨多个互联网核心领域的PythonPython工程师可从事多领域编程工作课程简介深圳达内Python课程经过学 深圳达内python开发培训 学python全栈式开发+人工智能 做…

python找不到sys模块_学习机安装Python3.4.3失败提示找不到sys模块怎么办

源码安装,make install到一半显示generate-posix-vars failed,但目录下已经有了python.exe(Linux平台)。 传-V或--help有输出,传-S可以用但是自带库没有了,传-或-i或不传参数,一下三种提示会随机出现一种: …

java课程设计拼图_基于Java拼图游戏的设计与实现(含录像)

基于拼图游戏的设计与实现(含录像) 摘 要 本拼图游戏是基于J2SE平台开发的,它是一个Application,它的游戏规则和诺亚舟里的拼图游戏是一样的。这个游戏将一张大图切割成N张小图,然后在其中 任意挑出N-1张小图,使它们随机出现在N个位置。通过鼠标或键盘的方向键移动已经切…

mysql 一对多表查询_Mysql多对多查询、列合并

表信息 资源表 synsource 199824 rows 产品表 tab_product_detail 108 rows 资源与产品多对多的关联表 tab_r_sourmach 1,113,866 rows以上表均采用MyISAM引擎. 连接…

linux运行getch吗,怎么样在linux下,实现getch函数功能

getch();接受一个任意键的输入,不用按回车就返回。该函数的返回值是所输入字符的ASCII码,且该函数的输入不会自动显示在屏幕上,需要putchar();函数输出显示。getch();函数常用于中途暂停程序方便调试和查看。 有没有办法本人用c语言封装一个在…