verilog - 如何了解Cadence XMVLOG编译器支持哪些SystemVerilog?

标签 verilog system-verilog verification cadence

我需要将 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:

enter image description here

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

完成后,输出为: enter image description here

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

我还尝试了 xmvlog 的以下选项

-sv Force SystemVerilog compilation
-sysv2005 Only enable SV-2005 and earlier keywords
-sysv2009 Only enable SV-2009 and earlier keywords

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

最佳答案

问题出在您的代码上,而不是 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

但是,如果您确实需要引用,则可以使用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 用于任务。这样做并没有真正解决任何问题;它只是让编译器走上了不同的道路。

关于verilog - 如何了解Cadence XMVLOG编译器支持哪些SystemVerilog?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67382417/

相关文章:

Verilog:在始终 block 中等待模块逻辑评估

verilog - 如何使用 SystemVerilog 定义参数化多路复用器

prototype - 使用独立 DLL 文件验证串行 key - 转换函数 NSIS => Prototype => Pascal

ssl - 仅允许客户端使用组织 CA 签名的证书进行连接

verilog - 在 Verilog 中访问导线/规则尺寸

在 System Verilog 中打印打包结构

verilog - 系统 Verilog 中基于参数的类型定义

system-verilog - 创建子句柄数组

regex - 在使用 get_field_by_name 搜索字段时使用正则表达式

unit-testing - 为 VHDL 设计运行多个测试平台