温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SystemVerilog中$cast方法的作用是什么

发布时间:2021-08-11 14:45:15 来源:亿速云 阅读:784 作者:Leah 栏目:互联网科技

这篇文章给大家介绍SystemVerilog中$cast方法的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

$cast是systemverilog中的内建方法。

$cast可以对不同的内建类型进行转换,用的更多的是不同层次之间类的转换。在这种父类与子类之间的转换里, 父类站的高,子类在底下,从父类向子类的转换,称为向下类型转换,而子类向父类的转换称为向上类型转换。向上类型转换是安全的,而反之则是不安全的。原因在于子类既然继承了父类,就拥有父类的一切属性,除此之外,龙生九子,各有不同,子类还有自己独特的个性,这些是父类没有的。当进行向上类型转换时,相当于父类的句柄指向子类对象,这样的话句柄仍然能对子类对象与父类相同的属性进行访问。但是反过来,如果向下类型转换也那么自由,当试图把子类的句柄指向父类的对象会发生什么呢?父类本来划好了一小块地盘,但是因为子类含有比父类更丰富的属性,它很有可能会访问父类并不包含的资源,这时就找不到该资源,越界了,因此会有error。父类就好像上海,子类相当于长三角地区,包含但不仅仅是上海,因此父类能到的地方子类都可以到,反之不行,因此把子类的句柄给父类没关系,但反之不行,所以向下类型是需要有严格的类型检查的,阻止非法转换。

ex1:

class father;    string m_name;
   function new (string name);      m_name = name;    endfunction : new
   function void print ();      $display("Hello %s", m_name);    endfunction : printendclass : father
class child1 extends father;    string area1 = "jiangzhehu";
   function new (string area1);      super.new(area1);    endfunction : newendclass : child1
class child2 extends father;    string area2 = "shanghai";
   function new (string area2);      super.new(area2);    endfunction : newendclass : child2

program top;    father f;    child1 c10,c11,c12;    child2 c20,c21,c22;
   initial begin            f = new ("shanghai");            f.print();            c10 = new("jiangzhehu");            f = c10;            f.print();            c20 = new("changsanjiao");            f = c20;            f.print();            c20.area2 = "zhejiang";            $cast(c21, f);            c21.print();            $display("has %s", c21.area2);            c22 = c20;            c22.print();            $display("has %s", c22.area2);            c20.area2 = "hangzhou";            c21.print();            $display("has %s", c21.area2);            c22.print();            $display("has %s", c22.area2);
   end  endprogram : top

仿真结果如下:

# Hello shanghai# Hello jiangzhehu# Hello changsanjiao# Hello changsanjiao# has zhejiang# Hello changsanjiao# has zhejiang# Hello changsanjiao# has hangzhou# Hello changsanjiao# has hangzhou

请注意,不能直接把$cast(c21, f);前提是先把子类赋给父类才行。

使用cast也不能把c20给c10;

关于SystemVerilog中$cast方法的作用是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI