我的理解是build_phase是一个function,内部语句应该是顺序执行的,第一个方法是在两个同级组件的上一级组件(如driver和monitor的上一级是agent)的build_phase内先例化使用set设置资源的组件,再例化使用get获取资源的组件。第二个方法是在使用get获取资源时把它放进一个while循环,等到get函数获取资源成功后跳出循环继续执行以后的语句。第三个方法是使用某种方式在set之后向get所在组件传递一个信号,表明已经设置了资源,然后在get前等待该信号,但是这种方法破坏了build_phase只是完成构造任务的原意愿而不是已经在进行组件间的通信。
貌似第一个方法只是例化而不是执行相应的build_phase,可行性待测试,第二个方法建立在同级组件build_phase同时执行而不是一个组件一个组件地build,可行性也待测试,第三个方法违背UVM意愿所以不考虑该方法。
另外是否可以在上一级组件的build_phase里手动先后调用两个组件的build_phase来达到set先于get的目的,这一点我通过自己写程序跑仿真测试了一下,发现的确是按照自己调用phase的顺序执行的,不过由于是在uvm的phase机制系统之外被显式调用,所以仿真器会报warning:build()/build_phase() has been called explicitly, outside of the phasing system. This usage of build is deprecated and may lead to unexpected behavior。但是,如果没有别的导致退出仿真的fatal、error发生时,这个warning至少在Questasim这个仿真器上不会令当前仿真停止。所以手动调用phase的方法应该可行。