UVM中所有的phase是按照一定的顺序执行的,那么UVM是如何组织的?下面我们详细说明一下。
首先在phase运行之前已经生成了完整的common domain,这个common domain中的node就是执行的顺序。牵扯到的核心函数是
task uvm_phase::m_run_phases();
uvm_root top = uvm_root::get();
// 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
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
变量m_phase_hopper是一个mailbox;
第一步:m_phase_hopper.get(phase):
此时拿到的phase是common_ domain,接着执行代码common_domain::execute_phase()
这个phase的phase_type类型是domain,意味着不会真正执行任何操作,接下来put到m_phase_hopper的是common_domain的唯一后继build_node;