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后,才能观察到真实的建立/保持违例和毛刺传播。
四、仿真器如何装配这些数据
在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中的时序条目无法生效,仿真会退化为零延迟逻辑仿真。
五、常见解析问题与判断依据
实际工程中,门级网表与库的解析问题集中在以下几类:
- 未定义模块:网表引用了库中不存在的单元,常见于综合工具版本与库版本不一致,或DFT单元未包含在仿真库中。判断依据是
ncelab报出module not found。 - 端口不匹配:库单元端口名与网表连接名不一致,例如库用
QN而网表写Q_N。编译时会报端口连接错误。 - SDF反标失败:层次路径不匹配或实例名被优化掉,日志中会出现
SDF annotation failed。此时需检查网表是否被综合工具做了名称保留(set_dont_touch或-hierarchy选项)。 - 时序检查被忽略:库模型缺少
$setuphold或$recrem任务,导致建立保持检查不执行。可通过在仿真日志中搜索timing violation是否出现来判断。