Systemverilog 疑惑解答第一季

  • `include与import的差别在哪里?

SV常会用`include将多个文件"平铺"置于某个域中(scope),这个域可能是package/module/interface等,简单理解就是`include就是将对应文本的内容平铺到当前域的字段中;inport则是从包(package)中引用某些需要的数据类型,例如class/parameter/enum到当前域,以帮助编译器能够识别被引用的类型.

 

  • 在一些头文件(.svh)中,会有typedef class X,这是什么意思?

首先这需要与常见 的typedef enum/struct的类型定义区别;常见的类的定义依然是利用"X extends …"的类型实现,而这里则是为了编译时能够让编译器识别class X采用的占坑的方法,即先声明类X的存在,并且在后续将X的定义字段"X extends …"及进行补充.

 

  • Modeule中的task和function声明时要不要添加automatic?

首先需要清楚在module,interface中声明的无论是变量还是方法都是静态属性(static),这意味着module中的task/function默认是静态方法.同时这些静态方法的变量默认也是静态,因此在调用它们时会遇到静态变量内存共享而出现不同线程在同样的时间中调用相同方法引起结果干扰的问题.

避坑指南:module/interface中的方法在声明时默认添加automatic.

 

  • interface在那些地方应该使用virtual?

首先记住interface在验证环境中的使用,就是充当验证环境和RTL设计之间交互的媒介.它在TB例化时,参考module实例化的方法.因此在module中它是"硬件属性",而它在验证环境中各个验证组件均需要通过它访问接口信号,因此在class中它是"软件属性",并且需要添加virtual表示接口句柄.

 

  • Clocking block的用处

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

 

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

module中的initial语句块调度在Active region,而program中的initial语句块调度在Reactive region。在program中使用非阻塞赋值来驱动设计信号,在re-NBA区域中对其进行更新。

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

 

  • 方法中的参数的默认方向如何辨别?

对于function/task,如果参数的方向尚未声明,那么它的方向为input方向. 如果声明了方向,那么该参数以及后续的参数方向均相同.

 

  • return的使用场景有哪些?

return可在function和task中使用.在返回值为void的function,或者在task中调用return,即会立即退出该方法.如果function返回值为非void,那么在退出 该function时还会返回数值.

 

  • fork的使用
  1. fork-join:fork线程块等待三个子线程都执行完毕之后才结束;
  2. fork-join_any:fork线程块只需要等待子线程中的任何一个子线程执行完毕就可以执行后面的任务.
  3. fork-join_none:fork线程块无需等待任何子线程完成,没有任何延迟即可执行后面的任务.

 

  • {}操作符的使用场景有哪些?
  1. 作为并置运算符串联一些向量或者字符串,例如{a,b}
  2. 作为复制运算符,例如{4{w}}中内嵌的一对{};
  3. 对组合型数值赋值时,可使用{},对非组合型数组赋值时,可使用`{};
  4. 在面熟覆盖点与仓时使用{};
  5. 在定义enum/struct时使用{}.

 

  • 方法中inout和ref差别?

inout会在方法调用中完成入口处由外部变量到形式参数的拷贝,以及在方法退出时,由形式参数到外部变量的拷贝,即一共两次值的拷贝.ref即是由外部变量传递进入,即不再发生形式参数的拷贝过程.也可以理解为指针reference.

 

  • package不可包括module和interface.可以定义数据变量,方法,DPI方法声明,class,parameter,covergroup和property等.

 

  • 什么是静态变量,什么是动态变量

module,interface,和package中的变量和方法都是静态的.但是不需要额外声明它们.即它们的生命周期在仿真加载后即存在并且伴随仿真结束.class中的变量和方法刚刚相反,都是动态的,只有在创建该对象的同时才会为其成员开辟空间,而一旦该对象被销毁,其成员的空间也将一同销毁.

 

  • library 和package怎么区分?

library是将module和interface为主题的类型编译并且归置到一起的容器,在链接(elaboration)中,可以允许使用library来解决同名和不同设计组交付的问题.package更倾向于软件一侧的概念,而且它实际上也只允许将数据类型后者软件类型(类如class)放置其中,并进一步被编译到library.

 

  • new函数和其他函数有哪些不同?

每一个类都必须具备一个new函数,用户可以不单独定义new函数,但系统会在编译时为其隐式声明一个空白实现的new函数,再调用new函数时,先为其开辟空间,且伴随成员变量声明和初始化,进入new函数体执行语句;new函数定义时不能制定返回类型,而在调用时其返回的是该对象的句柄.

 

  • this的使用场景有哪些?

this是当前类预定义的对象句柄,即其指向当前类的域scope。使用this,可以明确的指示其所访问的成员变量或方法是该类的成员,而非来自外部的域。this可在非静态方法/约束/内嵌约束或在类定义的covergroup中使用。

 

  • SV的对象其空间什么时候会被回收?

对象创建时一个内存空间开辟的行为,必须伴随着new函数。SV对对象空间的管理是自动安排的,即如果环境中没有任何一个句柄再指向该对象时,那么该控件将会被回收,从而实现内存动态管理。

 

  • 关键词new的使用场景有哪些?

对于对象,旗语semaphore,信箱mailbox,在创建时,均需要使用new函数,因此可以将旗语和信箱的实例也看作“对象”,对于动态数组,再重新开辟空间时需要new[]操作。

 

  • 关键词this和super有什么联系和差别?

this所查找的范围为当前类以及所继承的父类(以及以上层次),即该类声明或继承的所有成员,并且按照变量就近索引的原则(自当前子类往上逐级查找)。

super查找范围限定于该子类的父类(及以上层次),适用于访问某些被子类覆盖的成员.

 

  • 虚方法声明与不声明的区别是什么?

虚方法的声明就是便于父类句柄在访问子类对象的成员方法是,不需要通过句柄转换,既可以动态查找.

 

  • Covergroup 的采样事件如何指定?

可以在定义covergroup时,通过指定采样事件来要求覆盖组完成自动采样,例如: covergroup g1 @(posedge clk);也可以通过调用covergroup的与定义函数sample()完成数据采样.

 

  • 解释数据类型logic,reg和wire之间的区别

Wire:用于连接不同的元件,不存储值,被连续赋值语句assingn或者端口port驱动。

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

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

 

  • 什么是callback?

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

 

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

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

 

  • packages的用途是什么?

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

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

 

  • 什么是$root?

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

 

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

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

 

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

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

 

  • 解释pass by ref和pass by value?

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

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

 

  • program和module有什么区别?

Program是在SystemVerilog中新添加的,它用于以下目的:

(1.分离testbench与DUT

(2.有助于确保testbench和DUT没有竞争冒险(race condition)

(3.提供了执行testbench的入口点

(4.通过(program ... endprogram)指定了Reactive Region的调度。

module和program之间的主要区别是

(1. program内部不能包含always语句块,而module可以

(2. program中不能包含UDP,modules或其他program实例,而module可以

(3. program在调度队列的re-active region中执行,module在active region中执行

(4. program可以调用modules或其他program中task或function,但是module不能调用program中的task或function。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页