UVM(十)之config机制

UVM(十)之config机制

1

验证平台中要配置的众多的参数

在一个验证平台中,有众多的参数需要配置。如在mac_driver中,按照以太网相关协议的规定,在发送一帧数据前要先发送几个preamble(即8’h55),1个sfd(即8’hD5)。那要发送几个preamble呢?这个可以在driver中设置一个pre_num的变量来控制。

之后在main_phase中,每发送一个transaction之前,先把pre_num随机化一次,得到一个3~7之间的数字,然后把这个数字作为发送preamble的数量:

在只发送正常帧的情况下,上面的代码是可以工作的。那如果再想增加一个case,测试一下DUT对于preamble数量的敏感性,也就是说要发送小于3个或者大于7个的preamble。那么应该怎么办?很明显的一点,这种情况是跟具体的case相关的,新加的这个case不能影响其他case的正常运行,同时我们也希望,mac_driver尽量不因为加入这个case而做改变。

2

config机制的本质:半个全局变量

要实现上面的这个功能,有众多的方法。一种方法是把pre_num_max和pre_num_min设置成全局变量,这样,当要发送小于3个的preamble时,可以把pre_num_max设置为2,把pre_num_min设置为0。当要发送大于7个的preamble时,可以把pre_num_min设置为8,把pre_num_max设置为100。前面说过,类似config_over这种全局变量应该尽量避免使用。这里也是如此,过多的使用全局变量最后如果发现全局变量的值跟我们预期的不一样,那么排查这个全局变量是如何改变的将会是一件现代刚痛苦的事情。使用全局变量大大增加了出错的概率。

与全局变量想对应的就是本地变量,但是很明显,本地变量的值要想在不同的case中改变会是相当困难的一件事情。那么有没有这样一种全局变量,即它只能被某些特定的class被修改,而不能被其他的修改呢?也就是说,这个变量对于一些类是可见的,对于另外一些类是不可见的,似乎就像是一个半全局变量一样。

在上图中,我们希望只能在test和env及i_agt中才能改变driver中pre_num_max和pre_num_min的值,而类似monitor,scoreboard,reference model等都不能改变。可以在uvm_test_top使用如下方式给pre_num_max赋值:

env.i_agt.drv.pre_num_max=100;

如果pre_num_max为public,那么这种方法是可行的。但是,在pre_num_max为local的情况下,这种方法是不可行的。

无论任何语言,都不会提供这种半全局变量。要想达到这种半全局变量的效果,必须通过某些特殊的机制实现。UVM提供了config机制用以实现这种要求。

3

config机制是用来传递数据的

config机制在UVM验证平遥中都是成对出现的。如在某个case(派生自uvm_test)的build_phase中可以做如下设置:

uvm_config_db#(int)::set(this,”env.agent.driver”,”pre_num_max”,100);

那么在driver的build_phase中要这样做:

uvm_config_db#(int)::get(this,””,”pre_num_max”,pre_num_max);

这样,设置的pre_num_max的数值100就会传递给driver的pre_num_max。

uvm_config_db中的set和get都是静态函数,所以可以用双冒号的形式调用。上面set中的第一个参数用以说明是哪个component对pre_num_max进行了设置,一般使用填写this,第二个参数表示调用uvm_config_db::set的地方看下去,要设置的变量所在的component路径。第三个参数表示一个记号,用以说明这个值是传给driver中的哪个变量的。第四个参数是需要设置的值。

get中的第一个蚕食一般也是this即可。第二个参数填写一个空的字符串,第三个参数就是set中的第三个参数,这两个参数必须匹配起来,第四个参数是要设置的变量。

原文发布于微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文发表时间:2017-10-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【专业技术】如何搞定多线程?

存在问题: 多线程在我们开发中比较常见的方式,如何搞定多线程呢? 解决方案: 1,为什么需要多线程? 因为现代的CPU运行速度很快,哪怕是一个简单的嵌入式芯片也...

2737
来自专栏唐郑望的专栏

Go 语言之三驾马车

Go 语言的三个核心设计: interface 、goroutine 、 channel。

1.8K0
来自专栏CSDN技术头条

如何深入 Python 虚拟机追查 HTTP 服务 core dump 导致 502 的问题

作者 | 今日头条技术团队 概述 今日头条目前大部分 Python 的 HTTP 服务都是用 uWSGI 托管 Python 多进程的 Django 或者 Fl...

2417
来自专栏IT技术精选文摘

GoF设计模式快速指南

关于设计模式 本文主要是对原版GoF的23种设计模式提供一个快速的指南。每个模式的介绍包括了类图,讲解,使用信息和真实案例。 创造型模式(C):用于构造可与系统...

20310
来自专栏企鹅号快讯

如何深入 Python 虚拟机追查 HTTP 服务 core dump 导致 502 的问题

作者 今日头条技术团队 概述 今日头条目前大部分 Python 的 HTTP 服务都是用 uWSGI 托管 Python 多进程的 Django 或者 Fla...

2057
来自专栏Java技术分享

50道Java线程题

1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对 ...

33310
来自专栏Python入门

Python存取文件方法有很多,但是这四种真的算的上是骚操作了

在不需要借助任何外界库的前提下,python内置方法其实也可以完成我们需要的文件存取任务,这里主要介绍几种python内置方法的使用方式,最后再给出一个实际案例...

1836
来自专栏CSDN技术头条

史上最难的一道Java面试题:分析篇

无意中了解到如下题目,觉得蛮好。 题目如下: ? 该程序的输出结果? 在java中,多线程的程序最难理解、调试,很多时候执行结果并不像我们想象的那样执行。所以在...

2117
来自专栏Java技术分享

50道Java线程题

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速。...

2387
来自专栏Vamei实验室

Linux的“壳”

在上一篇文章中,我们已经初尝了Shell的好处。由于我们后面将大量借助Shell,所以在这里先简要介绍一下这件工具。 什么是Shell 我们已经说过,Shell...

2235

扫码关注云+社区

领取腾讯云代金券