0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UVM中uvm_config_db机制背后的大功臣

冬至子 来源:CSDN 作者:谷公子 2023-06-29 16:57 次阅读

1.前言

本次讲一下UVM中的uvm_config_db,在UVM中提供了一个内部数据库,可以在其中存储给定名称下的值,之后可以由其它TB组件去检索。这样的数据库允许我们以不同的名称存储不同的配置设置,这些配置可以在需要时潜在地配置TB组件,而无需修改实际的TB代码。比如说,我们需要TB打开某个checker,我们只需要提供这个checker的路径并将数据库中的变量设置为1,checker就可以检查这个变量值,如果它打开了,就开始检查DUT功能。uvm_config_db提供了访问这个数据库的接口,最常见的就是get()和set()函数,函数定义如下:

static function void set(uvm_component cntxt,
                         string inst_name,
                         string field_name,
                         T value);
static function bit get(uvm_component cntxt,
                        string inst_name,
                        string field_name,
                        inout T value);

这两个函数如何使用我想大家都清楚,调用一次set()就是往数据库内设置1个scope为{cntxt,”.”, inst_name},匹配符为field_name,值为value的配置。其中inst_name和field_name是支持正则匹配或glob类型匹配的。调用一次get()就是用scope为{cntxt,”.”, inst_name},匹配符为field_name的访问方式在数据库里检索是否有匹配的设置,注意,这里的inst_name和field_name不支持正则匹配或glob类型匹配的,下面会具体说明。如果get()返回1就是找到了,返回0就算没有找到。上述两个函数中,如果cntxt传递的是null,那么UVM自动会使用uvm_root::get()替换它。大家如果需要调试uvm_config_db的话,可以使用+UVM_CONFIG_DB_TRACE或uvm_config_db_options类内的turn_on_tracing()/turn_off_tracing()/is_tracing()函数来进行。

多啰嗦一下,如果uvm_config_db::set()对同1个配置在不同时间或不同地点设置了多次,那么uvm_config_db::get()的时候将会采用哪一次的呢?UVM会给它们指定不同的优先级,结论就是:如果是在build_phase指定的话,是按UVM hierarchy来的,层次越高优先级越高,也就是uvm_test的优先级会高于uvm_env,以此类推。但如果两个组件是同一个UVM hierarchy的话,就是按时间顺序来的,越往后set优先级越高。在build_phase之后,就不在于UVM hierarchy了,都是按照时间顺序来的,越往后set优先级越高。

那么UVM中是如何做到uvm_config_db::set()和uvm_config_db::get()的匹配呢?这就涉及到了本文的主题了。简单说就是字符串的正则匹配,在UVM内部是通过uvm_glob_to_re()和uvm_re_match()这两个函数来实现的,它们是在uvm_config_db背后默默工作的功臣。

在TB调用uvm_config_db::set()的时候,set函数会将参数cntxt和inst_name拼接起来后,调用用uvm_glob_to_re()转换格式,再存到uvm_resource类里的scope字符串变量,set()的值也是放在uvm_resource类里。当TB调用uvm_config_db::get()的时候,get函数也会将参数cntxt和inst_name拼接起来,再调用uvm_re_match()与uvm_resource_base类里的scope字符串进行匹配,如果匹配成功,就返回这个uvm_resource类的值。这就完成了set()设置值和get()查找值的过程了。uvm_glob_to_re()和uvm_re_match()在其中扮演重要的角色,我们就来看看这两个函数

这两个函数都支持C版本和SV版本,两个版本的功能有点差别,默认是使用C版本,功能更强大点。如果TB没有定义了UVM_REGEX_NO_DPI或UVM_NO_DPI宏的话,那么用的是DPI-C import进来的C版本,反之是Systemverilog版本的。

2. uvm_glob_to_re()函数

C版本的uvm_glob_to_re()函数定义如下:

const char * uvm_glob_to_re(const char *glob)
import "DPI-C" function string uvm_glob_to_re(string glob);

它会将输入的glob字符串(glob类型匹配格式)转成真正的正则表达式格式(POSIX regular expression)。也就是把输入字符串中glob元字符替换为正则元字符,并在开头和结尾分别加上/^和$/。glob类型匹配和正则匹配区别,大家可以自行查找资料下。

SV版本的uvm_glob_to_re()函数定义如下:

function string uvm_glob_to_re(string glob);
  return glob;
endfunction

