UVM配置DB和作用域

简介

对于任何大型软件项目,您都需要开云体育官网入口在广泛分离的块之间共享信息和控制。在糟糕的过去,这将通过全局变量和例程来完成。在OOP和SystemVerilog中,您可以使用具有静态属性和方法的类来实现这一点。UVM的配置数据库就是一个很好的例子。但是您知道DB在其伪全局空间中有一个全局空间吗?

您可能熟悉RTL通过DB向测试类传递一个虚拟句柄指针,如下所示。

模块hdl_top;//保存RTL代码导入uvm_pkg::*;xbus_ifc xbus_if(…);//实例化xbus接口初始化uvm_config_db# (virtual xbus_ifc):: //传递一个虚拟ifc集(null, "uvm_test_top", //给测试对象"xbus_if", xbus_if);// Name: "xbus_if"…// RTL代码endmodule

uvm_config_db调用包含三个部分。从右到左读这句话。

  • “名字”,价值对你正在访问的数据库。如果您尝试使名称字符串和变量相同,那么您的代码将更容易理解和理解。它们都在这里xbus_if
  • 作用域,是一个uvm_component句柄加上一个字符串。由于RTL代码不知道任何关于测试类的信息,所以它使用了一个句柄和"uvm_test_top,测试对象的实例名。
  • 专业化#(虚拟xbus_ifc)值的数据类型,这里是一个虚拟Xbus接口句柄。

一个全新的世界

大多数对uvm_config_db的调用使用来自UVM测试台层次结构的作用域,例如“uvm_test_top.env”。,这是代理的实例名。但是您可以创建自己的作用域,并且不必以“uvm_test_top”开头。实际上,uvm_config_db只是一个由字符串索引的关联数组,因此可以使用任何字符串创建自己的全局作用域。

也许一个测试想要将一个地址传递给x总线代理。它可以使用范围"uvm_test_top.env.agt或者它可以创建自己的作用域,比如“XBUS”。

类xbus_test扩展了uvm_test;虚函数void build_phase(…)uvm_config_db#(int):: //传递一个int值集(null, "XBUS", //在XBUS全局作用域"addr", 42);//名称,值对

代理,甚至序列都可以通过几乎相同的调用获得此值。

类xbus_agent扩展了uvm_agent;Int addr = 0;虚函数void build_phase(…)void'(uvm_config_db#(int):: //获取一个int值Get (null, "XBUS", //在XBUS全局作用域"addr", addr));//名称,值对

平行世界

这些小代码示例工作得很好,将单个值传递到单个目的地。现实世界呢?这种风格可能存在的一个问题是可扩展性:当存在多个代理时会发生什么?您可以用实例号替换“XBUS”字符串,例如“XBUS[1]”,或者传递一个地址数组。下面是set()调用和$sformatf()调用,用于创建索引作用域。

uvm_config_db # (int)::集(null, sformatf美元(“XBUS [% 0 d]”,本月),“addr”,addr);

一个更复杂的例子是,当为一个有3个块的深层分层系统做测试时,每个块内部都有一个x总线。X-bus代理可能不知道它是实例0、1还是2,因此向作用域字符串添加实例号更加困难。

总结

使用UVM Config DB,您可以根据实例名在测试台上传递值,或者您可以创建自己的全局作用域。确保你提前计划。如果这些组件和序列被几个层包围并实例化多次,您将如何重用它们?

享受你的验证之旅!
克里斯矛

查看我最近的在线研讨会包括概述UVM事务

评论

想想"UVM配置DB和作用域
  • 嗨,克里斯

    你能详细解释一下最后三行吗?
    “一个更复杂的案件.....因此,向作用域字符串中添加实例号更加困难。”

    我试图理解为什么“XBUS”字符串与实例号,如“XBUS[1]”将失败在这种情况下。

留下回复

本文最初发表于西门子数字工业软件博客https://blogs.sw.开云体育平台登录siemens.com/veri开云体育官方下载fic开云体育官网入口ationhorizons/2020/11/02/the-uvm-config-db-and-scope/
Baidu
map