IC验证学霸笔记4——UVM--config机制

1 config机制

•    在验证环境的创建过程build phase中,除了组件的实例化,配置也是必不可少的。
•    为了验证环境的复用性,通过外部的参数配置,使得环境在创建时可以根据不同参数来选择创建的组件类型、组件实例数目、组件之间的连接以及组件的运行模式等。
•    在更细致的环境调节(environment tuning)中有更多的变量需要配置,例如for-loop的阈值、字符串名称、随机变量的生成比重等。
•    比起重新编译来调节变量,如果在仿真中可以通过变量设置来修改环境,那么就更灵活了,而UVM config机制正提供了这样的便捷。

在UVM提供了uvm_config_db配置类以及几种方便的变量设置方法来实现仿真时的环境控制,常见的uvm_config_db类的使用方式包括:

传递virtual interface到环境中;

设置单一变量值,例如int,string,enum等;

传递配置对象(config object)到环境;

•     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); 

•    UVM的uvm_config_db使得接口的传递和获取彻底分离开来。
•    在实现接口传递的过程中需要注意:
接口传递应该发生在run_test()之前。这保证了在进入build phase之前,virtual interface已经被传递到uvm_config_db中。
•    用户应当把interface与virtual interface的声明区分开来,在传递过程中的类型应当为virtual interface, 即实际接口的句柄。

interface 传递

变量传递

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


在test配置中, 需要配置的参数不只是数量多, 而且可能还分属于不同的组件。

那么如果对这么多层次中的变量做出类似上面的变量设置, 那会需要更多的代码, 容易出错还不易于复用, 甚至底层组件的变量被删除后, 也无法通过uvm_config_db::set()得知配置是否成功。
然而如果将每个组件中的变星加以整合, 首先放置到一个uvm_object中, 再对中心化的配置对象进行传递, 那么将会更有利于整体环境的修改维护。

总结:

在使用uvm_config_db::set()/get()t时, 实际发生了这些后台操作:

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

全局变量uvm_resources用来存储和释放配置资源信息(resource information)。uvm_resources 是uvm_resources_pool类的全局唯一实例,该实例中有两个resource数组用来存放配置信息, 这两个数组中一个由层次名字索引,一个由类型索引, 通过这两个关联数组可以存放通过层次配置的信息。

同时, 底层的组件也可以通过层次或者类型来取得来自高层的配置信息。 这种方式使信息的配置和获取得到剥离, 便于调试复用。

 在使用uvm_config_db::get()方法时,通过传递的参数构成索引层次,然后在 uvm_resource已有的配置信息池中索引该配置,如果索引到,方法返回1,否则返回0。

建议:


在使用set()/get()方法时,传递的参数类型应当上下保持一致。对于uvm_object等实例的传递,如果get类型与set类型不一致,应当首先通过$cast()完成类型转换,再对类型转换后的对象进行操作。

set()/get()方法传递的参数可以使用通配符“*"来表示任意的层次,类似于正则表达式的用法。同时用户需要懂得“*.comp1"与”*comp1"的区别,前者表示在目前层次以下所有名称为comp1"的组件,而后者表示包括当前层次及当前层次以下所有名为"comp1"的组件。

在module环境中如果要使用uvm_config_db::set(),则传递的第一个参数uvm_component cntxt参数一般用来表示当前的层次。如果当前层次为最高层,用户可以设置为null,也可以设置为uvm_root::get()来表示uvm_root的全局顶层实例。

在使用配置变量时,应当确保先进行uvm_config_.db::get()操作,在获得了正确的配置值以后再使用。

应当尽量确保uvm_config_db::set()方法在相关配置组件创建前调用。这是因为只有先完成配置,相关组件在例化前才可以得到配置值继而正确地例化。

在set()方法第一个参数使用当前层次的前提下,对于同一组件的同一个变量,如果有多个高层组件对该变量进行设置,那么较高层组件的配置会覆盖较低层的配置,但是如果是同一层次组件对该变量进行多次配置时,应该遵循后面的配置会覆盖前面的配置。

用户应该在使用uvm_config_db::get()方法时.添加便于调试的语句,例如通过UVM报告信息得知get()方法中的配置变量是否从uvm_config_db获取到,如果没有获取,是否需要采取其它措施。

以下案例涵盖本节所有重点:


注:优秀验证学员随堂笔记,已经征求到学生的同意,会持续给牛友们分享!
大家看完记得 一键三连!多多支持
#你的秋招进展怎么样了##做项目##芯片IC验证工程师##你为什么选择硬件行业##深度学习#
全部评论
学到了,感谢楼主分享啊
点赞 回复 分享
发布于 2022-09-26 23:16 陕西

相关推荐

评论
3
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务