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
静态变量
- 在没有例化的情况下,可以直接通过
className::Varible
进行访问变量。
- 例化object后,所有object中对应静态变量addr都是一样的。通过object1.addr 获取到的值与通过object2.addr获取到的值两者是一样的。(而且通过class直接读取到获取
Transaction::addr
的值也是一样的,也就是说所有地方获取到的addr值都是一样的)
静态方法
- 声明静态方法时需要在function关键字的最前面加上一个static关键字,可以通过
::
或者.
进行访问。 - 静态方法可以在没有实例化class的情况下通过
::
进行访问 - 静态方法中不能包含非静态变量。
function的位置
可以声明在class内部或者外部。声明在外部主要是为了增加代码的可读性(能够一眼看完整个class的轮廓),其中声明的方式如下
- 在class内部使用extern关键词创建协议接口,
extern function void display()
- 在class外部声明方法,
function void PCI_Tran::display();
注意: 1. 修饰函数的关键字需要加在内部;2. 传入方法的默认参数也需要加载class内部,外部可加可不加
SystemVerilog对Object的回收是当程序检测到object没有相应的handle的时候开始对其进行回收(其中一种最简单的回收机制)。
本文原创,错误之处在所难免!盼指出!