SystemVerilog-$cast详解

2023-11-13

$cast在子类与父类之间的复制

1 子类cast给父类:$cast(father_cls, child_cls)

之前有提到,$cast是将两个类型强制转换,$cast(A,B),将B强制类型转换给A,应用在类上,就是句柄的强制赋值操作,那么在子类和父类之间的赋值呢?其实是原理是一样的,规则也只能是子类的句柄赋值给父类,如下图所示代码块:

1.	program cls_cp;
2.	    class base_cls;
3.	        int a = 100;
4.	        inner_cls i_a;
5.	        function new();
6.	            i_a = new();
7.	        endfunction
8.	    endclass
9.	
10.	    class child_cls extends base_cls;
11.	        int b = 300;
12.	    endclass
13.	
14.	    initial begin
15.	        base_cls base_0;
16.	        child_cls child_0;
17.	        child_0 = new();
18.	        $cast(base_0, child_0);
19.	    end
20.	
21.	endprogram

且经过cast后,等同于赋值操作,即父类的句柄指向子类的对象,且只能访问子类对象的继承类的成员变量。仿一下看看:

       反过来cast,直接报错:

2. 父类cast给子类:$cast(child_cls, father_cls)

       上文提到,父类是不能cast给子类的,那么在什么情况下可以呢?其实很容易想到,就是在父类的句柄指向子类的对象的时候,cast可以生效,如下图所示代码块:

1.	program cls_cp;
2.	    class base_cls;
3.	        int a = 100;
4.	        inner_cls i_a;
5.	        function new();
6.	            i_a = new();
7.	        endfunction
8.	    endclass
9.	
10.	    class child_cls extends base_cls;
11.	        int b = 300;
12.	    endclass
13.	
14.	    initial begin
15.	        base_cls base_0;
16.	        child_cls child_0;
17.	        child_0 = new();
18.	        base_0 = child_0;
19.	        $cast(child_0, base_0);
20.	    end
21.	
22.	endprogram

这样的化,通过父类的cast,其实就是子类的对象,同样的父类也不能访问子类本身的成员变量,父类改变自身的成员变量,子类调用自己父类的成员变量时也会发生改变。仿一下看看:

       修改父类的成员变量,子类也会跟着改:

       实际上,这种赋值是没有意义的,类的赋值要体现在不同的对象之间,用这种方式可以实现父类作为桥梁赋值给另一个子类的对象,在UVM中得到了大量的使用。

改一个,另一个也跟着改变,读者可以自行尝试改变child_1的成员变量,以及改变cls_0的成员变量,看是否另外的两个类成员变量也发生改变。值得注意的是,cls_0依然无法访问child_0和child_1中的成员变量。过程如下图所示:

 

3. 两个不同的子类之间的cast

同一个子类的不同对象之间是可以cast的,那么不同子类直接能否cast?能否通过父类进行cast?这里先给出结论:都是不可以的,原因是cast在对于类进行操作时,认为相同类型的两个句柄,可以cast,那么如果两个不同子类声明的句柄,cast会认为是不同的类型,因此不能转换,即使他们继承自一个父类,同样通过父类的cast也是不可以的。如下图仿真:

        直接报错,通过父类进行不同子类之间的cast,也不可以:

$cast在子类与父类之间深拷贝的用法

在3.2节理解了cast在父类和子类的用法后,本节以一个具体的实例,说明cast在深拷贝中的应用,例如如下代码块:

