01 什么是class?
类定义由成员数据和成员方法组成,这些方法操作和成员数据绑定在一起。
02 什么是object?
object是类(class)的实例。Class 是对象的定义。当创建一个类时,它不占用任何内存,但是当类的实例(对象)被创建时,它们会占用内存空间。
03 什么是encapsulation(封装)?
封装是指将方法和数据集合在一个对象中。
04 什么是inheritance(继承)?
继承是子类继承其父类属性和方法的一种机制。子类可以通过覆盖方法和添加额外的属性和方法来进行扩展。
05 什么是polymorphism(多态)?
利用继承和虚拟方法,不同的对象可以使用相同名称的方法进行不同的行为
06 函数重载和函数覆盖之间的区别是什么?
重载是指在同一个类中定义相同名称但具有不同参数的成员函数,编译器会选择正确的函数。
覆盖是指子类重新定义从父类继承的成员函数。此时,子类和父类的成员函数名称相同,但是行为不同。
07 OOP的优点是什么?
· 数据隐藏有助于创建安全的程序。
· 通过继承可以避免使用冗余代码。
· 通过OOP,程序升级比较容易。
08 解释一下虚拟方法。
Virtual tasks和functions是在system verilog中实现多态性的方法。可以尝试理解下面的示例:
定义一个基类:
class base ;
virtual function int print;
$display("INSIDE BASE \n");
endfunction : print
endclass : base
定义一个继承类:
class derived extends base;
function int print;
$display("INSIDE DERIVED \n");
endfunction : print
endclass : derived
示例程序,表明差异:
program test ;
derived d1;
initial
begin
d1 = new();
d1.print();
callPrint (d1);
end
task callPrint (base b1);
$display("Inside callPrint \n");
b1.print;
endtask : callPrint
endprogram
09 abstract class有什么用途?
virtual class是子类的模板。一个virtual class也被称为abstract class。virtual class使用virtual 关键字声明,例如:
不能构造virtual class的实例对象,但可以定义virtual class的句柄。
virtual class baseframe;
...
virtual function void iam();
endfunction
...
endclass
class shortframe extends baseframe;
...
function void iam();
$display ("Short Frame");
endfunction
endclass
class longframe extends baseframe;
...
function void iam();
$display ("Long Frame");
endfunction
endclass
baseframe two; // OK
initial begin
two = new(4); // ERROR
...
10 virtual interface的应用是什么?
Virtual interface将testbench与dut的实际信号分离。用户可以在验证组件中操作一组virtual 信号,而不是直接应用DUT实际信号。Virtual interface促进了代码的重用,对底层设计的更改不需要重写使用Virtual interface的代码。
下面的示例显示了如何使用相同的事务类与各种不同的DUT进行交互:
interface SBus; // A Simple bus interface
logic req, grant;
logic [7:0] addr, data;
endinterface
class SBusTransctor; // SBus transactor class
virtual SBus bus; // virtual interface of type Sbus
function new( virtual SBus s );
bus = s; // initialize the virtual interface
endfunction
task request(); // request the bus
bus.req <= 1'b1;
endtask
task wait_for_bus(); // wait for the bus to be granted
@(posedge bus.grant);
endtask
endclass
module devA( Sbus s ) ... endmodule // devices that use SBus
module devB( Sbus s ) ... endmodule
module top
SBus s[1:4] ; // instantiate 4 interfaces
devA a1( s[1] ); // instantiate 4 devices
devB b1( s[2] );
devA a2( s[3] );
devB b2( s[4] );
initial begin
SbusTransactor t[1:4]; // create 4 bus-transactors and bind
t[1] = new( s[1] );
t[2] = new( s[2] );
t[3] = new( s[3] );
t[4] = new( s[4] );
end
endmodule
在上面的示例中,SbusTransctor 类是一个简单的可重用组件。它的编写没有任何全局或层次引用,在编写时不知道与它交互的特定设计。该类可以与遵循接口协议的任意数量的设计(示例中为4个)进行交互。
END
作者:验证哥布林
原文链接:
https://mp.weixin.qq.com/s/1cc9G-sKeSPEBKPiKs4gVw
微信公众号:
推荐阅读
更多IC设计技术干货请关注IC设计技术专栏