【数字IC前端】System Verilog常见问题

汇总了数字芯片实验室公众号的文章,微信搜索即可。
附IC面试常考题链接:

SystemVerilog常见问题汇总

1、什么是callback?

**callback(回调)**是一种在不更改实际代码的条件下更改为验证组件(例如driver,generator或monitor)行为的机制

class abc_transactor;
        virtual taskpre_send();
        endtask
        virtual taskpost_send();
        endtask
        task xyz();
                this.pre_send();
                this.post_send();
        endtask : xyz
 endclass :abc_transactor
 
class my_abc_transactor extend abc_transactor;
        virtual taskpre_send();
                ... //This function is implemented here
        endtask
        virtual taskpost_send();
                ... //This function is implemented here   
        endtask
endclass :my_abc_transactor

在上面的例子中,基类abc_transactor具有3个tasks,其中2个被声明为virtual task并且没有具体实现。另一个已完全实现xyz() task会调用这两个virtual task。(Virtual task必须实例化后才可使用,但是静态)

未实现的virtual task称为callback taskes(回调任务)。从基类abc_transactor扩展的子类my_abc_transactor将实现先前未实现的pre_send() task和post_send() task,无需更改xyz() task的代码。

通过这种方式,我们可以将可执行代码注入到函数xyz()task中,而无需对其进行修改。

例如你正在编写将被多个测试环境使用的基类,并且对于每个测试环境,基类中的某些task代码将发生变化,这时就可以将该task/function实现为callback method(回调方法)。

2、什么是factory pattern?

顾名思义,Factory pattern(工厂模式)旨在解决对象创建的问题。

class TOY; // Common data memeber string type;
        string type;
        virtual function stringget_type();
endclass 
 
class TOY_Tank extends TOY;
        function new();
                this.string ="Toy Tank";
       endfunction
        string function stringget_type();
                return this.string;
        endfunction
endclass

class TOY_Bus extends TOY;
        function new();
                this.string ="Toy Bus";
        endfunction
        string function stringget_type();
                return this.string;
        endfunction
endclass

上面是我们将要创建的对象。我们需要解决的下一个问题是编写TOY_factory类本身。让我们考虑以下情况:我们传递“1”来获得TOY_Tank类的实例,传递“2”来从TOY_Bus类的实例。

TOY_factory如下所示。

class TOY_factory;
        Toy my_toy
        // Common methods
        function toy get_toy(inttype);
                if(type == 1)
                        this.my_toy =new TOY_Tank();
                if(type == 2)
                        this.my_toy =new TOY_Bus();
                return this.my_toy;
        endfunction
endclass

3、解释数据类型logic、 reg和wire之间的区别

**Wire:**用于连接不同的元件,不存储值,被连续赋值(assign)或者端口(port)驱动

**Reg:**并不意味实际的寄存器,代表Verilog / SystemVerilog中的数据存储元素。保存值,直到将下一个赋值(不是通过assign语句赋值)。可以被综合成触发器,锁存器或组合电路

**Logic:**不能被多驱动,改进了Reg数据类型,可以被连续赋值。

4、clocking block的用处?

interface指定Testbench和DUT通信的信号。但是interface没有明确指定任何时序规则和同步要求。

SystemVerilog添加了clocking block指定任何时序规则和同步要求,以确保Testbench在正确的时间与DUT交互,还可以避免竞争冒险问题。

5、使用SystemVerilog避免Testbench与DUT之间竞争冒险的方法有哪些?

module中的initial语句块调度在Active region,而program中的initial语句块调度在Reactive region

在program中使用非阻塞赋值来驱动设计信号,在re-NBA区域中对其进行更新。

通过带有**#0** input skews的clocking blocks。

6、SystemVerilog中有哪些覆盖率(coverage)的类型?

  1. 代码覆盖率(Code coverage):量化执行了多少行代码**(line coverage),执行了哪些路径(path coverage),位变量的值是否覆盖了“0”和“1”(toggle coverage),状态机中的哪些状态和转换已被访问(FSM coverage)**。
  2. 功能覆盖率(Functional Coverage):和Code coverage不同,Functional Coverage衡量的是设计意图实现的完备性,是主观的。
  3. 断言覆盖率(Assertion coverage):衡量在测试过程中断言的触发。

7、virtual interfaces的需求是什么?

  • 无法在SystemVerilog中的non-module实体内部实例化Interface,但是需要验证环境中的class中驱动Interface。

  • Virtual interface是一种数据类型(可以在一个class中实例化),它保存着对实际接口的句柄(这意味着class可以使用virtual interface来驱动该interface)。

  • Virtua linterface提供了一种可以将验证平台抽象模型与构成设计的实际信号分开的机制。

  • virtual interface的另一个大优点是,类可以在运行时(run time)动态连接到不同的物理接口(physicalinterfaces)。

8、解释Abstract classes和virtual methods

可以从一个通用基类(base class)派生所需的类。基类列出了子类(subclasses)的原型。由于不打算实例化基类只用来派生子类,因此可以通过将基类指定为virtual class将其抽象化(Abstract)

virtual method为子程序提供了原型。如果abstract class具有virtual methods,则必须重写所有virtual methods才能实例化子类

这里涉及到OOP的多态(Polymorphism,dynamic method lookup)概念,可以直接从super class中引用那些subclasses的方法。

9、抽象类(abstract class)的用途是什么?

有时候仅需要描述一组对象的属性而无需知道其实际的行为。Abstract classes的方法和构造函数在扩展类中使用,扩展类可以通过Abstract classes共享方法。

10、用来建立scoreboard的数据结构是什么

Queue(队列)

11、 与队列(queue)相比,链表(linked-list)的优点是什么?

队列有固定的顺序,很难将数据插入队列中。但是链表可以轻松地将数据插入任何位置。
链表结构

12、 r a n d o m 和 random和 randomurandom有什么区别?

$random系统函数每次调用时都会返回一个32位带符号的随机数

$urandom系统函数每次被调用时都会返回一个32位无符号随机数

13、列出预定义(predefined)的随机方法。

1.randomize

2.pre_randomize

3.post_randomize

14、packages的用途是什么?

在Verilog中,模块内变量/任务/函数的声明特定于模块(module)。SystemVerilog的package结构允许声明全局变量/任务/函数,从而在modules/classes之间使用。

packages可以包含module/class/function/task/constraints/covergroup等声明,在使用时需要使用范围解析运算符(:😃import来访问packages中的内容。

package ABC;
        typedef enum {
   RED, GREEN,YELLOW} Color;
        void function do_nothing()
        endfunction
endpackage : ABC

import ABC::Color;
import ABC::*; // Import everything inside the package

15、$cast的用途是什么?

通过 $cast 可以将值赋给数据类型不同的变量。特别是在将基类的句柄赋值给扩展类的句柄。
$cast分为static casting和dynamic casting。

static casting示例:

i = int'(10.0-0.1); // static cast convert real to integer

dynamic casting示例:

function int $cast( singular dest_var, singular source_exp );
task $cast( singular dest_var, singular source_exp );

16、如何在派生类中调用父类中定义的任务?

super.task()

17、rand和randc有什么区别?

**rand-随机变量(Random Variable)😗*在出现所有可能的值之前,可能会出现相同的值。类似于有放回抽签。

randc-随机循环变量(RandomCyclic Variable):,在出现所有可能的值之前,不会出现相同的值。类似于无放回抽签。

18、什么是$root?

top-level scope,可用于引用任意层次中例化的模块

$root.A; // top level instance A

$root.A.B.C; // item C within instance B  within top level instance A

19、什么是双向约束(bi-directional constraints)?

默认情况下,SystemVerilog中的约束是双向的。这意味着约束求解器(constraint solver)不遵循约束指定的顺序,同时约束所有变量。例如,(a == 0)->(b == 1)应该作为(!(a == 0)||(b == 1))的所有可能解来求解。

20、在constraint之前“solve”是什么意思?

如果用户要指定约束求解器求解约束的顺序,则用户可以在约束之前通过solve指定顺序。

21、不使用randomize方法或rand,生成随机循环数组

int UniqVal[10];
foreach(UniqVal[i])  UniqVal[i]= i;
UniqVal.shuffle(); //打乱排序

22、解释pass by ref和pass by value?

Pass by value是将参数传递给functions和tasks的默认方法。每个子例程保留该参数的本地副本。如果在子例程声明中更改了参数,不会影响原来的值。

pass by ref中functions和tasks直接访问作为参数传递的指定变量,就像传递变量的指针一样。传递数组给子例程时,使用pass by ref可以避免大量数据的复制。如果不想更改数组值,可以使用const ref
对比

23、什么是静态变量?

class Transaction;

static int count = 0; // Number of objectscreated
int id; // Unique instance ID
function new();
    id = count++; // Set ID, bump count
endfunction
endclass

Transaction t1, t2;
initial begin
t1 = new(); // 1st instance, id=0, count=1
t2 = new(); // 2nd instance, id=1, count=2
$display("Second id=%d, count=%d",t2.id, t2.count);
end

无论创建许多Transaction对象,静态变量count只有同一个。

24、bit[7:0] sig_1和byte sig_2有什么区别?;

byt

  • 35
    点赞
  • 292
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值