1.	program cls_cp;
2.	
3.	    class inner_cls;
4.	        int in_a = 200;
5.	        function void copy(inner_cls ii);
6.	            ii.in_a = this.in_a;
7.	        endfunction
8.	    endclass
9.	    class base_cls;
10.	       int a = 100;
11.	        inner_cls i_a;
12.	        function new();
13.	            i_a = new();
14.	        endfunction
15.	        virtual function void copy(base_cls i_c);
16.	            i_c.a = this.a;
17.	            i_c.i_a.copy(this.i_a);
18.	        endfunction
19.	        virtual function void display();
20.	            $display("a in father cls is %d ", a);
21.	        endfunction
22.	    endclass
23.	
24.	    class child_cls extends base_cls;
25.	        int b = 300;
26.	        function void display();
27.	            $display("b in child cls is %d ", b);
28.	        endfunction
29.	
30.	        function void copy(base_cls c);
31.	            child_cls cc;
32.	            super.copy(c);
33.	            $cast(cc, c);
34.	            cc.b = this.b;
35.	        endfunction
36.	
37.	    endclass
38.	
39.	    initial begin
40.	        child_cls child_0;
41.	        child_cls child_1;
42.	        child_0 = new();
43.	        child_1 = new();
44.	        child_1.copy(child_0);
45.	    end
46.	
47.	endprogram

分析:在子类中重载了父类的copy函数,重载的过程是,先声明了一个子类,然后调用父类的copy函数,将父类的成员变量进行深拷贝赋值,包括父类的深层次成员变量inner_cls,然后再通过$cast方法,将父类赋值给子类,这样在子类cc中,就有了父类成员变量的复制本,最后将子类的成员变量进行复制,完成深拷贝。

       此处其实有一个问题,就是之前不是说父类不能够cast给子类吗?为什么这里可以写,因为在实际调用的时候,是两个子类之间的复制,通过调用子类的copy函数,copy函数的参数传递的是子类的句柄,在函数传参的过程中,也就将形式参数父类的句柄指向了实参子类的对象,因此可以cast。

       仿真结果:

 

       读者可以自行尝试注释行的仿真,结果应该是一样的。

       UVM里用到了大量这样的方法,掌握这个原理,对于理解UVM的应用,以及SystemVerilog更高级的建模,都十分有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SystemVerilog-$cast详解 的相关文章

  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • 在vivado中使用tcl脚本(UG894)

    本文源自UG894 主要介绍如何在vivado中使用tcl脚本 1 vivado中如何获取tcl help vivado中任何自带的命令都可以通过 help 获取帮助信息 也可以直接输入 help 取得vivado命令合集 并通过 help
  • 数字IC手撕代码-兆易创新笔试真题

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代
  • 数字芯片流程

    芯片设计分为前端设计和后端设计 前端设计 逻辑设计 和后端设计 物理设计 并没有同意严格的界限 这个过程中涉及到了与工艺有关的设计就是后端设计 一 需求分析 产品需要解决的问题 预测3 5年的趋向和走势 确保前瞻性 确保芯片是有卖点的 客户
  • PLL时钟约束

    方法 1 自动创建基时钟和 PLL 输出时钟 例 derive pll clocks 这一方法使您能够自动地约束 PLL 的输入和输出时钟 ALTPLL megafunction 中指定的 所有 PLL 参数都用于约束 PLL 的输入和输出
  • J-Link仿真器与JTAG和SWD下载与接线

    目录 1 JTAG 1 1JTAG今天被用来主要的三大功能 1 2JTAG引脚 1 3可选引脚 2 SWD 2 1 SWD引脚 2 2 可选择引脚 2 3 JTag和SWD模式引脚定义 3 J Link仿真器 4 IAR与MDK配置两种下载
  • DEBUG:Generate Bitstream失败

    问题 约束失败 解决 确保IO初始化引脚正确 和选择合适的电平
  • verilog中wire和reg类型的区别

    module counter parameter CNT MAX 25 d24 999 999 input wire sys clk input wire sys rst n output reg led out reg 24 0 cnt
  • 笔试

    文章目录 前言 40 复位电路设计 1 recovery time和removal time 2 同步复位和异步复位 3 异步复位同步释放 本文参考 往期精彩 前言 嗨 今天来学习复位电路设计相关问题 微信关注 FPGA学习者 获取更多精彩
  • 最详细的Vivado安装教程

    V i v a d o 安 装
  • 【FPGA】:频率测量

    转载 1 FPGA频率测量的三种方法 直接测量法 间接测量法 等精度测量法
  • 实验1-FPGA编程入门

    文章目录 一 认识全加器 二 输入原理图实现1位加法器 一 半加器原理图输入 二 全加器原理图输入 三 Verilog语言实现全加器 四 总结 五 资料参考 一 认识全加器 一 半加器 1 逻辑分析 如下图所示 半加器只有两个输入和两个输出
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • Verilog HDL——Modelsim仿真

    常用testbench语法 finish 和 stop finish任务用于终止仿真并跳出仿真器 stop任务则用于中止仿真 timescale time unit time precision time unit指定计时和延时的测量单位
  • ALLEGRO等长时如何将PIN DELAY和VIA长度计算在内

    在PCB设计中 对于时序要求严格的线路 Via和IC pin delay的长度必须得到重视 通过下面的操作 可将Via和Pin delay加入到线路长度的计算中 1st 计算Pin delay 打开Constraint Manager 选择
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注 大部分参考内容来自 征途Pro FPGA Verilog开发实战指南 基于Altera EP4CE10 2021 7 10 上 贴个下载地址 野火FPGA Altera EP4CE10征途开发板 核心板 野火产品资料下载中心 文档 hd
  • [从零开始学习FPGA编程-24]:进阶篇 - 基本组合电路-编码器与译码器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 125247358 目录 前言 Veri
  • 【FMC141】基于VITA57.4标准的4通道2.8GSPS 16位DA播放子卡(2片DAC39J84)

    FMC141是一款基于VITA57 4标准的4通道2 8GSPS 2 5GSPS 1 6GSPS采样率16位DA播放FMC子卡 该板卡为FMC 标准 符合VITA57 4与VITA57 1规范 16通道的JESD204B接口通过FMC 连接
  • 硬核 | 从零制作一个激光雷达需要多久?

    编辑 ADS智库 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 硬件交流 技术交流群 本文只做学术分享 如有侵权 联系删文 激光雷达 LiDAR 是激光探测及测距系统的简称 目前广泛应用在无
  • 无线网络管理系统与无线路由器的区别

    第5章 波形发生器软件设计 本章我们将介绍系统的软件设计 系统中控制软件占有很重要的地位 它不仅要产生波形数据 控制波形的发生 还要控制显示电路和键盘电路 因此系统软件的好坏直接决定着系统的功能和稳定 5 1软件的总体结构 在本系统中 由于

