保姆级教程超硬核包会,SystemVerilog SV类(class)

前言: 介绍了类的封装、类的继承、类的多态包的使用、随机约束、线程间的同步和通信和类型转化。文章很长但通俗易懂,耐心看下去你会通透的。

类class

类和模块的异同

  • 从数据和方法定义而言,二者均可作为封闭的容器来定义和存储。
  • 从例化来看,module(默认是静态)在仿真还没运行就被确定了,而class(默认是动态)是在仿真开始之后的任意时间被创建的。
  • 从封装性来看:class具有封装性可以保护变量,而module没有封装性,无法保护变量。
  • 从继承性来看:class具有集成性,class之间可以发生集成关系,而module没有继承性。

类与结构块的异同

  • 二者本身都可以定义数据成员
  • 类例化后才能存储动态数据,而结构块声明后即可。
  • 类可以声明方法,结构块不能。

1. 简单了解概念:类class

  • 类是可以包含数据和方法(function,task)的类型。
  • 类中可以包含指令、地址、队列ID、时间戳和数据等成员。
  • 定义了类,可以在其中对数据做初始化、设置指令、读取该类状态以及检查队列ID。
  • 对比于module,类是一个软件概念,在下文会做讲解。

2. 类的封装

类的三要素类的封装、类的继承和类的多态(虚方法)

2.1 简单用法

先从类中有什么,怎么用说起。

  • 类(class):包含成员变量和方法。
  • 对象(object):类在例化后的实例,只存在在仿真的后台
  • 句柄(handle):指向对象的指针。
  • 原型(prototype):程序的声明部分,包括程序名、返回类型和参数列表。

类有点类似于模块和结构体,但也有差别。从下面这段代码可以帮助理解类和模块的差别,类中的对象,句柄可以做一个简单的了解。

  1. 看完上边的代码,不难看出类(class)和模块(module)都是名字开头,end名字结束。模块(module)的例化不能发生在initial中,而结构块(struct)和类(class)可以在initial中的例化。

  2. packet_m m1,m1为例化后的模块;packet_s s1,s1为例化后的结构体,而对于packet_c c1,c1只是一个声明的句柄,并不是例化后的class。

  3. 只有当调用了new() 函数packet_c c3 =new();才算完成了类的例化,才能存放动态数据。使用new()相当于在内部开辟一个空间,这个空间的名字叫”对象”。但对象是一个偏软件的概念,想找这个对象只能通过句柄找,也就是句柄指向对象。

用顶级奸细d(对象)、普通奸细p(句柄)和接头点来模仿上述过程。特务组织首先培养p ,也就是class p,接着组织告诉p,他还有一个同伙d,他不是一个人在战斗因为隐藏的太深不能暴露身份。只能和他在固定的接头点联络。也就是p = new(),new()就是那个接头点。在任务中 d是不会暴露的也就是不会被找到,但是可以找到p,p可以去接头点找到 d。通透了吧/p>

运行上述代码,在仿真刚开始时,结构体s1,s2会有初始值,c1,c2(句柄)此时也会有初始值但为null,如下图。因为此时new() 的动作还没开始,只有在仿真以后才会创建空间。运行仿真以后c1,c2值不再为null。

  • 仿真刚开始,s1,s2值为32’hxxxxxxxx,c1,c2值为null。
  • 仿真开始后,c1,c2有了值,@packet_c表示所属的类,@1、@2表示第几次例化。 句柄(c1)指向对象(@packet_c@1)。
  • 上述s1,s2(在仿真刚开始就有初始值)就属于静态成员。类的成员(变量/方法)默认都是动态成员。每一个对象的变量和方法都会在仿真时开辟新的空间。

仿真刚开始:

  • 这段代码共创建了100个实例,因为调用了100次new()函数。
  • 当一个对象不再有句柄指向它时,这个对象会被回收,最终c1显示最后一个实例,之前的实例找不回来。

那这段代码做了几次例化呢/p>

答案是只有1次。调用了几次new()函数,例化了几次。 c2 = c1 这个赋值让c1,c2两个句柄指向了同一个对象。

  • 定义变量了integer i并赋值1。当被例化时,先执行i=1,接着会被new()函数中的i = 2 替换掉,所以最终i =2。
  • 对于lp这个子类会先在自己中搜索, 搜索不到会回到父类中搜索。

总结来说就是子类在没钱的时候,会去找父类要。那子类有钱还会找父类吗着往下看。

  • 子类lp自己定义了变量 i = 3 ;结果为3。
  • 看的出来子类此时并没有找父类,但父类的i = 2 其实在运行的时候已经被继承了,但在不同的域中。

如果此时在子类中添加function,结果还是3吗/p>

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年9月13日
下一篇 2022年9月13日

相关推荐