系统verilog

时间:2015-11-11 09:24:09

标签: verilog system-verilog

我有以下问题需要解决。我使用绑定将系统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

2 个答案:

答案 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