uvm最重要的是知道每个组件主要要做什么事情,组件之间的关系是什么,组件之间是如何进行通信的。
UVM里面常用的九个组件:uvm_sequence_item, uvm_sequence, uvm_sequencer, uvm_driver, uvm_monitor, uvm_agent, uvm_scoreboard, uvm_env, uvm_test。
组件之间的层次关系如图
在创建了组件过后,那么每个组件里面对应需要完成什么事情?
- sequence:激励的生成,在randomize的时候对激励加上约束,然后就可以达到特殊功能的激励了。
- driver: 在run_phase按照协议进行激励的输送
- monitor: 监控激励,根据协议实时监控dut里面的信号改变。
- scoreboard: 比较期望值与输出值,往往前面还会接一个reference model.
- agent: driver与sequence的连接,实例化创建。
- environment: 配置agent,包裹agent和scoreboard,tlm port的连接。
- test: 里面包裹environment,配置激励条件,最后向DUT里面输送不同的激励。
对于这些组件,里面主要有哪些函数或者任务呢?
- 一般在这些组件中都会包含3个phase: build_phase, connect_phase, run_phase. 这些phase都是分别实现具体的功能。根据组件的不同可能还会有其他的phase implement.
- build_phase: 直接创建实例,对象实例,接口实例
- connect_phase: 进行连接,driver与sequencer之间的连接,以及各种不同端口之间的TLM通信连接
- run_phase: 含有延时信号的phase, 可以是driver里面的接收信号。
- 在sequence组件里面会包含一个task body()的任务,用于生成激励。在里面会调用start_item(), finish_item()内置函数来标识sequence生成开始与结束。 那在environment里面是怎么将agent和scoreboard连接起来进行通信的呢?
- 两个通信的方式是TLM通信,即通过TLM端口的连接实现通信。如
agent.drv_port.connect(scbd.scbd_drv)
, 这里是使用的tlm_analysis_port进行通信的。
本文原创,错误之处在所难免!盼指出!