1. UVM 中的new()函数实际上是为数据或者句柄指定一个新的地址空间,简单理解就是新建一个地址空间,类似新建一个文件
2.需要使用新建的时候才可以使用new(),直接引用不需要使用new()函数
3.在refm会用到output_item,这个output_item 其实就是作为数据的载体,将refm已经处理好的数据传递到scbo。(你也可以直接在refm中新建一个output_item)。类似的还有input agent 中的monitor
4. data_base 和data_sys的区别在于,data_base可以理解为父类,data_sys是从data_base扩展而来
5. transaction 和sequence的区别:
transaction,顾名思义,“事务”,是指一系列数据的集合。我们知道,DUT的接口是pin level的信号,对于验证平台来说,很难对几十个甚至几百个pin上的信号单独进行处理和传输。我们需要集中式的管理这些信号的驱动、采样、传输,因而,抽象层次更高的transaction应运而生。transaction本质上,是DUT上接口信号的“打包”。
sequence则是一系列transaction组成的发送序列。DUT要“动”起来的关键,就是sequence。当driver要给DUT驱动数据,它会向sequencer申请一笔transaction,申请到了,就会将这笔transaction解析成pin level,驱动到DUT的接口上。
那么sequencer中的transaction从何而来?答案就是sequence。当sequence启动时,它会创建一个item,并“扔给”sequencer进行仲裁,仲裁通过后,item会被放到一个REQ FIFO中,driver通过get_next_item阻塞语句得到这个item,然后驱动到DUT。通常一个sequence会发送若干笔transaction,这些transaction就通过sequencer这个“传送带”,源源不断地送给driver,进而推动DUT这个机器运转起来。
6.sequence、sequencer、driver的握手机制
关于sequence、sequencer、driver三者是如何握手的,放一张图,仅供参考,握手机制很复杂,核心要义有两点:(1)在sequence中放sequencer的句柄,在sequencer中放sequence的句柄,进行sequence与sequencer的“双向握手”;(2)利用TLM机制进行driver、sequencer的握手。