1、函数原型
task uvm_phase::m_run_phases();
主体1:
uvm_root top = uvm_root::get();
主体2:
// initiate by starting first phase in common domain
begin
uvm_phase ph = uvm_domain::get_common_domain();
void'(m_phase_hopper.try_put(ph));
end
主体3:
forever begin
uvm_phase phase;
m_phase_hopper.get(phase);
fork
begin
phase.execute_phase();
end
join_none
#0; // let the process start running
end
endtask
2、执行流程
(1)我们都会在test top中的某个initial中写上 run_test()(当然稍微大型一点的工程都是是通过
Makefile中的-UVM_TESTCASE选项把具体的testcase传递给run_test函数的,这不是我在
这里要讨论的话题),主要是这run_test()中会调用phase::m_run_phases()。
(2)如上所标述的,这个m_run_phases函数共有三个主体
主体1:很简单,就是得到整个test env的树形结构的根节点,即uvm_top,有了根节点,对
树形结构来说就掌控了一切。但是这个函数里没有用到top,哈哈。
主体2:得到common_domain,也就是从common (UVM_PHASE_DOMAIN) id=204节点
开始,沿着左边的支路一直走到common_end (UVM_PHASE_TERMINAL) id=210
节点结束。这些个节点都是属于common domain的东东。(请回看一下第一页的帖子
四、UVM phase的组织架构中的那个树形图)。
common domain是标杆,任何时候、任何env都是不会变的。
得到common domain之后,就把它放入到一个FIFO中。
主体3:通过条用execute_phase函数干正事。这个主体是一个forever循环,这意味中原则上
你可以创建无数个自己的domain!