2

我需要将我的 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 版本?

4

1 回答 1

2

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

一个问题是waitVerilog 关键字,它不应该用作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. 这样做并没有真正解决任何问题。它只是让编译器走上了不同的道路。

于 2021-05-04T10:29:51.737 回答