验证面试常见问题系列
一,uvm中testbench.v里都做了什么?
在 UVM (Universal Verification Methodology) 中,testbench.v
是测试平台的主要文件之一,其中会进行以下操作:
- 导入必要的 UVM 类库和其他需要的库文件。
- 定义和实例化各个组件和对象,包括 UVM 环境、UVM 测试用例、DUT (Design Under Test) 和其他相关组件。
- 设定仿真时钟,包括时钟源和时钟周期。
- 配置各个组件的连接关系和数据通路,通常使用 UVM 扫描器(uvm_config_db)来配置。
- 创建和启动 UVM 进程,例如 UVM 进程对象(UVM process)和 monitor 进程。
- 运行测试用例,调用 UVM test 的
run_test()
方法来开始测试过程。 - 处理仿真结束后的清理工作,例如打印测试报告、关闭仿真等。
testbench.v
文件是整个 UVM testbench 的主要入口,其中会组织和管理 UVM 环境、测试用例、监控器、驱动、代理和其他需要的组件,以及定义仿真时钟和其他系统级设置。此外,testbench.v
还可以包含其他自定义功能和扩展,以满足具体的测试需求。
二、testbench目录下的define文件可以存放哪些宏?
在 Testbench 目录下的 define 文件可以存放各种宏定义,以便在整个测试平台中使用。这些宏定义可以用于配置、控制和定制测试环境和测试用例。以下是一些常见的宏定义示例:
-
参数设定:可以包含各种参数的宏定义,如时钟周期、数据宽度、延迟等。
`define CLK_PERIOD 10 `define DATA_WIDTH 32 `define DELAY 5
复制插入
-
信号名称:可以定义各个信号的名称,以便在测试环境和测试用例中使用。
`define RESET_N top_tb.dut_reset_n `define CLK top_tb.dut_clk `define START_SIGNAL top_tb.dut_start
复制插入
-
编译开关:可以定义各种编译时开关,以控制特定功能的启用或禁用。
`define ENABLE_FEATURE_A `define DISABLE_FEATURE_B
复制插入
-
导入库文件:可以定义需要导入的库文件路径,以便在测试环境和测试用例中使用。
`define LIB_PATH "path/to/verif_lib.sv"
复制插入
-
日志和报告输出:可以定义各种日志级别和报告输出选项,以控制日志和报告的详细程度。
`define LOG_LEVEL_DEBUG `define ENABLE_REPORTS
复制插入
定义的宏可以在整个 testbench 文件夹中的各个文件中使用,以配置和控制测试环境和测试用例的行为。
三、run_phase和main_phase之间的关系;
-
run_phase
和main phase
(动态运行)都是task phase
,且是并行运行的,后者称为动态运行(run-time
)的phase
。 -
如果想执行一些耗费时间的代码,那么要在此
phase
下任意一个component
中至少提起一次objection
,这个结论只适用于12个run-time
的phase
。对于run_phase
则不适用,由于run_phase
与动态运行的phase
是并行运行的,如果12个动态运行的phase
有objection
被提起,那么run_phase
根本不需要raise_objection
就可以自动执行。
四、举例说明UVM组件中常用的方法,各种phase关系,phase机制作用
-
UVM
中有很多非常有趣的机制,例如factory
机制,field_automation
机制,phase
机制,打印机制,sequence
机制,config_db
机制等,这些机制使得我们搭建的UVM
能够有很好的可重用性和使得我们平台运行有秩序稳定。 -
例如
phase
机制,phase
机制主要是使得UVM
的运行仿真层次化,使得各种例化先后次序正确。UVM
的phase
机制主要有9个,外加12个小phase
。主要的phase
有build phase、connect phase、run phase、report phase、final phase
等,其中除了run phase
是** task**
,其余都是function
,然后build phase
和final phase
都是自顶向下运行,其余都是自底向上运行。Run phase
和12个小phase
(reset phase、configure phase、main phase、shutdown phase
)是并行运行的,有这12个小phase
主要是进一步将run phase
中的事务划分到不同的phase
进行,简化代码。注意,run phase
和 12个小phase
最好不要同时使用。从运行上来看,9个phase
顺序执行,不同组件中的同一个phase
执行有顺序,build phase
为自顶向下,只有同一个phase
全部执行完毕才会执行下一个phase
。 -
所有的
phase
按照以下顺序自上而下自动执行:(九大phase,其中run phase又分为12个小phase)build_paseconnect_phase
end_of_elaboration_phase
start_of_simulation_phase
run_pase
extract_phase
check_phase
report_phase
final_phase
其中,run_phase按照以下顺序自上而下执行:
pre_reset_phase
reset_phase
post_reset_phase
pre_configure_phase
configure_phase
post_configure_phase
pre_main_phase
main_phase
post_main_phase
pre_shutdown_phase
shutdown_phase
post_shutdown_phase
五、组件之间的通信机制,analysis port和其它的区别
-
通信分为,单向通信,双向通信和多向通信
-
单向通信:指的是从
initiator
到target
之间的数据流向是单一方向的 -
双向通信:双向通信的两端也分为
initiator
和target
,但是数据流向在端对端之间是双向的 -
多向通信:仍然是两个组件之间的通信,是指
initiator
与target
之间的相同TLM端口数目超过一个时的处理解决办法。
-
blocking阻塞传输的方法包含:
-
Put():
initiator
先生成数据Tt
,同时将该数据传送至target
。 -
Get():
initiator
从target
获取数据Tt
,而target
中的该数据Tt
则应消耗。 -
Peek():
initiator
从target
获取数据Tt
,而target
中的该数据Tt
还应保留。
-
通信管道:
-
TLM FIFO
:可以进行数据缓存,功能类似于mailbox
,不同的地方在于uvm_tlm_fifo
提供了各种端口(put、get、peek)
供用户使用 -
analysis port
:一端对多端,用于多个组件同时对一个数据进行处理,如果这个数据是从同一个源的TLM
端口发出到达不同组件,则要求该端口能够满足一端到多端,如果数据源端发生变化需要通知跟它关联的多个组件时,我们可以利用软件的设计模式之一观察者模式实现,即广播模式 -
analysis TLM FIFO
a. 由于analysis
端口提出实现了一端到多端的TLM
数据传输,而一个新的数据缓存组件类uvm_tlm_analysis_fifo
为用户们提供了可以搭配uvm_analysis_port
端口uvm_analysis_imp
端口和write()
函数。
b.uvm_tlm_analysis_fifo
类继承于uvm_tlm_fifo
,这表明它本身具有面向单一TLM
端口的数据缓存特性,而同时该类又有一个uvm_analysis_imp
端口analysis_export
并且实现了write()
函数:
-
request & response通信管道 双向通信端口
transport
,即通过在target
端实现transport()
方法可以在一次传输中既发送request
又可以接收response
。