|
楼主 |
发表于 2013-4-18 13:33:52
|
显示全部楼层
六、UVM phase class中的add()函数
1、函数原型
function void uvm_phase::add(uvm_phase phase,
uvm_phase with_phase=null,
uvm_phase after_phase=null,
uvm_phase before_phase=null);
比如调用是 A.add(B,C)就表示把B加入到A的大家庭中,
在A这个大家庭中的位置如何取决于后面的三个参数,根据
它们的名字我想不难知道它们的意思。
2、函数主体一:参数有效性判断
(1)if (phase == null)
`uvm_fatal("PH/NULL", "add: phase argument is null")
这个含义很明显,如果你想加的这个phase还没有创建,
你做这个操作是毫无意义的,simulator会直接退出。
(2)if (with_phase != null
&& with_phase.get_phase_type() == UVM_PHASE_IMP)
begin
string nm = with_phase.get_name();
with_phase = find(with_phase);
if (with_phase == null)
`uvm_fatal("PH_BAD_ADD",{"cannot find with_phase '",nm,
"' within node '",get_name(),"'"})
end
这个检查理解起来也不困难,以A.add(B,C)来说,意思就是说你想
把B加入到A中来,并且想让B和C可以并行的运行,首先要确保在A中
确实有C这个人才行,不然这个操作肯定也会有问题,而且也是fatal。
(3)if (before_phase != null
&& before_phase.get_phase_type() == UVM_PHASE_IMP) begin
string nm = before_phase.get_name();
before_phase = find(before_phase);
if (before_phase == null)
`uvm_fatal("PH_BAD_ADD",{"cannot find before_phase '",nm,
"' within node '",get_name(),"'"})
end
(4)if (after_phase != null
&& after_phase.get_phase_type() == UVM_PHASE_IMP) begin
string nm = after_phase.get_name();
after_phase = find(after_phase);
if (after_phase == null)
`uvm_fatal("PH_BAD_ADD",{"cannot find after_phase '",nm,
"' within node '",get_name(),"'"})
end
有了(2)的解释,(3)和(4)想必就不用再解释了吧。
(5)if (with_phase != null && (after_phase != null || before_phase != null))
`uvm_fatal("PH_BAD_ADD",
"cannot specify both 'with' and 'before/after' phase relationships")
这个含义就是说,你说明了用with_phase(或者说用after_phase/before_phase)
这个参数已经可以确定你想要放置的位置了,不需要也不允许在用后面两个参数进行
进一步框定了,这个主要是为了防止一些低级失误。
这个就好比说,数值A的值等于圆周率,并且数值A介于3和4之间;前半句
已经可以确定A是多少了,后面那句是废话;万一我后半句由于笔误写成了
并且数值A介于4和5之间,那不是麻烦了。
(6)if (before_phase == this || after_phase == m_end_node || with_phase == m_end_node)
`uvm_fatal("PH_BAD_ADD",
"cannot add before begin node, after end node, or with end nodes")
这个检查的意思是说:
before_phase == this,表示你想插入到我当前这个domain或者schedule的祖先节点
的前面,那是不允许的,this表示了这个domain或者schedule的树根。
after_phase == m_end_node,表示你想插入到我当前这个domain或者schedule
的最后一个终结节点的后面,m_end_node表示了这个domain或者schedule的终结
节点,注意这个终结节点的类型是UVM_PHASE_TERMINAL而不是UVM_PHASE_NDOE,
with_phase == m_end_node,表示你想和我的终结节点并行运行也是不行的,为什么?
因为UVM_PHASE_TERMINAL类型节点(和UVM_PHASE_DOMAIN类型节点以及
UVM_PHASE_SCHEDULE类型节点)都是不运行的,也就是说它们三个的运行时间是0。
为什么是这样,这个会在后面的execute_phase()函数中看到UVM是这么做的。 |
|