我有以下问题需要解决。我使用绑定将系统Verilog断言绑定到RTL。为了确保绑定已启用,我在绑定代码的开头添加了“sva xyz binding is alive”消息。 这个绑定将多次实例化,因为我将断言绑定到的块在RTL中多次使用。现在,我获得了与实例化块一样多的“活着”消息,这些消息会模拟模拟的日志文件。
有没有办法防止这种情况发生?我想到的唯一方法是使用顶层变量并通过分层访问访问此变量,但这只是一个丑陋的解决方法。
这是我在sva绑定代码
开头添加的消息 `ifndef _ALARM_FLAG_SVA_ON
`define _ALARM_FLAG_SVA_ON
initial begin
$display ("-I-: SVA binding for ALARM_FLAG is alive.");
end
`endif
这里的问题是我只读了一次文件,这意味着ifndef对于所有多个实例绑定都是正确的。
感谢 第r
答案 0 :(得分:2)
您可以在包中分配一个位。使用$test$plusargs
控制功能的整体启用禁用。
package my_pkg;
bit alarm_sva_flag = $test$plusargs("alarm_sva_flag");
endpackage
然后在绑定模块的初始块中,检查位值。如果设置,请重置并显示,否则跳过。这只会显示一次消息。
if (my_pkg::alarm_sva_flag) begin
my_pkg::alarm_sva_flag = 0; // <- disable : prevent others from displaying
$display ("-I-: SVA binding for %s is alive.");
end
使用+alarm_sva_flag
运行时参数运行模拟时,消息将只显示一次。如果没有+alarm_sva_flag
,则不会显示任何消息。
UVM有另一种方法。这是一个陡峭的学习遏制,但一旦掌握了非常强大和多才多艺。通过编写自己的uvm_report_catcher
来识别消息,显示频率以及何时显示。由Cliff Cummings提供的网站Verification Academy和论文UVM Message Display Commands - Capabilities, Proper Usage and Guidelines是了解UVM和UVM信息的一些来源。
答案 1 :(得分:0)
简单解决方案:
创建一个包含在测试平台中的包(例如paTestConfig)。在此包中添加
localparam ALARM_FLAG_SVA_ON 0
现在检查每个绑定:
if (ALARM_FLAG_SVA_ON)
begin
$display ("-I-: SVA binding for %s is alive.", modulename);
end
因此,当您想调试绑定时,您只需将paTestConfig中的define更改为1即可显示您的消息。您还应该扩展此包以包含可在测试平台中参数化的所有内容。
时尚,可扩展,解决方案:
使用UVM package的报告功能。 UVM包具有特殊的报告宏,您可以在其中设置每条消息的&#34;重要性级别&#34;(详细程度)。然后,您可以使较低级别的信息静音,同时仍然可以从更重要的信息中获取信息。
import uvm_pkg::*;
`include "uvm_macros.svh"
**your binding here**
`uvm_info("Binding", $sformatf("Sva binding for module %s is alive", modulename), UVM_DEBUG);
要完成这项工作,首先必须弄清楚如何使用UVM运行模拟,基于编译器,这可能很简单或非常复杂。当您使用UVM运行时,请将以下行添加到命令行参数以更改详细级别。
+UVM_VERBOSITY=UVM_DEBUG //Turn on DEBUG level infos
或
+UVM_VERBOSITY=UVM_FULL //Turn off DEBUG level infos