从这个函数内容就可以看出,它不对输入的字符串做任何处理。

3. uvm_re_match()函数

C版本的uvm_re_match()函数定义如下:

int uvm_re_match(const char * re, const char *str)
import "DPI-C" function int uvm_re_match(string re, string str);

可以看到它有两个参数,第一个参数(re)是匹配的正则表达式,第二个参数(str)匹配的字符串,如果re在str里找到它要匹配的字符串,就返回0,反之返回1。

SV版本的uvm_re_match()函数定义如下:

function int uvm_re_match(string re, string str);

它的参数和返回值与C版本定义一样,不过它是支持glob类型匹配,也就是re必须是glob类型格式的。

对于uvm_config_db来说,在调用get()函数检索数据库的时候,get()函数传递的{cntxt,”.”, inst_name}会作为uvm_re_match()的str的实参,set()函数设置的{cntxt,”.”, inst_name}在经过uvm_glob_to_re()处理后作为uvm_re_match()的实参,这也就是为什么set()参数的inst_name支持正则格式,而get()参数的inst_name只是简单字符而已。

4. 例子分析

测试源代码如下:

str_re = "uvm_test_top.*monitor";
$display("uvm_glob_to_re() converts %s to %s", str_re, uvm_glob_to_re(str_re));
str = "uvm_test_top.a.b.c.monitor";
$display("%s and %s, match result is: %s", str_re, str, 
         uvm_re_match(uvm_glob_to_re(str_re), str)==1'b0 ? "MATCH" : "MISMATCH");
uvm_config_db #(bit)::set(null, str_re, "test_var", 1'b1);
if ( uvm_config_db #(bit)::get(null, str, "test_var", test_var) )
    $display("Get the test_var from path: %s", str);
else
    $display("Not get the test_var from path: %s", str);
str = "uvm_test.*.monitor";
$display("%s and %s, match result is: %s", str_re, str,
         uvm_re_match(uvm_glob_to_re(str_re), str)==1'b0 ? "MATCH" : "MISMATCH");
uvm_config_db #(bit)::set(null, str_re, "test_var", 1'b1);
if ( uvm_config_db #(bit)::get(null, str, "test_var", test_var) )
    $display("Get the test_var from path: %s", str);
else
    $display("Not get the test_var from path: %s", str);
str_re = "zhuanxinzhizhier";
str = "yes_zhuanxinzhizhier_yes";
$display("%s and %s, match result is: %s", str_re, str,
         uvm_re_match(str_re, str)==1'b0 ? "MATCH" : "MISMATCH");

当TB没有定义UVM_REGEX_NO_DPI或UVM_NO_DPI宏时,也就是函数采用C版本函数,Questasim输出的结果为:

# uvm_glob_to_re() converts uvm_test_top.*monitor to /^uvm_test_top\\..*monitor$/
# uvm_test_top.*monitor and uvm_test_top.a.b.c.monitor, match result is: MATCH
# Get the test_var from path: uvm_test_top.a.b.c.monitor
# uvm_test_top.*monitor and uvm_test.*.monitor, match result is: MISMATCH
# Not get the test_var from path: uvm_test.*.monitor
# zhuanxinzhizhier and yes_zhuanxinzhizhier_yes, match result is: MATCH

当TB有定义UVM_REGEX_NO_DPI或UVM_NO_DPI宏时,也就是函数采用SV版本,Questasim输出的结果为:

# uvm_glob_to_re() converts uvm_test_top.*monitor to uvm_test_top.*monitor
# uvm_test_top.*monitor and uvm_test_top.a.b.c.monitor, match result is: MATCH
# Get the test_var from path: uvm_test_top.a.b.c.monitor
# uvm_test_top.*monitor and uvm_test.*.monitor, match result is: MISMATCH
# Not get the test_var from path: uvm_test.*.monitor
# zhuanxinzhizhier and yes_zhuanxinzhizhier_yes, match result is: MISMATCH

从上述两个log的最后一行打印我们可以看出C版本函数功能还是更加强大。大家使用uvm_config_db::set()和uvm_config_db::get()时,要牢记set()的参数inst_name是支持正则匹配的,而get()的参数inst_name是不支持正则匹配的也就是get()的参数inst_name里就算包含*/?/+等特殊字符,也是会当作普通字符而已,而不会被处理成正则匹配里的元字符。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    18965
  • DUT
    DUT
    +关注

    关注

    0

    文章

    180

    浏览量

    11998
收藏 人收藏

    评论

    相关推荐

    UVM中的field automation机制有哪些用途

    不知道UVM中的field automation机制怎么翻译,不管了,反正就是**机制,理解它能干啥就行了。
    的头像 发表于 07-19 09:45 1759次阅读

    IC验证"为什么要学习UVM呢"

    Synopsys在VMM的寄存器解决方案RAL。同时,UVM还吸收了VMM的 一些优秀的实现方式。可以说,UVM继承了VMM和OVM的优点,克服了各自的缺点,代表了验证方法学的发展
    发表于 12-01 15:09

    IC验证"UVM验证平台加入factory机制"(六)

      加入factory机制 上一节《IC验证"一个简单的UVM验证平台"是如何搭建的(五)》给出了一个只有driver、使用UVM搭建的验证平台。严格来说这根本就不算是UVM验证
    发表于 12-08 12:07

    IC验证“UVM验证平台加入objection机制和virtual interface机制“(七)

    在上一节,**《IC验证"UVM验证平台加入factory机制"(六)》**虽然输出了“main_phase is called”,但是“data is drived”并没有
    发表于 12-09 18:28

    什么是UVM Report机制

    UVM Report机制概述
    发表于 12-21 06:55

    数字IC验证之“什么是UVM”“UVM的特点”“UVM提供哪些资源”(2)连载...

    。可以在不改变平台代码的基础上改变平台的行为,以产生不同类型的激励。平台可以在不同的验证工程之间进行移植,善于利用uvm提供的各种机制。可以使验证平台具有极强的可重用性。uvm为用户提供了哪些资源
    发表于 01-21 16:00

    什么是uvmuvm的特点有哪些呢

    直观的印象,就是uvm验证平台,它是分层的结构。图中的每一个巨型框都代表着平台的一个构成元素。这些元素呢,我们称为平台组建,下面来简单的分析一下。从最底层上来看,agent 包含了driver,monitor和sequencer,其中driver ,monitor
    发表于 02-14 06:46

    请问一下在UVM的UVMsequences是什么意思啊

    UVM方法学,UVMsequences 是寿命有限的对象。UVM sequences从uvm_sequence_item基类扩展得到,uvm
    发表于 04-11 16:43

    谈谈UVMuvm_info打印

    uvm_report_enabled(xxx),会分析传过来的severity和id的配置verbosity要大于传过来的verbosity,(get_report_verbosity_level(severity, id
    发表于 03-17 16:41

    UVMseq.start()和default_sequence执行顺序

    /uvm_sequencer_base.svh文件。示意截图如下:  在start_phase_sequence(xxx)函数里会先使用uvm_config_db获取到defaultsequence,然后在最后
    发表于 04-04 17:15

    UVM实战卷1 PDF电子书免费下载

    UVM实战》主要介绍UVM的使用。全书详尽介绍了UVM的factory机制、sequence机制、phase
    发表于 11-29 08:00 29次下载
    <b class='flag-5'>UVM</b>实战卷1 PDF电子书免费下载

    浅析UVM不同机制的调试功能

    作为UVM的用户,我们需要相信在绝大部分情况下这些机制本身是没有问题的。因此,从顶层获得有效的调试信息就非常关键,比起潜入到内部要高效得多。 这也是本文的目的,盘点UVM针对不同机制
    的头像 发表于 02-14 16:23 992次阅读
    浅析<b class='flag-5'>UVM</b>不同<b class='flag-5'>机制</b>的调试功能

    UVM学习笔记(一)

    driver应该派生自uvm_driver,而uvm_driver派生自uvm_component。
    的头像 发表于 05-26 14:38 883次阅读
    <b class='flag-5'>UVM</b>学习笔记(一)

    UVMuvm_config_db机制背后大功臣

    本次讲一下UVM中的uvm_config_db,在UVM中提供了一个内部数据库,可以在其中存储给定名称下的值,之后可以由其它TB组件去检索。
    的头像 发表于 06-20 17:28 796次阅读

    一文详解UVM设计模式

    本篇是对UVM设计模式 ( 二 ) 参数化类、静态变量/方法/类、单例模式、UVM_ROOT、工厂模式、UVM_FACTORY[1]中单例模式的补充,分析静态类的使用,UVM中资源池的
    的头像 发表于 08-06 10:38 899次阅读
    一文详解<b class='flag-5'>UVM</b>设计模式