- `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中使用非阻塞