在进行 AMS (Analog Mixed-Signal) 仿真时,有时会遇到 elaboration 阶段失败的情况,报错信息为 ncelab:*E,APCHNAncelab:*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 在下层有连接,这是不支持的

解决思路:

  1. 如果是 discipline resolution 导致的问题,可以使用 -disres none-setd 参数禁用
  2. 如果是代码结构问题,应该修改代码,将下层的连接移到上层,避免 alias port 在下层有连接

参考来源:Cadence Support Article a1O0V000006AgUCUA0 & a1O3w00000A1C7EEAV