知识点(验证)
主要是SV与覆盖率的问题
1.SV的基础知识
(1)数据类型logic
logic类型是SV对Verilog 中reg类型的改进,它既可以是变量,又可以被连续赋值、门电路和模块的
驱动。但是logic不能有多个驱动,在对双向总线建模时,此时需要线网类型。
logic属于四状态数据类型,分别为x z 1 0。四状态类型还包括wire reg integer time。四状态
数据类型在未赋值时默认是x,但wire是Z。
对于双状态数据类型,其连接到输出时需要注意,如果输出为X或Z时,其输出可能是1或0,并不
确定所以当电路有可能输出X或Z时,需要将其转换为1。
(2)动态数组
动态数组是指在定义数组是,不指明数组的宽度,如a[],数组的宽度由[]表示,在仿真时通过new[]
操作符分配空间。
2、class类
(1)类的定义
//定义类为 class name
//实例化为.new()
class sv_class;
//成员变量
int x;
//成员函数
task set(int i);
x = i;
endtask
//成员函数
function int get();
return x;
endfunction
endclass
(2)继承
class parent_class;
bit [31:0] addr;
endclass
class child_class extends parent_class;
bit [31:0] data;
endclass
module inheritence;
initial begin
child_class c = new();
c.addr = 10;
c.data = 20;
$display("Value of addr = %0d data = %0d",c.addr,c.data);
end
endmodule
子类继承父类所有的成员变量与成员函数,并且子类可以使用父类所有的成员变量与成员函数。
(3)多态 父类的句柄指向子类实例时,此时调用该句柄的方法实际上只会调用父类的方法,除非使用virtual关键字。将父类中的方法定义为virtual,则指向子类的父类句柄就会根据所指向的子类调用子类方法,这一特性表现为超类句柄的多态
// base class
class base_class;
virtual function void display();
$display("Inside base class");
endfunction
endclass
// extended class 1
class ext_class_1 extends base_class;
function void display();
$display("Inside extended class 1");
endfunction
endclass
// extended class 2
class ext_class_2 extends base_class;
function void display();
$display("Inside extended class 2");
endfunction
endclass
// extended class 3
class ext_class_3 extends base_class;
function void display();
$display("Inside extended class 3");
endfunction
endclass
// module
module class_polymorphism;
initial begin
//declare and create extended class
ext_class_1 ec_1 = new();
ext_class_2 ec_2 = new();
ext_class_3 ec_3 = new();
//base class handle
base_class b_c[3];
//assigning extended class to base class
b_c[0] = ec_1;
b_c[1] = ec_2;
b_c[2] = ec_3;
//accessing extended class methods using base class handle
b_c[0].display();
b_c[1].display();
b_c[2].display();
end
endmodule
输出
Inside base class 1
Inside base class 2
Inside base class 3