Dinglei_hello · 2021年12月27日

System Verilog面试题(二)

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
微信公众号:
 title=

推荐阅读

更多IC设计技术干货请关注IC设计技术专栏
推荐阅读
关注数
20197
内容数
1307
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息