在进行 AMS (Analog Mixed-Signal) 仿真时,有时会遇到 elaboration 阶段失败的情况,报错信息为 ncelab:*E,APCHNA 和 ncelab:*E,APNDOM。这些错误通常与 alias port(别名端口)的使用有关。
本文将介绍这两个错误的含义、产生原因以及解决方法。
错误信息
典型的错误信息如下:
1
2
*E,APNDOM: {*Name Protected*} is a port of digital domain and is not a valid alias port
*E,APCHNA: {*Name Protected*} has at least one lower-level connection. But, an alias port cannot have lower level connections.
其中 {*Name Protected*} 表示受保护的库文件,工具无法显示具体的文件路径。
问题原因
这些错误通常发生在以下两种情况:
1. Discipline Resolution 问题
当模块层次结构中包含 alias port 时,在 discipline resolution(规则解析)阶段可能会出现这些错误。特别是当库文件被加密保护时,错误信息中只会显示 *Name Protected* 而不显示具体路径。
2. Alias Port 在下层有连接
如果一个模块在下层定义了 alias port,并且该 port 在下层有实例连接,那么在上层使用该模块并尝试将多个信号别名到该 port 时,工具会报错。
例如:
1
2
3
4
5
6
7
8
9
10
11
// 下层模块
module mod1(.A(S1), .B(S1), .C(S1));
inout EEnet S1;
A_src alias1(S1); // S1 在下层有连接
endmodule : mod1
// 上层模块
module test ();
...
mod1 X(.A(t1), .B(t2), .C(t3)); // 尝试将 t1, t2, t3 别名到 S1
endmodule
在这种情况下,工具会报错,因为 alias port S1 在下层已经有了连接 (A_src alias1(S1)),不支持这种用法。
解决方法
根据具体情况,有以下几种解决方法:
方法 1a:全局禁用 Discipline Resolution
在 irun 命令中添加 -disres none 参数,全局禁用 discipline resolution:
1
irun -disres none ...
方法 1b:针对特定模块禁用 Discipline Resolution
如果已知问题出在某个特定模块,可以使用 -setd 参数只针对该模块禁用 discipline resolution:
1
irun -setd "no_dr <scope> <discipline>" ...
例如:
1
irun -setd "no_dr inst-Top.D1- logic1" ...
方法 1c:通过配置文件设置 -setdiscipline
除了在命令行中直接使用 -setd 参数外,还可以通过 .cdsenv 或 .cdsinit 文件来设置。这种方法特别适用于 AMS Virtuoso 使用模式(ADE 流程中的 AMS)。
注意:在配置文件中设置时,需要特别注意双引号的转义。缺少反斜杠转义是常见的错误来源。
在 .cdsenv 文件中设置:
1
ams.ncverilogOpts additionalArg string "-setdiscipline \"NET-top.f1.- electrical\""
在 .cdsinit 文件中设置:
1
envSetVal("ams.ncverilogOpts" "additionalArg" 'string "-setdiscipline \"NET-top.f1.- electrical\"")
关键点:
- 将
<scope>和<discipline>替换为实际的模块路径和规则名称
方法 2:修改代码,避免下层 Alias Port 有连接
这是更根本的解决方法。将下层的源连接移到上层,避免 alias port 在下层有连接:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 下层模块 - 移除下层连接
module mod1(.A(S1), .B(S1), .C(S1));
inout EEnet S1;
// A_src alias1(S1); // 移除这行,将源连接移到上层
endmodule : mod1
// 上层模块 - 在上层添加源连接
module test ();
...
// ALIAS SIGNALS
mod1 X(.A(t1),
.B(t2),
.C(t3));
// 在上层添加源连接
A_src alias1(t1);
endmodule
总结
- APNDOM 错误:端口属于数字域,不是有效的 alias port
- APCHNA 错误:alias port 在下层有连接,这是不支持的
解决思路:
- 如果是 discipline resolution 导致的问题,可以使用
-disres none或-setd参数禁用 - 如果是代码结构问题,应该修改代码,将下层的连接移到上层,避免 alias port 在下层有连接
参考来源:Cadence Support Article a1O0V000006AgUCUA0 & a1O3w00000A1C7EEAV