类(class)定义对象(object)的属性和行为,即例如一个人有手有脚(属性)、能提桶能跑路(行为)。
类是一个没有实体的描述,根据这个描述可以创建多个相同类型的对象。
多个对象之间的属性通过各自的方法进行交互,共同协作完成一个目的就是程序。
class vs module
在验证平台中使用systemverilog class和使用verilog module是显著不同的。因为类和对象是动态的,具有短暂的生命周期,而verilog module中的所有变量在仿真过程中都是静态的,所以大家往往在verdi里面能拉出verilog设计的信号,而无法拉出systemverilog验证环境中的变量。
在功能验证中,验证平台的构建和激励的发送其实也都是动态的过程,某个请求完成DUT的激励和响应的检查就不再存在,应该释放掉内存。所以使用类来搭建测试平台会更加合理高效。
在UVM中uvm_component和uvm_object都是类,不过uvm_component作用的时间会更长一点。
class 代码示例
class car ;//class definition
int m_num_doors; // number of doors
bit m_is_locked[]; // locked state per door
task drive_forward();
$display("Car is driving forward");
endtask : drive_forward
task unlock_door(input int door);
m_is_locked[door] = 0;
endtask
task lock_door(input int door);
m_is_locked[door] = 1;
endtask
function new(input int num_doors=4);
m_num_doors = num_doors;
m_is_locked = new[num_doors];
foreach(m_is_locked[i]) m_is_locked[i] = 1;
endfunction
endclass : car
module top;
car my_car;
initial begin
my_car = new(4);
my_car.lock_door(0);
my_car.unlock_door(0);
my_car.drive_forward();
end
endmodule
上面的代码示例是一个典型的class&object和程序的示例:
1、首先这个类或者对象具有2个属性:
m_num_doors:表示这个车具有多少个门
m_is_locked[]:数组的大小会在new函数中根据门的个数设定,表示门打开或者关闭的状态
2、然后这个类具有3个方法:
drive_forward:开车,这边只是简单的打印
lock_door:关特定的门
unlock_door:开特定的门
3、最后的initial begin-end就是前面提到的“程序”,根据程序设计的目的,调用某些类的方法以操作不同的属性,以实现同一个对象或者不同对象之间的交互。
从这个角度来看,程序就是对象属性之间的通信。