一、config配置,常见的三类使用方法
1-传递vif指针
2-设置单一变量
3-传递配置对象
二、优点
1-提高软件环境的复用性
2-利于软件环境的封装
3-变量配置更便捷、灵活:非直线的获取,可以在多个组件使用同一个参数时,使得config_db::set变得没那么冗余
4-通过中心化的配置管理,使得配置和获取得到剥离
三、参数的意义
总:前三个参数构建变量/对象/接口的路径关系,第三个参数要一致(都是底层的变量名/对象名/接口名),底层路径一致,第四个参数就是各自层次的变量名/对象名/接口名。
在get组件声明了虚接口xxx,只有当拿到了传下来的接口,才能把xxx指向这个接口,不然声明了也没用,是空的。
1-传递vif指针:
uvm_config_db#(底层指针的类型)::set(uvm_root::get(),"底层指针的路径","底层指针的名称",顶层set给他的指针名称)
uvm_config_db#(底层指针的类型)::get(this," ","底层指针的名称",底层指针的名称)
2-变量设置
uvm_config_db#(底层变量的类型)::set(this,"底层变量的路径","底层变量的名称",顶层set给他的变量值)
uvm_config_db#(底层变量的类型)::get(this," ","底层变量的名称",底层变量的名称)
3-对象传递
uvm_config_db#(底层对象的类型)::set(this,"底层对象的路径","底层对象的句柄",顶层set给他的对象句柄)
uvm_config_db#(底层对象的类型)::get(this," ","底层对象的句柄",底层对象的句柄)
注:若set时底层对象的类型是他的父类句柄,那么get到的底层对象的句柄是他的父类句柄,父类句柄指向指向子类实例,需要类型转换,使得父类句柄指向子类句柄,才能访问子类对象的成员变量
四、其他
1-uvm_config_db继承于uvm_object
2-由于uvm_config_db做了中间变量的存放,因此环境层次还没有创建之前就可以set变量。
也就是说,即便底层组件没有创建,也可以从任何一个层次传递到其他层次。
3-run_test帮助实现层次结构
五、总结
1-先set再get
2-先set再creat
3-先传递接口再run_test()
4-路径一致
5-类型一致
6-set()和get()要成对
7-要避免变量名称和实例化时传递名称不一致
8-顶层set,底层get
9-传递接口类型应当是virtual interface,即实际接口的句柄
总结不易,转载请表明出处。
学识浅薄,若有错误欢迎交流指正。