• SystemVerilog学习-06-类的封装


    类的概述

    面向对象的编程(object oriented programing,OOP),核心思想是把数据和相关的方法(也叫子程序,即一些处理数据的task或function)封装成一个类(class)。这样,用户可以在更高的抽象层次建立测试平台。用户可以在更加抽象的层次建立测试平台和系统级模型,通过调用函数来执行—个动作而不是简单地改变信号的电平。在验证环境中,包括stimulator、monitor、checker以及其它验证组件都可以按照OOP的方式来构建。

    例如一个数据包,可能被定义为一个类,类中可以包含指令、地址、队列ID、时间戳和数据等成员。packet这个类可以在其中对这些数据做初始化,设置指令,读取该类的状态以及检查队列ID。

    每一个packet类例化的具体对象其数据成员都可能不相同,然而packet类作为描述这些数据的抽象类型,将其对应的数据成员和操作这些数据成员的方法都定义在其中。

    OOP术语

    • 类(class) :包含成员变量和成员方法,包含变量和子程序的基本构建块。Verilog中与之对应的是模块(mod-ule)。
    • 对象(object):类在例化后的实例。在Verilog 中,你需要实例化一个模块才能使用它。
    • 句柄(handle)︰指向对象的指针。在Verilog 中,你通过实例名在模块外部引用信号和方法。一个OOP句柄就像一个对象的地址,但是它保存在一个只能指向单一数据类型的指针中。
    • 原型(prototype):程序的声明部分,包含程序名、返回类型和参数列表。程序体则包含了执行代码。

    构建函数

    SV并不像C++语言一样要求复杂的存储空间开辟和销毁的手段,而是采用了像Java—样空间自动开辟和回收的手段。因此SV的类在定义时,只需要定义构建函数(constructor) ,而不需要定义析构函数(destructor) 。

    类在定义时,需要定义构建函数,如果未定义,则系统会自动帮助定义一个空的构建函数(没有形式参数,函数体亦为空)。对象在创建时,需要先声明再例化,同时进行亦可。

    class Packet;
    	integer comnand ;
    	function new ();
    		command = IDLE ;
    	endfunction
    endclass
    Packet p = new ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    静态成员

    类的成员(变量/方法)默认都是动态(automatic)生命周期 ,即每一个对象的变量和方法都会为其开辟新的空间。如果多个对象为了共享一个成员(变量/方法),那么可以为其添加关键字static。

    多个对象因此可以共享同一个成员变量或者方法。访问该成员时,无需进行对象的例化。

    class Packet ;
    	static integer fileID = $fopen( "data" , "r" ) ;
    	...
    endclass
    Packet p;
    c = $fgetc( p.fileID ) ; //OR Packet: : fileID
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    成员方法也可以声明为静态。静态方法无法访问非静态成员(变量/方法),否则会发生编译错误。

    this用法

    this是用来明确索引当前所在对象的成员(变量/参数/方法)。this只可以用来在类的非静态成员、约束和覆盖组中使用。this的使用可以明确所指向变量的作用域。

    class Demo ;
    	integer x;
    	function new (integer x);
    		this.x = x;
    	endfunction
    endclass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    赋值和拷贝

    声明变量和创建对象是两个过程,也可以一步完成。

    Packet p1;
    p1 = new ;
    
    • 1
    • 2

    如果将p1赋值给另外一个变量p2,那么依然只有一个对象,只是指向这个对象的句柄有p1和p2。

    以下这种方式表示p1和p2代表两个不同的对象。在创建p2对象时,将从p1拷贝其成员变量例如integer、string和句柄等,该种拷贝方式称为浅拷贝(shallow copy) 。

    Packet p1;
    Packet p2;
    pl = new ;
    p2 = new pl ;
    
    • 1
    • 2
    • 3
    • 4

    数据的隐藏和封装

    类的成员(变量/方法)默认情况下,即是公共属性的。这表示对于类自身和外部均可以访问该成员。

    对于商业开发,类的提供方会限制一些类成员的外部访问权限,继而隐藏类成员的更多细节。这种方式也使得类的外部访问接口更为精简,减轻了类的维护工作量,也使得类在修改时便于与l旧版本保持兼容。数据隐藏的方式使得类的测试和维护都变得更为简单。

    如果使用local,则只有该类可以访问此成员,而子类或者外部均无法访问

    如果使用protected,则表示该类和其子类均可以访问此成员,而外部无法访问

    reference

    1. 西电路科验证PPT
  • 相关阅读:
    Cookie详解
    黑客(网络安全)技术自学30天
    申请400电话需要的条件及办理流程
    澳利率攀升,加息步伐将在某个时候放缓
    LayUI多文件上传,支持历史上传预览
    Android无法获取已安装应用包名的问题
    浅谈最长公共子序列引发的经典动态规划问题
    算法训练day41Leetcode343. 整数拆分 96.不同的二叉搜索树
    将“192.2.0.1“转换为“192.002.000.001“
    小程序中的权限设计
  • 原文地址:https://blog.csdn.net/weixin_41445387/article/details/125544136