问题标签 [uvm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
system-verilog - 基本UVM序列模拟查询
我正在尝试了解序列及其工作原理的基于 UVM 的基本 TB 有几个问题。
- 在响应项中更新时,bvalid 在驱动程序中始终被选为 0
- 最近 2 个事务的几个错误消息(# UVM_ERROR @ 18: uvm_test_top.axi_agent1.axi_base_seqr1@@axi_base_seq1 [uvm_test_top.axi_agent1.axi_base_seqr1.axi_base_seq1] 响应队列溢出,响应被丢弃)
这是 EDA Playground 上编译代码的链接 http://www.edaplayground.com/x/3x9
关于我所缺少的任何建议?
谢谢
文科启动
system-verilog - 使用带有寄存器模型的 burst_read/write
我有 16 个寄存器的寄存器空间。这些可通过串行总线(单次和突发)访问。我已经为这些寄存器定义了 UVM reg 模型。然而,没有一个 reg 模型方法支持总线上的突发事务。
作为一种解决方法
- 我可以为同一空间声明内存模型,并且每当我需要突发访问时,我都会使用内存模型,但是为同一事物声明 2 个单独的类似乎是多余的,并且这种方法不会正确反映寄存器值。
- 创建一个函数,该函数循环迭代字节数并逐个访问寄存器,但是此方法不会在总线上创建突发事务。
所以我想知道是否有办法在寄存器模型中使用 burst_read 和 burst_write 方法。如果 burst_read 和 burst_write 支持镜像会很好(当前的实现不支持这个),但如果不支持,我可以使用 .predict 和 .set 所以它不是大问题。
或者我可以轻松实现寄存器模型的方法以支持突发操作。
vhdl - 如何为黄金 C 模型和 RTL 之间的乱序事务编写记分牌?
我有一个 UVM 测试环境,其中黄金 C++ 模型和 RTL 都被实例化了。在某些情况下,我的 C++ 模型和 RTL 输出会出现故障,因为 C++ 模型的周期不准确。对于有序输出,我的记分牌中只有无限的队列。每当我在 RTL 接口中看到输出时,我都会尝试将其与 c++ 模型输出队列的头部匹配。这里的假设是 c++ 模型的输出总是在 RTL 输出之前,因为没有时间 c++ 模型的概念。
然而,在少数情况下,事情可能会变得疯狂和无序(例如,仲裁者)。在那种情况下,在 UVM 中编写记分牌和检查代码的标准方法是什么?
system-verilog - Handling protocol extensions in a UVC
I'm curious how you handle extensions to a protocol UVC. Let's say we have an APB UVC that implements the AMBA protocol. Let's also say that we have a DUT that, aside from the signals defined in the specification, also implements a few other signals that are related to the generic APB signals (they add support for protected accesses or whatever). On the class side it's pretty easy to handle: just create a new sequence item subclass with extra fields and do type overrides. Where it gets tricky is when working at the signal level. Our UVC already uses an SV interface that only contains the APB signals and it's not possible to extend it in any way. How would we get these extra signals into the UVC to drive and monitor?
What we have done up to now is, since we use our own homegrown UVCs, we just pack everything into the base UVC and have it highly configurable. I don't like this approach as I don't feel it's properly encapsulated. It confuses the user with too many extra config parameters and it makes development a lot harder. I'm just wondering if anyone has a nicer solution to this.
This is a question I also asked on the Accellera UVM forums: http://forums.accellera.org/topic/1832-handling-protocol-extensions/
multithreading - UVM中的多线程
我们如何在 UVM 中加入多线程。UVM testbench中的线程,扩展的UVM组件,序列以及fork和join之间的方法?到目前为止,我已经搜索过这样的多线程测试平台几乎不会对加快仿真时间或提高性能产生影响,除非设计被划分为硬件的多个内核。是这样吗?
verilog - 当 RTL 和 Goldenmodel 可能产生不同但正确的输出时,验证硬件的标准方法是什么?
我的硬件模型有一个 UVM 测试台(约束随机验证)。我的黄金模型是用 systemC 和 c++ 编写的。在某些情况下,我的硬件结果与软件结果不匹配,但它们都可能是正确的。
例如,我的硬件进行了一些内存管理(分配、释放资源),这会影响管道中的一些其他逻辑。根据硬件“何时”获得分配或释放请求以及一些时间敏感的仲裁策略,它会产生一些输出。在黄金模型中没有时间概念,在某些情况下,它的输出与硬件不匹配,但硬件和黄金模型都可能是正确的。
验证这种场景的标准方法是什么?当黄金模型和硬件输出都正确但它们的值不同时,我不太确定记分板是否有助于检查正确性。我是这个领域的新手。因此,任何建议/指针都将受到高度赞赏。
c - C 代码独立工作。但是当UVM测试调用C DPI时,c变量就搞砸了
我正在使用 Synopsis VCS 编译器。我的测试台是用 UVM 编码的。我有一组执行一些独立功能的 C 例程。我通过 UVM 环境中的 DPI 导入调用这些 C 例程。
这是一个简单的代码片段,
# #问题是:如果我将其作为回归的一部分运行,大约 10000 次它可以完美运行。
在第 10001 次,这就是发生的事情。
function1 重新运行正确的值,当我打印 y 时我看到了。但是,当我在 C_function_1 中打印 x 时,x 的值类似于 0xffffff_fffff_y。那就是 y 的值存在,但有一些垃圾附加在它上面。这会打乱涉及 x 的后续计算。
我阅读了很多关于堆栈混乱的信息,并确保我 malloc'd 和 free'd 所有作为各种函数参数的指针。
我还尝试将 C 部分独立运行,没有错误,回归很干净。
唯一的问题是当我运行调用 C 回归例程的 UVM 测试时。
我花了很多时间调试这个无济于事。
有人有什么建议吗?
system-verilog - 协调记分牌检查
我在解决代码中的问题时遇到了一些麻烦,希望您能帮助我。
我有两个模块,A
和B
. 模块向 发出A
请求B
,并在多个周期后B
向 发送多周期响应A
。A
最多可以容纳 8 个等待响应的请求,并且来自的响应B
不一定按顺序返回。这就是我们使用 ID 来识别返回数据的原因。
为了验证这种行为,我有一个带有几个跳棋的记分牌。我所做的一项检查是用于请求的 ID 是否免费。为此,我保留了一个关联数组,其中包含待响应的 ID,并根据需要插入、检查和删除项目。我通过两个接口和监视器控制它,一个用于请求,另一个用于响应。响应监视器,作为超过一个周期长的响应,等待直到它拥有所有数据以将事务发送到记分板,在那里我更新我的结构。
问题出现的那一刻,一旦A
看到它实际上从 获得有效响应B
,就会释放 ID 并可以将其用于新请求。这发生在我的一些模拟中,并且由于在所有响应完成之前我不会收到交易,因此块A
正在使用 ID 进行新请求,直到我从监视器。
关于如何解决这个问题的任何想法?谢谢!
system-verilog - UVM 测试台 - 将两个不同的驱动程序连接到同一接口的“UVM”方式是什么?
在我的测试台中,我有一个需要驱动的接口。该接口可以在 2 种不同的模式下驱动,每种模式都有自己的驱动协议和事务类型。
到目前为止,我已经分别设计了两个 uvm_agents。现在,我需要一种方法来交换一个或另一个,这取决于我正在运行的测试用例。我也想以最符合 UVM 理念的方式来做这件事。
我能想到的最好方法是:在我的 uvm_env 中,从测试中获取一个 uvm_db_config 参数,该参数显示“ModeA”或“ModeB”,并在此基础上将代理的 is_active 设置为“UVM_ACTIVE”和“UVM_PASSIVE” ”适当。
我想对这种方法发表意见。
向我建议的一种方法是保留一个通用的 uvm_agent,并根据配置实例化 uvm_driver/uvm_sequencer。不太确定这种方法,因为它看起来很乱。
system-verilog - uvm_field_* 宏 - 如何设置我的自定义结构
我找不到可以在我的测试台中使用的 uvm_field_* 宏。我定义了一个结构:
现在,在我的序列项目中,我声明:
我怀疑这会奏效。我可以将它注册为`uvm_field_array_int 吗?这样做的方法是什么?