1.概念
- variables(properties)变量 -> model transaction
- subroutines(methods) -> 操作transaction
- member :properties + methods
oop 即 数据和对数据的操作封装到class里
2.Encapsulation
1) procedural programming(verilog or c)
数据和对数据的操作是分开的
transaction: wr_en , addr, data, crc
- 将参数传进来,定义参数
2)OOP programming (sv)
数据和对数据的操作是一起的,封装到class里
3.inheritance 继承
- 在transaction的基础上派生出子类,会继承父类的所有东西,子类里又可以增加很多东西, 子类可以覆盖父类的task or function(定义成父类相同的名字,如果想调用父类的东西,用super.函数名来调用)
base class -> derived class (eg: transaction -> error_trans)
- 提高可重用性,可重用的tb
父类赋给子类:$cast()
子类赋给父类,父类的句柄指向子类,就可以生成n多个transaction:
tr = etr;
or $cast(etr,tr);
4.Polymorphism 多态
多态是用virtual method实现,多态指的是同一种类型的对象,执行统一方法,可能会产生不同的结果
如果父类子类的function没有用virtual去实现,当子类赋给父类的句柄传进来的时候,仍然是指向父类的function。
5.Appendix
1. coding style:
对数据的操作放到类的外面 “ :: ” 指的是类作用域符号
2. 特殊的类
1)parameterized class
提高可重用性,写generic type,做成参数化,只需要改参数(例化的时候改参数就行)
2)typedef class
- 先声明再使用;
- 简化参数化类型的定义 typedef stack # (bit[31:0]) stack32;
3)static property and method
在program里一定要申明automatic, 尤其在fork join在加for循环的时候可能不知道i是多少。