UVM学习笔记——config机制

一、config机制的作用

1、 在创建底层组件之前,需要对验证环境进行配置,用过外部的参数配置,使得环境在创建时可以根据不同的参数来选择创建组件的类型、组件的实例数目、组件之间的连接以及组件的运行模式等。

2、config机制允许在仿真中通过变量设置来修改环境,不需要重新编译来调节变量。

二、config机制使用方法

1、 UVM提供uvm_config_db配置类和集中变量设置方法

2、 常见的uvm_config_db使用方法如下
1) 传递virtual interface到环境中去
2) 设置单一的变量值,例如int、string、enum等
3) 传递配置对象到环境中

3、代码
uvm_config_db#(T)::set(uvm_component cntxt,string inst_name, string field_name,T value);
uvm_config_db#(T)::get(uvm_component cntxt,string inst_name, string field_name, inout T value);
get方法当获得配置的变量值时返回1否则返回0。
T是参数类型,在顶层做set,在底层做get,uvm_uvm_component cntxt 要配置的实例,string inst_name 实例的名称,string field_name 实例对应的某一个变量,T value 需要设置的变量值

三、interface传递

1、 interface可以很好地解决连接硬件世界和软件世界

2、uvm_config_db可以使得接口传递与底层的获取彻底的分离开来

3、在实现接口传递时注意事项
1)接口传递发生在run_test()之前。保证了在进入build phase 之前, virtual interface已经被传递到uvm_config_db中
2)用户应当把interface 与 virtual interface 的声明区分开来,在传递过程中的类型应当为virtual interface,即实际接口句柄。

四、变量设置
在各个test中,可以在build phase对底层组件的变量加以配置,进而在环境例化之前完成配置,使得环境可以按照预期进行。

五、object传递
1、 使用object传递适用于配置的参数多,而且属于不同层次的组件的情况。可以将这些组件中的变量整合,然后把他们放到一个uvm_object中,再将这个对象进行传递,会有利于整体环境的修改与维护。

注:在传递对象的时候,get与set中的参数类型要严格保持一致,比如uvm_config_db#(config1)::set,则uvm_config_db#(config1)::get。

六、建议
1、使用get()和set()方法时,传递参数应该保持一致,如果传递的是uvm_object类,get与set类型不一致时,要使用$cast()转换类型。

2、 get()和set()方的参数可以使用通配符“*”来表示任意层次“.comp”表示目前层次以下的所有名称为“comp”的组件,“*comp”表示包括当前层次及以下所有名为“comp”的组件。

七、总结
1、 uvm_config_db::set()通过层次和变量名,将这些信息放置到uvm_pkg唯一的全局变量uvm_pkg::uvm_resources。

2、 全局变量uvm_resources用来存储和释放配置资源信息。uvm_resources时uvm_resource_pool类的全局唯一实例,实例中有两个关联数组来存放配置信息,一个素组由层次索引,另一个时类型索引。

3、在使用get()方法时,通过传递的参数构成索引层次,然后再uvm_resources已有的配置信息池中索引该配置,索引成功返回1,失败返回0.

你可能感兴趣的:(UVM)