SystemVerilog OOP | static variable and methods | part 1

 

SystemVerilog是一门面向对象的语言(OOP), 在Testbench里面可以通过对不同的block进行功能分类,分别让其完成各种不同的工作,将任务分解,从而增加开发效率,以及代码的可维护性。而分类的结构就是构建一个一个的class.

例如: transaction, driver, scoreboard works for specific tasks.

  • transaction block used for generate stimulus
  • driver for sending stimulus to DUT
  • scoreboard contains checkers and verifies the functionality of a design

SystemVerilog的类主要是由属性和方法构成,而对于其属性和方法的声明都可以是静态的(static)或者非静态的(默认的non-static).本文中会介绍类中static与non-static两种声明方式的区别,以及class的function放置的两种位置,另外关于object回收方法。

static or non-static varible and function

静态变量

  1. 在没有例化的情况下,可以直接通过className::Varible进行访问变量。

  1. 例化object后,所有object中对应静态变量addr都是一样的。通过object1.addr 获取到的值与通过object2.addr获取到的值两者是一样的。(而且通过class直接读取到获取Transaction::addr的值也是一样的,也就是说所有地方获取到的addr值都是一样的)

静态方法

  1. 声明静态方法时需要在function关键字的最前面加上一个static关键字,可以通过::或者. 进行访问。
  2. 静态方法可以在没有实例化class的情况下通过::进行访问
  3. 静态方法中不能包含非静态变量。

function的位置

可以声明在class内部或者外部。声明在外部主要是为了增加代码的可读性(能够一眼看完整个class的轮廓),其中声明的方式如下

  1. 在class内部使用extern关键词创建协议接口,extern function void display()
  2. 在class外部声明方法, function void PCI_Tran::display();

注意: 1. 修饰函数的关键字需要加在内部;2. 传入方法的默认参数也需要加载class内部,外部可加可不加

SystemVerilog对Object的回收是当程序检测到object没有相应的handle的时候开始对其进行回收(其中一种最简单的回收机制)。


本文原创,错误之处在所难免!盼指出!