2. 门级网表与标准单元库解析

门级仿真的对象不是RTL代码,而是综合后映射到工艺库的门级网表,以及它所引用的标准单元库。理解这两类文件的结构与数据来源,是后续用Xcelium跑通门级仿真、做时序反标和功耗分析的前提。本节从门级网表的组成、标准单元库的功能模型与时序模型三个角度展开,并说明仿真器在读取这些文件时究竟拿到了哪些数据。

一、门级网表的结构

门级网表通常由综合工具(如Genus、Design Compiler)输出,本质是一份结构化的Verilog文件。它不再描述行为,而是把设计拆成一个个标准单元实例和它们之间的连线。一个典型的门级网表包含以下要素:

  • 模块声明:顶层模块名与端口列表,端口方向与RTL一致,但内部实现已完全替换为实例。
  • 标准单元实例:形如 NAND2X1 U12 (.A(n3), .B(n7), .Y(n9));,每个实例对应库中一个真实单元,实例名由综合工具生成。
  • 连线网络:wire 声明连接各实例端口,网络名可能来自RTL信号,也可能是综合产生的中间节点。
  • 端口连接:顶层输入输出端口与内部网络的映射关系。

需要特别注意的是,门级网表中还会出现一些非功能单元,例如扫描链插入后的扫描触发器、时钟门控单元、缓冲器与反相器链、以及用于修复时序的延迟单元。这些单元在RTL中并不存在,是综合与DFT阶段引入的,仿真时必须由库提供对应模型,否则会出现未定义模块错误。

二、标准单元库的组成

标准单元库一般以Liberty(.lib)格式描述,经库编译器转换为二进制.db供综合使用,而仿真则直接读取Verilog功能模型或VITAL模型。一个完整的库包含三类信息:

类别内容仿真用途
功能模型单元的Verilog/VITAL行为描述决定逻辑输出,支撑功能仿真
时序模型延迟表、约束、时序检查支撑SDF反标与时序仿真
物理/功耗信息面积、引脚电容、功耗表功耗分析与负载计算

功能模型通常由库厂商提供,写法上分为两种:一种是纯Verilog的module描述,用assign或always实现逻辑;另一种是VITAL兼容模型,用VITAL_Level0或VITAL_Level1标注,并带有timing块。Xcelium在门级仿真时,若使用VITAL模型,需要开启VITAL库支持,否则时序信息不会被识别。

三、时序模型与SDF的关系

Liberty中的时序信息以查找表形式存在,例如cell_rise、cell_fall、rise_transition等,表的两个输入通常是输入转换时间(input transition)和输出负载电容(output load)。综合工具根据实际负载和转换时间查表得到延迟,再写入SDF文件。SDF中的IOPATH、INTERCONNECT、SETUP、HOLD等条目,正是从Liberty时序模型和实际布线寄生参数计算而来。

因此,门级仿真对象的数据来源可以概括为:网表提供连接关系,功能模型提供逻辑行为,时序模型提供延迟与约束,SDF提供具体数值。四者缺一不可。若只加载网表和功能模型,仿真只能验证逻辑等价性;只有反标SDF后,才能观察到真实的建立/保持违例和毛刺传播。

门级仿真对象的数据来源与装配关系 门级网表 (.v) • 标准单元实例 • wire 网络连接 • 端口映射 • DFT/时钟门控单元 标准单元库 (.lib/.v) • 功能模型 • 时序查找表 • 时序约束检查 • 引脚电容/功耗 Xcelium 门级仿真 ncelab 编译 + ncsim 运行 VITAL 库支持 / SDF 反标 连接关系 逻辑+时序 SDF 时序反标文件 IOPATH / INTERCONNECT SETUP / HOLD 延迟数值 数据来源:网表=连接关系,功能模型=逻辑行为,时序模型=延迟与约束,SDF=具体数值

四、仿真器如何装配这些数据

在Xcelium中,门级仿真的编译与运行分为两步。第一步用ncelab把网表、功能模型和库文件一起编译成仿真快照,此时仿真器会检查每个实例是否都能在库中找到对应模块,并解析端口连接。第二步用ncsim运行快照,通过-sdf选项指定SDF文件,把延迟数值反标到对应的实例和网络上。

# 编译门级网表与标准单元库
ncelab -vital -timescale 1ns/1ps \
       work.top work.NAND2X1 work.DFFRX1 \
       -sdf_cmd_file sdf.cmd

# 运行仿真并反标SDF
ncsim -sdf max:top:top.sdf work.top -input run.tcl

其中-vital告诉仿真器启用VITAL时序检查,max:top:top.sdf表示对top模块使用最大延迟角(max corner)的SDF。若库模型是纯Verilog功能模型而没有VITAL标注,则SDF中的时序条目无法生效,仿真会退化为零延迟逻辑仿真。

实践提示:门级仿真前先确认三件事——网表中所有实例名都能在库中找到、库模型是否带VITAL标注、SDF的层次路径与网表顶层是否一致。这三项任一不匹配,都会导致编译报错或时序不生效。

五、常见解析问题与判断依据

实际工程中,门级网表与库的解析问题集中在以下几类:

  • 未定义模块:网表引用了库中不存在的单元,常见于综合工具版本与库版本不一致,或DFT单元未包含在仿真库中。判断依据是ncelab报出module not found。
  • 端口不匹配:库单元端口名与网表连接名不一致,例如库用QN而网表写Q_N。编译时会报端口连接错误。
  • SDF反标失败:层次路径不匹配或实例名被优化掉,日志中会出现SDF annotation failed。此时需检查网表是否被综合工具做了名称保留(set_dont_touch或-hierarchy选项)。
  • 时序检查被忽略:库模型缺少$setuphold或$recrem任务,导致建立保持检查不执行。可通过在仿真日志中搜索timing violation是否出现来判断。