摘要:来自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
扫描上图二维码可直达课程页面,马上试听
往期精彩: