汇总了数字芯片实验室公众号的文章,微信搜索即可。
附IC面试常考题链接:
SystemVerilog常见问题汇总
- 1、什么是callback?
- 2、什么是factory pattern?
- 3、解释数据类型logic、 reg和wire之间的区别
- 4、clocking block的用处?
- 5、使用SystemVerilog避免Testbench与DUT之间竞争冒险的方法有哪些?
- 6、SystemVerilog中有哪些覆盖率(coverage)的类型?
- 7、virtual interfaces的需求是什么?
- 8、解释Abstract classes和virtual methods
- 9、抽象类(abstract class)的用途是什么?
- 10、用来建立scoreboard的数据结构是什么
- 11、 与队列(queue)相比,链表(linked-list)的优点是什么?
- 12、 r a n d o m 和 random和 random和urandom有什么区别?
- 13、列出预定义(predefined)的随机方法。
- 14、packages的用途是什么?
- 15、$cast的用途是什么?
- 16、如何在派生类中调用父类中定义的任务?
- 17、rand和randc有什么区别?
- 18、什么是$root?
- 19、什么是双向约束(bi-directional constraints)?
- 20、在constraint之前“solve”是什么意思?
- 21、不使用randomize方法或rand,生成随机循环数组
- 22、解释pass by ref和pass by value?
- 23、什么是静态变量?
- 24、bit[7:0] sig_1和byte sig_2有什么区别?;
- 25、program和module有什么区别?
- 26、如何在program语句块中实现always语句块?
- 27、modports的用途是什么?
- 28、写一个时钟发生器而不使用always语句块。
- 29、什么是前向引用(forwardreferencing),如何避免此问题?
- 30、什么是循环依赖(circular dependency),如何避免这个问题?
- 31、什么是交叉覆盖率(cross coverage)?
- 32、如何在fork / join中kill一个进程?
- 33、什么是立即断言(Immediate Assertions)和并发断言(Concurrent Assertions)
- 34、如何随机化动态数组对象?
- 35、什么是randsequence?它的用途是什么?
- 36、什么是bin(仓)?
- 37、哪种最适合用来建模事务(transaction)?Struct还是class?
- 38、SV是否比Verilog更random stable?
- 39、如何在不干扰随机数生成器状态的情况下控制约束?
- 40、SV中alias有什么用?
- 41、为什么需要在transaction内部显式实现copy()方法,而不是直接将一个对象赋值给另一个对象?
- 42、在SV中实现struct和union有何不同?
- 43、什么是“this”?
- 44、什么是tagged union ?
- 45、什么是“范围分辨率运算符”(scope resolution operator)?
- 46、bits和logic之间有什么区别?
- 47、$ rose和posege有什么区别?
- 48、什么是覆盖率驱动的验证(coverage driven verification)
- 49、什么是分层验证平台?
- 50、验证环境中的simulation phases是什么?
- 51、如何根据随机索引从queue中选择元素?
- 52、什么数据结构用于在scoreboard中存储数据,为什么?
- 53、什么是流操作符,其用途是什么?
- 54、什么是void function?
- 55、如何确保传递的ref函数参数不被改变?
- 56、initial语句块和final语句块有什么区别?
- 57、如何检查句柄是否存有对象?
- 58、旗语(semaphores)的用处是什么?
- 59、代码覆盖率(code coverage)和功能覆盖率(functional coverage)有什么区别?
- 60、always_ff的用途是什么?
- 61、什么是static function和automatic function?
- 62、在systemverilog中怎么给数组赋值?
- 63、Systemverilog中有哪些数组类型?
- 64、为什么要使用断言(assertions)?
- 65,如果功能覆盖率超出代码覆盖率,那意味着什么?
- 66、如何在system verilog中指定与timescale无关的#delay?
- 67、super关键字的意义是什么?
- 68、什么是静态变量?
- 69、什么是public声明?
- 70、local声明有什么用?
- 71、如何在clocking block中声明异步信号?
- 72、介绍SystemVerilog中的fork-join?
- 73、什么是chandle ?
- 74、在systemverilog中为function和task添加了哪些功能?
- 75、什么是SystemVerilog中的DPI?
- 76、什么是封装(Encapsulation)?
- 77、如何计算mailbox中的元素数量?
- 78、什么是covergroup?
- 79、什么是super class, abstract class和concrete class?
- 80、什么是Verification plan? What it contains?
- 81、Associative arrays(关联数组)和dynamic arrays(动态数组)之间的区别?
- 82、如何检查随机化是否成功?
- 83、SVA中的property是什么?
- 84、什么是立即断言(immediate Assertions)?
- 85、什么是断言严重性系统任务?如果我们不指定这些任务会怎样?
- 86、在哪个事件调度区域中将评估并发断言?
- 87、并发断言的主要组成是什么?
- 88、SVA中的连续重复运算符是什么?
- 89、SVA中的goto复制运算符是什么?
- 90、仅在property内部使用的隐含运算符。
- 91、Interface的优点是什么?
- 92、automatic变量在进程中的用处是什么?
- 93、unpacked array与packed array之间的差异。
- 94、 Dynamic array
- 95、什么时候使用关联数组(Associate array)
- 96、什么是队列(queue)
- 97、什么是变量的Scope和lifetime
- 98、什么是clocking skew
- 99、关于继承两个例子
- 100、定义控制字段
- 101、如果设计工程师和验证工程师在Testbench和DUT中犯同样的错误怎么办?如何能够发现错误?
- 102、如果客户发现了芯片的Bug,该如何调试?如何防止它再次发生?
- 103、解释pass byref和pass by value?
- 104、如何在派生类中调用父类中定义的方法?
- 105、函数重载(function overloading)和函数覆盖(functionoverriding)之间有什么区别?
- 106、数据类型logic,reg和wire有什么区别?
- 107、clocking模块有什么用处?
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)的类型?
- 代码覆盖率(Code coverage):量化执行了多少行代码**(line coverage),执行了哪些路径(path coverage),位变量的值是否覆盖了“0”和“1”(toggle coverage),状态机中的哪些状态和转换已被访问(FSM coverage)**。
- 功能覆盖率(Functional Coverage):和Code coverage不同,Functional Coverage衡量的是设计意图实现的完备性,是主观的。
- 断言覆盖率(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和 random和urandom有什么区别?
$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