【SV】systemverilog 类的使用,需弄懂的“两个问题”

类是systemverilog中最基础的概念之一。其中的概念基本上跟C++等软件语言中差不多,有软件基础的同学,对这个学习起来就比较快。本文就弄懂两个问题,如何定义类,如何使用类。
【SV】systemverilog 类的使用,需弄懂的“两个问题”_第1张图片
1,如何定义类
【SV】systemverilog 类的使用,需弄懂的“两个问题”_第2张图片
1),哪里定义类
在program中定义类,特别是在测试用例中比较常用,定义扩展类。另外就是在package中包类,将相关的类,变量和方法大包在一起。module中定义类,用得比较少,有机会可以try一下;

2),类的术语,如何定义
这个跟其他面向对象的软件语言一样,systemverilog要简单点。
定义类的时候,第一步就定义句柄,也就是指针,所有方法中对类的使用都是通过该指针来访问的。但是只定义句柄还无法使用,还没有分配真正的空间,需要new一下,这样才产生一个对象,而句柄即指向这个对象的。
有了句柄,可以控制对象,其属性和方法均通过.可以方便操作。
new函数大部分自定义的类均要有自己的定制new函数,这样可以方便赋初始值。

3),如何释放
类对象是占用内存空间的,占用大量内存空间的对象,最好能够释放调,如transaction,在比对结束后可以释放。方式一般是用null。

2,如何使用类
systemverilog是面向对象的语言,基本的使用方法跟其他面向对象的语言差不多,这里不赘述。本文只总结sv类中常用的几个概念。
【SV】systemverilog 类的使用,需弄懂的“两个问题”_第3张图片
1),常用方法
几乎实际的项目中,每个自定义的类中均要定义这几个方法,display,copy,pack/unpack。
display便于打印debug。
copy用于类深拷贝特别是在有多重扩展类的处理中。
pack/unpack 是对象流处理,将类压缩成bytes流,可让验证组件之间数据传递更具有重用性。

2),静态成员
包括静态变量和静态方法。
默认情况下,类中的变量均是局部变量,不同对象之间不共享。如果要共享,就需要定义静态变量。
如要统计同一种类的对象的个数,就可以用static int count=0来统计。
静态变量,则是对静态变量的处理,如静态变量的显示。
Transaction::count。

3),类的扩展
要用好类的扩展,需理解下面概念:
a,基类和扩展类,用extend扩展继承;
b,虚方法,扩展类方法对基类的覆盖;
c,类型转换。有了基类和扩展类,比如就有两者之间的相互赋值和转换。扩展类对象可以直接赋值给基类对象,而相反则不行,需要用 $cast来强制检查赋值。
d,抽象类。虚拟的类,无法用于定义对象,但是可以作为相同继承类的最基础的模子。可以很方便的统一各中继承类的风格。

4),类的另一种扩展
类除了3)中描述的扩展之外。还有为了解决某些应用场景的扩展,非常常用。这个场景的一个典型的例子就是有些测试用例需要特殊的铸错时,需要在不改动验证平台的基础上铸错。
该扩展方法是蓝图或者回调。目前我的项目中用的比较多的还是回调。
回调就是钩子,在验证平台是预定一个钩子,通过测试用例使用回调任务,方便的调用新对象,从而注入新定义的错误。
virtual class driver _cbs;
virtual task pre_do(tr);
endtask
virtual task post_do(tr);
endtask
endcalss

class driver;

driver_cbs cbs[$];

task do();
forever bein
drv.get(tr);
foreach(cbs[i]) cbs[i].pre_do(tr);
transmit(tr);
foreach(cbs[i]) cbs[i].post_do(tr);
end
endtask

class driver_cbs_tc extends driver_cbs;
virtual task pre_do(tr);
//add do code
endtask
end

program automatic test

initial begin
         begin
               driver_cbs_tc cbs_tc=new();
               env.drv.cbs.push_back(cbs_tc);//回调
         end

end

endprogram
回调的用法在项目里面用得实在太多,需重点掌握。VMM/UVM平台基本所有组件的类都有回调的用法。

5),类参数化。
类的参数化的好处自不必多说,一个建议,如果你的验证平台会在多个项目中继承使用,在搭建平台的初期就请做好参数化定义。

你可能感兴趣的:(Systemverilog)