config_db机制详解

目录

config_db机制

set函数范式

get函数范式

set和get函数的执行顺序

多层次多次发送set时,set优先级确定


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例化之前例化前设置才能够创建实例后,将变量值设置进去。


        

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Moodle-mod_hvp是Moodle平台上的一种插件,它可以用于创建交互式H5P内容。而在moodle-mod_hvp中,embed.php文件则用于将H5P内容嵌入到Moodle中。 下面是embed.php文件的详解: 1. 首先,通过require_once函数引入Moodle的config.php文件,以便在后面使用Moodle的全局变量和函数。 ``` require_once(dirname(dirname(dirname(__FILE__))) . '/config.php'); ``` 2. 接着,获取当前用户的上下文信息,并根据上下文信息确定当前用户是否有权限查看该H5P内容。 ``` $cmid = required_param('id', PARAM_INT); $course_module = get_coursemodule_from_id('hvp', $cmid, 0, false, MUST_EXIST); $course = $DB->get_record('course', array('id' => $course_module->course), '*', MUST_EXIST); $hvp = $DB->get_record('hvp', array('id' => $course_module->instance), '*', MUST_EXIST); $context = context_module::instance($course_module->id); require_login($course, true, $course_module); require_capability('mod/hvp:view', $context); ``` 3. 接下来,根据H5P内容的类型(package类型或content类型)决定如何获取H5P内容的数据。 ``` if ($hvp->embedtype == 'package') { $fs = get_file_storage(); $files = $fs->get_area_files($context->id, 'mod_hvp', 'package', $hvp->package, 'id'); if (count($files) !== 1) { print_error('embedfilenotfound', 'mod_hvp', '', $hvp->package); } $file = reset($files); send_stored_file($file, 0, 0, true); } else { $json = hvp_print_content($hvp, true); $position = strpos($json, '{'); $json = substr($json, $position); $json = json_decode($json, true); $content = $json['library']['embedTypes'][0]['url']; echo html_writer::start_tag('iframe', array( 'src' => $content, 'frameborder' => 0, 'allowfullscreen' => true, 'webkitallowfullscreen' => true, 'mozallowfullscreen' => true, 'width' => $hvp->width, 'height' => $hvp->height )); echo html_writer::end_tag('iframe'); } ``` 4. 如果H5P内容的类型是package类型,则从文件存储中获取H5P包,如果获取失败,则输出错误信息;如果H5P内容的类型是content类型,则通过调用hvp_print_content函数获取H5P内容的数据,并从中解析出H5P内容的URL,最后通过iframe将H5P内容嵌入到Moodle中。 以上就是embed.php文件的详解,希望可以帮助你理解该文件的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃葱的酸菜鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值