【问题标题】:How to understand which SystemVerilog is supported by Cadence XMVLOG compiler?如何理解 Cadence XMVLOG 编译器支持哪个 SystemVerilog?
【发布时间】:2021-05-04 09:49:09
【问题描述】:

我需要将我的 SV 模拟环境从 Questa 迁移到 Xcelium 20.9。 我在使用 xmvlog 编译文件时遇到问题,而使用 vlog 则没有问题。

这就是我所做的。

  1. 确保正确安装了工具链:我从edaplayground 运行了这个简单的示例。它工作正常。我也能在 Simvision 中看到海浪

  2. 尝试更复杂的设计,其中包括一些类和包。

这是我无法继续的地方:我无法编译包。我试图简化文件并提取一个最小的非工作示例。

文件如下所示:

package test_pkg;
  task wait (ref logic clock, int cycl_num);
    for (int k = 0; k < cycl_num; k++) begin
      @(posedge clock);
    end
  endtask : wait
endpackage

所以,一个任务的简单包。 运行xrun test/test_pkg.sv

这里有很多错误。我注意到的一件事是,在任务声明的开头添加void 可以解决其中的一些问题。

完成后,输出为:

问题出在任务定义中,因为如果它被删除我可以编译。

我还为 xmvlog 尝试了以下选项

-sv 强制 SystemVerilog 编译
-sysv2005 仅启用 SV-2005 及更早的关键字
-sysv2009 仅启用 SV-2009 及更早的关键字

但没有运气。 知道这里有什么问题吗?如何指定正确的 SystemVerilog 版本?

【问题讨论】:

    标签: verilog system-verilog verification cadence


    【解决方案1】:

    问题在于您的代码,而不是 Cadence 模拟器。

    一个问题是wait 是一个Verilog 关键字,它不应该用作task 名称。请参阅 IEEE Std 1800-2017,第 9.4 节 程序时序控制;它也是 1364 标准的一部分。 Questa 应该给你一个错误。

    您需要将名称更改为其他名称,例如 wait_clk。您还需要在endtask 关键字之后更改它。

    另一个问题是 Cadence 在使用 ref 时也会给我错误。

      task wait_clk (ref logic clock, int cycl_num);
                                   |
    xmvlog: *E,REFANA : reference argument is illegal inside static task-function declaration.
      task wait_clk (ref logic clock, int cycl_num);
                                                 |
    xmvlog: *E,REFANA : reference argument is illegal inside static task-function declaration.
    

    我认为您不需要将这些输入作为参考。如果是这种情况,那么您可以简单地将其删除:

    package test_pkg;
      task wait_clk (logic clock, int cycl_num);
        for (int k = 0; k < cycl_num; k++) begin
          @(posedge clock);
        end
      endtask : wait_clk
    endpackage
    

    但是,如果您确实想要 ref,您可以使用 nchelp 获取更多详细信息:

    nchelp xmvlog REFANA
    xmhelp: 20.09-s009: (c) Copyright 1995-2021 Cadence Design Systems, Inc.
    xmvlog/REFANA =
        A SystemVerilog reference argument, declared in the formal argument list
        of a task or function, must always be an automatic variable.  The enclosing
        task or function declaration must therefore use the 'automatic' keyword
        to promote all of its formal arguments into automatic variables.
    

    如果你只是想让clock 成为ref

    package test_pkg;
      task automatic wait_clk (ref logic clock, input int cycl_num);
        for (int k = 0; k < cycl_num; k++) begin
          @(posedge clock);
        end
      endtask : wait_clk
    endpackage
    

    您不应将void 用作task。这样做并没有真正解决任何问题。它只是让编译器走上了不同的道路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-01
      • 2016-05-01
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多