目录
config_db机制
前言:本篇博客详细讲解UVM中config_db机制的用法,包括不限于应用场景以及config_db参数配置。
说到底,config_db机制其实就是为了传输“东西”而生的,这个“东西”既可以是一个uvm_object继承而来的类,譬如interface和transaction,又可以是一个bit或者整型int等基础变量。“东西”的传输依赖两个函数:
config_db机制分为set和get两个操作,set和get一般都成对出现。
set函数范式
uvm_config_db #(传输数据类型)::set(发送源地址, “相对于发送源的接收方地址”, “传输数据名称”, 传输数据内容);
set:自顶向下set,如从top_tb向下driver设置参数,即在top_tb中进行set。
举个例子,我们要用uvm_config_db传输一个int类型的变量var,传递值为var=100,传递到driver中,而driver被封装成agt里,agt又被封装到env下。那么set函数从top_tb出发,可以如下写道:
uvm_config_db #(int)::set(this, "env.agt.drv", "var", 100);
第一个参数this和第二个参数"env.agt.drv"构成目标路径,也可以写成 set(this.env, "agt.drv", "var", 100);
第三个参数是传递给该路径的哪个成员。
第四个是要设置的参数的值。
get函数范式
uvm_config_db #(传输数据类型)::get(A, "B", "传输数据名称", 传输数据内容);
uvm_config_db #(int)::get(this, " ", "var", var);
这里A和B合起来为数据接收方的地址。第一个参数必须是uvm_component实例的指针,第二个参数是相对此实例的路径。一般来说,如果第一个参数被设置成this,第二个参数可以是一个空的字符串。
第三个参数要和set中的第三个参数严格一致。
第四个参数表示要把接收到的var变量传递给driver中的哪个成员变量
有些情况下的get可以省略,build_phase中的super.build_phase语句,当执行到driver的super.build_phase时,会自动执行get语句。
set和get函数的执行顺序
set必须要写在get之前,一般来说,这个函数都会写在build_phase中,build_phase的运行顺序是从层次结构高的到层次结构低的,假如有一个需要从sqr发送到env的数据,写在build_phase中是会报错的。那么就可以改变函数的位置,在env中,把函数改写到后面的任何一个phase都是可以的。
如果收信和发信都写在main_phase中,就要格外注意在时间上的先后顺序,否则将会报错。
这是没有发信但是收信了的情况。如果发信了但是没有收信的,将不会报错。
多层次多次发送set时,set优先级确定
① 先以时间为准,最近收到的具有最高权威;
② 当收到时间相同时,层次越高,优先级越低。例如,uvm_test_top与env都对driver进行了设置,则使用uvm_test_top的设置。
注意
(1)接口传递一定要在run_test之前;
(2)config_db操作要在c1、c2例化之前,例化前设置才能够创建实例后,将变量值设置进去。