SystemVerilog的面向对象的特性基本上和C/C++一样,学过Java、C++等语言再学习SystemVerilog会发现非常的轻松。所有我只对那些异同点和重要的点做笔记。
一、面向对象编写测试平台
在OOP中,事务就是测试平台的焦点。发生器创建事务并且将它们传给下一级,驱动器和设计进行会话,设计返回的事务将被监视器捕获,记分板会将捕获的结果跟预期的结果进行比对。测试平台则应该分成若干块,然后定义它们相互之间如何通信。那么在哪里定义类呢?可以把类定义在program、module、package中,或者在这些块之外的任何地方。类可以在程序和模块中使用。
二、创建新对象
- Verilog模块是在代码被编译的时候例化的。而一个SystemVerilog类是在运行中测试平台需要的时候才被创建。
- Verilog的例化是静态的,就像硬件一样在仿真的时候不会变化,只有信号值在改变。而SystemVerilog中,激励对象不断地被创建并且用来驱动DUT,检查结果。最后这些对象所占用的内存可以被释放,以供新的对象使用。
- Verilog的顶层模块是不会被显式地例化,但是SV类在使用前必须先例化。
- Verilog的实例名只可以指向一个实例,SV的句柄可以指向多个对象,当然一次只能指向一个。
三、对象的解除和分配
如果不回收内存,长时间的仿真会将内存耗尽,或者运行得越来越慢。垃圾回收是一种自动释放不再被引用地对象地过程。SV分辨对象不再被引用地办法就是记住指向它地句柄地数量,当最后一个句柄不再引用某个对象了,SV就会释放该对象地空间。
- SV地句柄只能指向一种类型,即所谓的”安全类型“,在C中一个无类型指针只是内存中的一个地址,可以将它设为任何数值;
- SV不允许对句柄作和C类似的改变,也不允许将一种类型的句柄指向类一种类型的对象;
- SV中自动回收垃圾,但是不能回收一个被句柄引用的对象。C/C++中指针可以指向一个不再存在的对象,垃圾回收是手动的;
- SV中如果对象包含有从一个线程派生出来的程序,那么只要该线程仍在运行,这个对象的空间就不会被释放,同样任何一个子线程所使用对象在该线程没有结束之前不会被解除分配;
四、在类之外定义方法
在SystemVerilog中你可以将方法的原型定义(方法名和参数)放在类的内部,而方法的程序体放在类的后面定义。使用关键字extern
块外方法声明
class A;
...
extern function void fun1();
endclass
function void A::fun1();
...
endfunction
五、作用域规则
- 作用域是一个代码块,例如一个模块、一个程序、任务、函数、类、begin-end块,for和foreach循环自动创建一个块;
- 可以在块中定义新的变量;
- 名字可以相对于当前作用域,也可以用绝对作用域表示,例如以$root开始,对于一个相对的名字,SV查找作用域内的名字清单,直到找到匹配的名字。
- 当你使用一个变量名的时候,SV将先在当前作用域内寻找,接着在上一级作用域内寻找,直到找到该变量为止。当作用域层数过多时,可以使用this明确地引用类一级的对象;
名字作用域
int limit; //$root.limit
program automatic p;
int limit; //$root.p.limit
class Foo;
int limit,array[]; //$root.p.Foo.limit
function void print(int limit);
for(int i = 0; i < limit; i++)
...
endfunction
endclass
initial begin
int limit = $root.limit;
Foo bar;
bar = new;
bar.array = new[limit];
ba

这篇博客深入探讨了SystemVerilog的面向对象特性,包括类的创建、对象的生命周期管理、动态对象、方法定义及作用域规则。强调了在测试平台中使用面向对象编程的重要性,如事务处理、对象复制和公有私有成员的控制。通过实例解释了如何避免在创建和使用对象时的常见错误,以及如何实现有效的内存管理和通信机制。
2677

被折叠的 条评论
为什么被折叠?



