0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SystemVerilog语言中的Upcasting和Downcasting概念解析

芯片验证工程师 来源:芯片验证工程师 作者:验证哥布林 2022-11-24 09:58 次阅读

要想理解清楚SystemVerilog语言中的Upcasting和Downcasting概念,最好的方式从内存分配的角度理解。

57c37406-6b24-11ed-8abf-dac502259ad0.png

class “e”扩展自class “c”,class “c”又继承自class “a”。同时,class “b”扩展自class “a.”

如果我们执行了下面的代码:

 a a1; //base class variable
 e e1;
 e1 = new;
 a1 = e1; //assigning extended object handle 'e1' to base class variable 'a1'

当我们实例化'e1 = new()'时,同时我们实例化了class e, class c和class a。

将扩展对象句柄“e1”赋值给基类句柄a1,就是一个“upcast”。

这意味着,如果你此时你访问“a1.i”,实际上访问到的就是上面class a所占用的内存空间。

换句话说,“a1.i”、“c1.i”和“e1.i”实际上是不同的内容。

SystemVerilog支持Upcasting,即将扩展类句柄直接赋值给基类句柄。

 a a1;
 e e1;
 a1 = new;
 e1 = a1; //ILLEGAL

在上面的例子中,我们实例化了对象a1,此时会为对象a1分配内存空间,但是此时并没有为对象c1和对象e1分配内存空间。

所以,如果此时我们赋值“e1 = a1”是不允许的,因为e1并没有一个合适的物理空间去指向。

这种就是downcasting的概念,只能通过$cast()进行检查之后(如果a1确实指向了一个足够的内存空间e1就可以赋值)才能完成赋值。

$cast(e1,a1); //dynamic casting

首先看一个将子类句柄赋值给父类的示例:

class p_class;
bit [31:0] p_Var;
function void display();
$display("p_Var = %0d",p_Var);
endfunction
endclass

class c_class extends p_class;
bit [31:0] c_Var;

function void display( );
super.display( );
$display("c_Var = %0d",c_Var);
endfunction
endclass

module top;
initial begin
p_class p;
c_class c = new( );
c.p_Var = 10;
c.c_Var = 20;
//assigning child class handle to parent class variable
p = c;
c.display( );
end
endmodule

在这个例子中,我们声明了一个父类“p_class”和其扩展类“c_class.”

然后赋值c_class中的属性 c.p_Var和c.c_Var,最后进行upcasting,打印信息如下:

p_Var = 10
c_Var = 20
 V C S S i m u l a t i o n R e p o r t

因为我们在实例化c_class时,同样为其父类p_class分配了内存空间。

相反,如果我们将父类句柄赋值给子类句柄

c = p

会得到一个编译错误

Error-[SV-ICA] Illegal class assignment
testbench.sv, 32
"c = p;"
Expression 'p' on rhs is not a class or a compatible class and hence cannot
be assigned to a class handle on lhs.
Please make sure that the lhs and rhs expressions are compatible.

我们再看一个upcast的示例:

class animals;
 string color = "white";
 function void disp;
 $display("color = %s", color);
 endfunction
 endclass
 
 class bufalo extends animals;
 string color = "black";
 function void disp;
 $display("color = %s", color);
 endfunction
 endclass
 
 program tb;
 initial begin
 animals p;
 bufalo c;
 c = new( ); //allocate memory for c
 //this will allocate memory for both 'c' and 'p'
 p = c; //upcasting
 p.disp;
 c.disp;
 end
 endprogram

仿真log:

color = white
color = black

$fnish at simulation time 0
 V C S S i m u l a t i o n R e p o r t

在上面的例子中,虽然我们只是实例化了扩展类bufalo,但是同时也为父类animals分配的内存空间,所以打印了

color = white
color = black




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8224

原文标题:SystemVerilog中的Upcasting和Downcasting

文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中多级指针的概念和使用方法

    多级指针在C语言中是一种特殊的指针类型,它可以指向其他指针的指针。
    发表于 08-16 16:16 1083次阅读

    C语言中指针的基本概念和用法

    在C语言中,指针是一项重要的概念,它允许我们直接访问和操作内存地址。
    发表于 08-17 15:30 759次阅读

    C语言中枚举的基本概念和常见用法

    在C语言中,枚举是一种方便组织和表示一组相关常量的工具。枚举类型有助于提高代码的可读性和可维护性。本文将介绍C语言枚举的基本概念、语法和用法,以及一些高级技巧。
    发表于 08-17 15:32 1448次阅读

    基于Rust语言中的生命周期

    Rust是一门系统级编程语言具备高效、安和并发等特,而生命周期是这门语言中比较重要的概念之一。在这篇教程中,我们会了解什么是命周期、为什么需要生命周期、如何使用生命周期,同时我们依然会使用老朋友
    的头像 发表于 09-19 17:03 897次阅读

    SystemVerilog设计语言

    SystemVerilog 是过去10年来多方面技术发展和实际试验的结晶,包括硬件描述语言(HDL)、硬件验证语言(HVL)、SystemC、Superlog和属性规范语言。它们都从技
    发表于 09-07 09:55 1173次阅读

    基于SystemVerilog语言的验证方法学介绍

    文章主要介绍《VMM for SystemVerilog》一书描述的如何利用SystemVerilog语言,采用验证方法学以及验证库开发出先进验证环境。文章分为四部分,第一部分概述了用Syst
    发表于 05-09 15:22 52次下载
    基于<b class='flag-5'>SystemVerilog</b><b class='flag-5'>语言</b>的验证方法学介绍

    C语言中的关键字

    C语言中的入门教程
    发表于 10-14 16:24 3次下载

    SystemVerilog语言介绍汇总

    作者:limanjihe  https://blog.csdn.net/limanjihe/article/details/83005713 SystemVerilog是一种硬件描述和验证语言
    的头像 发表于 10-11 10:35 2390次阅读

    详细介绍go语言中的闭包的实现

    什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式语言中概念
    的头像 发表于 10-20 16:18 1853次阅读

    带你了解go语言中的闭包

    概念,没有研究过函数式语言的用户可能很难理解闭包的强大,相关的概念超出了本书的范围。Go语言是支持闭包的,这里只是简单地讲一下在Go语言中
    的头像 发表于 11-02 15:27 2442次阅读

    IEEE SystemVerilog标准:统一的硬件设计规范和验证语言

    IEEE SystemVerilog标准:统一的硬件设计规范和验证语言
    发表于 08-25 15:52 1次下载

    go语言中怎么使用HTTP代理

    go语言中怎么使用HTTP代理。
    的头像 发表于 09-01 14:41 2412次阅读

    Systemverilog event的示例

    event是SystemVerilog语言中的一个强大特性,可以支持多个并发进程之间的同步。
    的头像 发表于 10-17 10:21 1550次阅读

    FPGA学习-SystemVerilog语言简介

    SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了 C语言 数据类型、
    的头像 发表于 12-08 10:35 2147次阅读

    简述C语言中指针重点

    在C语言中一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址,其概念与以前类似,只是返回的值的类型是指针类型。
    的头像 发表于 03-10 15:28 599次阅读