路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

UVM配置数据库参数随机化

已有 3717 次阅读| 2016-11-27 22:25 |个人分类:验证前沿资讯|系统分类:芯片设计

我们经常发现,配置参数在被初始化赋值之后不久,由于项目需求又要变为随机变量。

利用UVM库配置验证环境的方法提供了两个重要的好处:首先,配置数据库是灵活的,在全局都能通过uvm_config_db#(T)::get()访问环境;其次,存储在配置数据库的参数值可以通过命令行设置,而不需要仿真、重新编译。

本文组织如下:首先我们回顾可交替随机约束;接下来我们回顾一下UVM提供命令行访问的方式;然后,我们提出我们的随机专用便利层的UVM配置数据库,并自动进行命令行访问。最后,我们做总结。
  • 可交替随机约束
在本节中,我们回顾一下容器类库以及它的前端解析器。
A. SystemVerilog 约束
通常,SystemVerilog的随机变量及其约束存在于同一或继承关系的类里,并且,约束本身用SystemVerilog语言广泛的声明,也就是说约束必须在compile和elaboration过程中,simulation之前完成。灵活的方法是使用类变量来塑造随机,通过继承,一个命名约束块可以用一个新的约束覆盖或通过置为空块来移除掉,约束范围可以通过在继承的类里加入新的约束块被进一步限制。在所有的这些情况下,了解类的知识是必须的。
B. 随机变量和约束的容器类
约束是一个通用的带类型参数的容器类,我们已经定义了一个有限制的约束库,它适用于随机变量容器类,每个特定的容器类使用必要的局部变量实现约束声明,实际的随机化函数被封装在特定的next()函数里,即约束容器基类的一个抽象函数。
随机变量的容器类(loc_rand_static)实现了一个特定的next()函数来检索一个新的随机值。
结合两者,随机变量容器类和约束容器类生成特定类型的随机值。再加解析器前端,约束参考可以即时被实例化,删除和重新实例化。
C. 创建动态约束
动态约束实现如图4所示:
  • UVM命令行访问
UVM在仿真时有两个命令行选项来干预配置数据库:
  1. +uvm_set_config_int
  2. +uvm_set_config_string
这两种选项都需要以逗号分隔的三个参数:组件名,字段名和值。在零时刻,静态uvm_root顶层组件解析上述选项的所有实例,并填充配置数据库。
a verification component bus_env with a configurable number of bus actors.
例如,一个验证组件bus_env带有对bus actor的配置数量:
回归脚本可以通过设置将num_actors更改为2:
  • 命令行随机约束
有了随机约束容器,应用随机到命令行变得简单,命令行作为字符串访问,因为是动态约束实例。接下来的关键就是知道正确的类型,而UVM配置数据库本身就解决了这类问题。

该UVM配置数据库可以通过两种方式来访问:按字符串名称,按类型。因此,数据类型来随机化是直接从配置数据库的get()函数已知的。我们只是在配置数据库的顶层添加了一个随机层而已。

当用户通过数据类型检索随机值的话,如图6所示:
D.随机类型的子集
我们的随机便利层仅在数据类型可以被随机化时应用,现在,随机适用于SystemVerilog数据类型的子集。这些都仅限于解决这些(例如枚举)内置2个状态和4状态的标量变量类型,符号或无符号,和用户定义类型。完整的列表如下:
• 2-state: shortint, byte, int, longint, all signed or unsigned;
• 2-state: bit or variable length bit-vector;
• 4-state: integer;
• 4-state: logic or variable length logic-vector.
真正的数字和字符串不是随机候选对象,也不应该使用随机层访问;此外,非标量类型,包括队列和数组,都不被支持;然而,复杂的数据类型或聚集体的单个成员可以被配置数据库的随机层函数填充。

E.一次性随机化
对于配置数据库参数的随机化的目标是:很容易直接从命令行其它非随机变量启用随机约束,因此,它使用一次性随机的目标模型。
F.检索约束
作为一种可行的方法,UVM命令行处理器可以在必要时被用来填充配置数据库,流程如图7所示,有三个特殊的优点:(a)较少访问;(b)命令行管理和plus-arg寻址;(c)改进SystemVerilog数字处理。
G.随机参数
一旦一个字符串被确定为配置数据库的参数,随机容器类就会被实例化,并被随机赋值。以下这几点就是已知的了:
• 类型 – 标量数据类型随机化,
• 约束 – 申请随机化的字符串,
• 前后关系 –配置数据库的位置.
现在,随机容器类就可以以适当的类型被实例化了。
H.变动
虽然使用配置数据库随机参数模型实现了单个的随机化,但这需要灵活变动。参看图6和图7中,被访问的哈希可以从流中除去。在这种情况下,每当 config_rand_db#(T)::get() 被调用时,就从配置数据库得到 string-typed。然而,在图7中,命令行搜索字符串的限制仍然只发生一次。这是合理的,因为一旦仿真开始后,命令行约束就不能改变,而配置数据库的字符串约束可以改变。此外,每当config_rand_db#(T)::get() 被调用,在该技术方案中,一个新的 loc_rand#(T)就被实例化,随机化,并有返回值。
  • 结论
我们的配置数据库随机层对仿真中命令行随机配置也是开放的,对环境本身不要求有SystemVerilog 随机约束。所有的配置参数都可以从命令行随机化获得,例如:
>simcmd+uvm_set_config_string='*.bus_env,num_actors,inside[1:3]' 或者:
> simcmd +bus_env.num_actors='dist{1:=15,2:=50,3:=35}'

利用这种技术,唯一需要改变源代码就是改变uvm_config_db去访问我们自己的便利层类接口config_rand_db。环境里的API和使用的模型不需要改动。

我们在多个验证项目中,同时使用可交替的随机约束和随机便利层到UVM配置数据库。目前,这些项目支持Synopsys VCS和Cadence的Incisive©仿真工具。我们没有在Mentor Graphics的Questa©工具里实验,但发现它没有理由不工作。



点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 08:37 , Processed in 0.029558 second(s), 19 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部