先来给结论,如果build_phase继承自uvm_component的话,那么build_phase里面会调用build函数。
下面我们通过源码和例子来进行分析。
![](https://img.haomeiwen.com/i9390540/7e53f6c71a3f36a4.png)
![](https://img.haomeiwen.com/i9390540/ce91039d4544ff53.png)
- build被调用了。
- 尝试注释掉super.build_phase,你会发现build就没有被调用。
super.build_phase里面到底做了什么呢?
![](https://img.haomeiwen.com/i9390540/e684fe4a6a060182.png)
- build_phase调用了build()
- super.build()里面apply_config_settings(print_config_matches)自动获取config_db::set设置的参数。这部分源代码可以进一步进行分析。
查看zhangqiang的那本书,你就会看到super.build_phase是干了什么呢?
对于build_phase来说,uvm_component对其做的最重要的事情就是3.5.3节所示的自动获取通过config_db::set设置的参数。
如果要关掉这个功能,可以在自己的build_phase中不调用super.build_phase。
话又说回来,那我们什么情况下可以省略config_db::get呢?
- uvm_component必须使用uvm_component_utils宏注册;
- pre_num必须使用uvm_field_int宏注册
- 在调用set函数的时候,set函数的第三个参数必须与要get函数中变量的名字相一致,即必须是pre_num。
![](https://img.haomeiwen.com/i9390540/0776d3fd5c68482d.png)
结果:
my_scoreboard pre_num = 100
网友评论