一、什么是phase?
phase翻译成中文就是相、阶段的意思。在UVM中,官方的说法是:phase是使tb中各种各样的component按照各自的需求可以阶段性执行的一种自动化的机制。简单的说就是使验证组件能够按需自动化执行的一种机制。
二、OVM有phase的概念吗?
有。那为什么OVM中没有看到在各个function
或者 task的形参表里看到(ovm_phase
phase)呢?因为OVM已经为用户提供了现成的、固定的几个phase,它们是 new phase(对一个合格的tb来说,new
phase是被 ovm root
component在执行run_test()的时候通过factory机制调用的,也就是通过静态函数create调用的)、build
phase、connect phase、end_of_elaboration phase、 start_of_simulation
phase、run phase、extract phase、check phase、report phase。
OVM
没有提供API给用户进行一些操作,比如增加一个phase、让不同的component的同一个phase异步的运行等等.......
三、UVM为什么在OVM的基础上扩展、增强这个功能?
因为不够用所以才需要扩展,因为不完美用才需要增强。
不完美体现在哪里?我提一点,其余的大家可以挖掘。
一个正常的DUT,从上电到正常工作到关闭是一个相对比较通用的流程,所以把这些比较通用的流程放在一个run
phase里面可以但不完美,那我把run phase按照这些通用流程拆分成几个子的阶段不是更好么?比如拆分成reset
phase、configure phase、main phase、shutdown phase。
不够用体现在哪里?我同样提一点,其余的大家继续挖掘、跟帖。
一个大的chip里面有很多功能性比较独立的模块,这些功能性独立意味着一个模块A在run的时刻另一个模块B可以不run,也可以run,B运行不运行和A运行不运行关联度不大甚至没有关联,比如A是只负责处理发通路的而B只负责收通路;但是另一方面,功能性独立并不意味着什么都独立,举例来说,A模块和B模块功能性很独立,比如A是一个clock
generation模块,B是一个processor模块,那在A没有正常work的前提下B是不能正常工作的。
由此我们至少可以提出两点需求:
(1)能不能让B的reset phase发生在A的reset
phase之后,这样等待clock都稳定了再对B做reset操作或者release reset操作?
(2)能不能让A的main phase和B的main phase异步的运行?
上面两点至少需要用到UVM中的的如下机制:新建一个domain、给不同的component设置不同的domain、不同的domain之间phase的同步和异步。
再如,功能更复杂的tb可能需要新建一个user-defined的phase,让它在某一需要个时刻点运行,可以是function性质的或者task性质的。
除了细分各个DUT模块的工作状态以外,个人还想到了一个实现phase转换的理由。那就是在很多config中的random
items在一次simulation往往只是会被randomize一次,效率很低,function
coverage的提高要消耗大量的regression testcase。个人感觉如果通过phase jump从extract
phase或者report phase再跳转到reset phase/config phase,可以大大提高 verification
efficiency。
四、UVM phase的组织架构
(1)在大学学习数据结构的时候,我们知道有几种基本的数据结构,其它的结构都可以分解成这几种的组合;它们分别是线性数据结构(比如链表)、树形结构(比如二叉树)、图形结构(有向图和无向图);
UVM的phase的组织结构也不例外,都可以分解成上述三种。总体上来说,是按照有向图结构进行组织的。
(2)既然是有向图形结构,那么这个数据结构中自然有若干节点和连接这些节点的有向边。另外,一个图也可以分解为若干个子图。
在默认情况下,这些节点就像铁路的一个个站点,每个节点都有自己的属性;这里所说的属性就是指的是UVM库中定义的如下几种:
UVM_PHASE_DOMAIN:它的含义是从我开始,到后面的某个节点为止,这期间经过的所有节点都是我的管辖范围。
UVM_PHASE_SCHEDULE:它的含义和UVM_PHASE_DOMAIN相同,唯一的区别就是它不具有独立行动的权利,它的外面至少需要套一层UVM_PHASE_DOMAIN;形象点说,UVM_PHASE_DOMAIN可以代表整个图形结构或者代表某个子图结构,但是,UVM_PHASE_SCHEDULE则只能代表某个子图结构,它必须属于某个DOMAIN,也就是它必须被某个DOMAIN wrapper起来!
UVM_PHASE_NODE:它的含义是图形结构中的某一个节点,它是一个句柄,它自己不干具体的活(比如main
phase具体要干什么)。
UVM_PHASE_IMP:它的含义就是说它所代表的就是具体干什么活,上述的UVM_PHASE_NODE就是会指向某一个UVM_PHASE_IMP。
UVM_PHASE_TERMINAL:它是用来标定UVM_PHASE_DOMAIN和UVM_PHASE_SCHEDULE的势力范围的!就是说我后面的节点就不是你们的管辖范围了,只有一个domain或者schedule才有这个东西。
UVM_PHASE_NODE和UVM_PHASE_IMP的关系如果不好理解的话,你可以对照TLM中的port、export、和imp来理解,这样就容易些了;像port、export只负责传话或者发号施令,而imp才比较苦逼,是真正干活的。
有向图中的边在UVM
phase里则代表了运行的顺序,就是说这个节点过了,下个节点是哪些,我想这个应该比较好理解。
(3)默认UVM phase的具体的图形结构
common
(UVM_PHASE_DOMAIN) id=204
|
build
(UVM_PHASE_NODE) id=222
|
connect
(UVM_PHASE_NODE) id=234