你选对存储结构了吗?你会玩UVM配置数据库了吗?

 

摘要:来自Chris Spear五月份的博客

20200528 使用SystemVerilog中的数组进行组织化

 

SystemVerilog有许多存储数据的方法。向量、数组、结构、类以及我可能不记得的其他几种方法。挤进前10个博客文章的主题选择太多了,因此我举办了一个网络研讨会,实际上是其中的两个,以帮助你更好的组织起来。

 

第一个网络研讨会着重于向量、固定大小的数组、动态数组、队列、关联数组和字符串 (是的,我忘记了)。这里先偷瞄一下这个图标,它可以帮助你在这些不同类型之间进行选择。

 

 

 

是否曾经偶然发现过类似下面代码并想知道它的作用?

 

q = array.find(x) with (x>5);

 

看起来它试图查找大于5的东西,但是“ x”的含义是什么?为什么搜索数组会产生队列?报名参加带有完整说明的网络研讨会,于太平洋夏令时间6月5日(星期五)上午8:15。我稍等片刻再开始,这样你就可以在加入之前再喝杯咖啡,或者给你的在家学习的孩子做些早餐。如果这你都做不到,那就没问题了,因为它们都被记录下来了。

20200507 UVM配置数据库准则

前言

我前几篇博文在讨论静态和参数化类,是为了这场重头戏–UVM配置数据库或uvm_config_db–做好准备。如果使用得当,这是一个组件与另一个组件共享某个数值的好方法。如果测试或环境知道代理的路径,则数据库是有效的。如果使用不当,将会使你的仿真陷入困境。

过多的选项

数据库是基于带有字符串索引的关联数组。因此,每个条目都是一个“名称/值”对。如果存储100,000个值,则数据库必须搜索这些值以找到特定值。如果将数组索引值组织成树形结构,则搜索可能需要多达20次字符串比较。这是具有100,000个条目的数据库。

由于这是一个参数化的类,因此每个具有不同类型的实例都会划分数据库的大小。可能你的配置值的一半是32bit整数,另一半是64bit数值。现在,每个数据库访问都在浏览一半的值。

更普遍的问题

数据库通过向每个名称添加范围来进一步组织“名称/值”对。与处理器相比,“速度”值对存储器的含义可能非常不同。

 

组件如何在整个测试平台上共享数值呢?我看到了一个存储组件,无论在什么位置,它都希望与每个组件共享“内存速度”这个数值。因此,它发出了以下通信:

 

uvm_config_db#(int)::set(null, “*”, “mem_speed”, mem_speed);

 

问题是,当你调用get(),并且数据库包含具有通配符范围的条目时,数据库必须执行正则表达式匹配,这比直接字符串匹配的效率低得多。更糟糕的是,数据库无法进行树状搜索,而不得不比较每个条目。如果你的数据库仅包含几百个条目,那没问题。但是如果有成千上万个,且都带有通配符,则运行非常缓慢。多么糟糕?这些为“内存速度”而设置的通配符范围将导致UVM build_phase()花费24小时,尽管其余的模拟花费了不到一个小时。如果你的测试平台规模越来越大,请留意这个问题!

本地化操作

如网络研讨会所述,一种解决方案是将配置变量组合在一起成为“配置对象”。例如,某个代理配置具有其本地参数,例如主动/被动枚举参数,各种地址和数据值以及虚拟接口。如果每个配置对象仅包含10个值,则数据库大小将减少10倍。每个代理的build_phase有一个数据库调用即可获取其config对象的句柄。当代理想要单个值时,它仅使用句柄在其本地对象中获取值。在配置对象中缓存数值比在另一个数据库中访问要快得多。

放眼全局

通配符问题的另一种解决方案是“全局范围”。请记住,数据库中的范围不必与你的测试平台层次结构匹配。内存组件可以将其值写入数据库顶部的唯一名称空间中,例如此处显示的“ mem”。

 

uvm_config_db#(int)::set(null, “mem”, “speed”, memory_speed);

 

如果有多个内存组件怎么办?在“ mem”的全局范围内,您可以为每个实例存储一个单独的配置对象句柄,假设“ speed”是mem_cfg类中的一个属性。

 

foreach (mem_cfg[i])

uvm_config_db#(mem_cfg)::set(null, “mem”, $sformatf(“mem[%0d]”, i), mem_cfgs[i]);

 

更多小技巧

 

对于直接从UVM组件类派生的组件(例如uvm_component,uvm_test,uvm_env,uvm_agent等),请勿调用super.build_phase()。这样可以避免使用代价高昂的apply_config_settings()。

 

范围字符串末尾的通配符(例如“agt *”)比前面的通配符(例如“*”)具有更少的匹配项和更好的性能。

结论

带有通配符作用域和许多条目的纯uvm_config_db可能会降低性能。通过将值分组到配置对象中,将数据库划分为较小的域。你可以在范围字符串中使用通配符,但将它们限制在字符串的末尾以提高性能。

 

 

原文链接:

https://blogs.sw.siemens.com/verificationhorizons/?s=Chris+Spear&submit=Search

 

扫描上图二维码可直达课程页面,马上试听

 

往期精彩:

V2Pro 2020秋M1 我对你的迷惑和选择都深以为然

V2Pro春季班普遍学撑了,秋季班7月报名你还敢来么

30w+还送股送房?60+IC企业2019薪资全面攀升!

UVM RAL模型:用法和应用

我们准备做第二期线下培训,依旧认真且严肃

如果你突然被裁员了,你的Plan B是什么?

[彩虹糖带你入门UVM]

理解UVM-1.2到IEEE1800.2的变化,掌握这3点就够

发表评论

电子邮件地址不会被公开。 必填项已用*标注