随机推荐

  • SignalR前后端进行通信时,出现了内存泄露

    在做此需求之前 需要知道 1 当前wafer功能已经用canvas实现了 2 die指的是图片中每一个小格子 3 当前正在工作的die用黄色进行高亮 已经工作过的die用灰色表示 4 几台基本每秒工作3个die wafer图片 最近在做一个
  • 【Linux】基础IO -- 软硬链接

    前言 上篇Linux的文章 我们学习到了文件系统中 对磁盘文件的管理 而本篇文章 我们要以文件系统的基础知识 了解软硬链接 话不多说 马上开始今天的学习 文章目录 前言 一 软链接 1 软链接的语法 2 软链接的本质 3 软链接的应用 二
  • axios vue 加载效果动画_vue+elementUI+axios实现的全局loading加载动画

    在项目中 很多时候都需要loading加载动画来缓解用户的焦虑等待 比如说 我打开了一个页面 而这个页面有很多接口请求 但浏览器的请求并发数就那么几个 再加上如果网速不行的话 那么这时候 用户很可能就会纠结自己到底该不该留下来继续等待呢 所
  • VC编程获取MSN口令的代码

    MSN Messenger uses Windows Credential UI credui dll on WinXP 2003 Password Storage mechanism differs in these OSes so th
  • 微服务的终极杀器SpringCloudAlibaba组件精讲

    一 微服务 1 1 微服务简介 In short the microservice architectural style is an approach to developing a single application as a sui
  • 02_jQuery与Ajax

    jquery jquery的作用 他是js的库 处理html 事件 实现动画效果 方便的为网站提供AJAX交互 命名格式 ji 体积大 用于学习和debug使用 min js 压缩的文件 体积小 用于线上环境使用 使用方法 必须先在页面文件
  • 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)

    五种开源协议的比较 BSD Apache GPL LGPL MIT 本篇博客比较了常见的5种开源协议的异同 大家在为自己的代码选择协议的时候可以参考 现今存在的开源协议很多 而经过Open Source Initiative组织通过批准的开
  • 标准C读BMP图象的一个小代码

    include
  • TCP/IP UDP广播无法发送或接收

    TCP IP UDP广播无法发送或者接收数据 在看 TCP IP 网络编程 这本书的时候 看到广播那一节 跟着书上写代码 怎么写都不行 广播就是没法发送 接收 发送端一直在发送数据 接收端就是没有反应 对了好几遍源码 没有问题 实在是愁人
  • 深入浅出理解Paxos算法

    Paxos算法是莱斯利 兰伯特 英语 Leslie Lamport LaTeX中的 La 于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法 Paxos算法一开始非常难以理解 但是一旦理解其实也并不难 之所以难理解其实是因为作
  • 远程服务器无密登入设置

    现在还在输密码进入服务器的话 如果频次高的话 显得就很浪费时间 实际上可以通过无密登陆服务器 只需要设置好ssh就可以 这样只要你打开你电脑的终端不管是Mac OS还是Linux输入ssh root 远程服务器IP 这个命令就会自动登陆到远
  • 如何保障数仓数据质量?

    有赞数据报表中心为商家提供了丰富的数据指标 包括30 页面 100 数据报表以及400 不同类型的数据指标 它们帮助商家更合理 科学地运营店铺 同时也直接提供分析决策方法供商家使用 并且 每天在跑的底层任务和涉及的数据表已经达到千级别 面对
  • 【Python 1-10】Python手把手教程之——一篇讲透if语句以及if语句的特殊用法

    作者 弗拉德 来源 弗拉德 公众号 fulade me if 简单示例 假设你有一个汽车列表 并想将其中每辆汽车的名称打印出来 对于大多数汽车 都应以首字母大写的方式打印其名称 但对于汽车名 bmw 应以全大写的方式打印 下面的代码遍历一个
  • 技术至简-7:2G/3G/4G/5G基站系统中混合调制的技术框架

    2G 3G 4G 5G基站系统并非采用单一的调制技术 是数字调制和模拟调制的综合 是QAM调制与IQ调制的综合 是幅度调制与相位调制的综合 1 调制模型 在此模型中 包含了三种调制 1 数字基带调制 PSK QAM调制 2 模拟基带调制 I
  • Git日常问题: 什么是LFS?及其错误解决办法

    文章目录 Git LFS 错误 Git LFS 解决办法 Git LFS 错误 本地已经存在一个git仓库 想将其推送到一个远程仓库 结果遇到了git lfs错误 打印如下 git remote rename origin old orig
  • 解决DCNv2在Linux上安装失败的问题

    项目场景 今天同学安装 DCN Deformable Convolutional Networks 可变形卷积网络 v2的 PyTorch 版本时遇到了很多问题 弄了将近一天也没解决 于是求助笔者帮忙解决 这里记录一下成功的解决方案 问题描
  • MATLAB算法实战应用案例精讲-【回归算法】XGBoost算法(附Java、Python和R语言代码)

    目录 前言 xgboost面试过程中几个高频问题 1 xgboost如何处理缺失值
  • 什么是JDBC?并写出JDBC的开发流程。

    JDBC Java DataBase Connectivity 直译为 java数据库连接 实际上jdbc是java中的一套和数据库交互的api application program interface 应用程序编程接口 因为java程序
  • 【uni-app】修改原生导航栏文字和文字样式

    修改文字 uni setNavigationBarTitle 这是修改后的导航栏文字 title 首页 修改文字颜色以及导航栏背景色 uni setNavigationBarColor frontColor ffffff 文字颜色 back
  • SystemVerilog-$cast详解

    cast在子类与父类之间的复制 1 子类cast给父类 cast father cls child cls 之前有提到 cast是将两个类型强制转换 cast A B 将B强制类型转换给A 应用在类上 就是句柄的强制赋值操作 那么在子类和父