如何了解 Cadence XMVLOG 编译器支持哪些 SystemVerilog?
How to understand which SystemVerilog is supported by Cadence XMVLOG compiler?
我需要将我的 SV 模拟环境从 Questa 转移到 Xcelium 20.9。
我在使用 xmvlog
编译文件时遇到问题,而使用 vlog
.
没有问题
这就是我所做的。
确保工具链安装正确:我 运行 这个简单的例子来自 edaplayground。它工作正常。我也能在Simvision中看到海浪
尝试更复杂的设计,其中包括一些 类 和包。
这是我无法继续的地方:我无法编译包。我试图简化文件并提取一个最小的非工作示例。
文件如下所示:
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 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, section 9.4 Procedural timing controls;它也是 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
。这样做并没有真正解决任何问题;它只是让编译器走上了不同的道路。
我需要将我的 SV 模拟环境从 Questa 转移到 Xcelium 20.9。
我在使用 xmvlog
编译文件时遇到问题,而使用 vlog
.
这就是我所做的。
确保工具链安装正确:我 运行 这个简单的例子来自 edaplayground。它工作正常。我也能在Simvision中看到海浪
尝试更复杂的设计,其中包括一些 类 和包。
这是我无法继续的地方:我无法编译包。我试图简化文件并提取一个最小的非工作示例。
文件如下所示:
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 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, section 9.4 Procedural timing controls;它也是 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
。这样做并没有真正解决任何问题;它只是让编译器走上了不同的道路。