2. 门级网表与标准单元库基础

门级仿真的输入不是RTL代码,而是综合后产生的门级网表;它的行为不是由Verilog描述直接决定,而是由网表中例化的标准单元和这些单元在工艺库中的模型共同决定。理解“网表结构—库模型—工艺角”这条链路,是后续SDF回标与门级验证能否成立的前提。

门级网表的结构

门级网表本质上是“实例+连接”的集合。综合工具把RTL中的运算符、条件分支、寄存器推断结果映射为具体标准单元,再按原逻辑连接关系连线。一个典型网表片段如下:

module top (clk, rst_n, a, b, y);
  input clk, rst_n, a, b;
  output y;
  wire n1, n2, q;

  NAND2X1  U1 (.A(a),  .B(b),  .Y(n1));
  INVX2    U2 (.A(n1), .Y(n2));
  DFFRX1   U3 (.D(n2), .CK(clk), .RN(rst_n), .Q(q));
  BUFX4    U4 (.A(q),  .Y(y));
endmodule

其中NAND2X1、INVX2、DFFRX1、BUFX4是库中真实存在的单元名,U1~U4是实例名,n1、n2、q是内部连线。与RTL不同,门级网表里没有always、assign这类行为描述,只有实例化与端口连接。仿真器对网表的处理方式,是把每个实例替换为库中对应的功能模型,再按连线传播事件。

网表还包含层次结构。综合可能保留层次,也可能展平。层次影响调试时定位信号的方式,也影响SDF反标的作用范围:SDF中的层次路径必须与网表实例路径一致,否则反标会失败或部分失败。

标准单元库的组成

标准单元库不是单一文件,而是一组按单元组织的模型集合。每个单元通常包含三类模型:

  • 功能模型:描述单元的逻辑行为,例如NAND2的输出是A与B的与非,DFF在时钟上升沿采样D。门级仿真中,功能模型决定逻辑值如何变化。
  • 时序模型:描述单元从输入到输出的延迟、约束和时序检查,例如cell_rise、cell_fall、rise_transition、setup_rise、hold_rise。SDF回标时,仿真器主要使用这部分数据。
  • 功耗模型:描述单元在不同输入状态和输出负载下的内部功耗、漏电功耗等,通常用于功耗分析,门级功能仿真一般不直接使用,但它与库文件同源。

这三类模型共同构成一个单元的完整描述。功能模型让仿真“算得对”,时序模型让仿真“算得准”,功耗模型让后续分析“算得省”。

.lib与.db的关系

工艺库常见两种形式:.lib是文本格式,可读、可编辑,包含单元功能、时序表、功耗、引脚电容等信息;.db是Synopsys工具使用的二进制格式,由.lib经Library Compiler编译得到。二者内容对应,但用途不同:

文件格式典型用途
.lib文本查看、修改、版本管理、生成.db
.db二进制DC综合、PrimeTime、VCS门级仿真读取

实际流程中,库供应商通常同时提供.lib和.db。若只拿到.lib,可用lc_shell执行read_lib与write_lib生成.db。门级仿真时,仿真器读取的是.db或由.lib转换后的库,而不是RTL中的行为模型。

工艺角与PVT条件

同一套标准单元在不同工艺角下延迟不同。工艺角由工艺(Process)、电压(Voltage)、温度(Temperature)三个维度组合而成,简称PVT。常见角包括:

  • SS:慢工艺、低电压、高温,单元延迟最大,用于建立时间检查。
  • FF:快工艺、高电压、低温,单元延迟最小,用于保持时间检查。
  • TT:典型工艺、标称电压、常温,用于一般功能验证。

门级仿真选择哪个角,取决于验证目标。若验证功能正确性,通常用TT角;若验证时序收敛,则需在SS角跑建立检查、在FF角跑保持检查。SDF文件也是按角生成的,反标时必须与仿真使用的库角一致,否则延迟数据与单元模型不匹配,结果不可信。

门级网表、标准单元库与PVT关系图 门级网表 实例:U1 NAND2X1 实例:U2 INVX2 实例:U3 DFFRX1 连线:n1, n2, q 层次:top/U1, top/U3 无 always / assign 标准单元库 功能模型(逻辑行为) 时序模型(延迟/约束) 功耗模型(内部/漏电) 工艺角 / PVT SS:慢工艺/低压/高温 TT:典型/标称/常温 FF:快工艺/高压/低温 例化 按角选择 SDF 反标文件 按PVT角生成,路径与网表实例层次一致 反标后延迟数据覆盖库中默认时序 时序数据 角一致 门级仿真 功能 + 时序 + 反标延迟

实际配置中的关键点

在VCS门级仿真中,库和SDF通常通过编译选项和仿真选项传入。例如:

vcs -full64 -sverilog \
    +neg_tchk \
    -debug_access+all \
    -timescale=1ns/1ps \
    top.v netlist.v \
    -y $LIB_PATH \
    +libext+.v \
    -l compile.log

./simv +sdf_verbose +sdf_nocheck_celltype \
    -sdf max:top.U3:$SDF_PATH/ff.sdf \
    -l sim.log

其中-y指定库单元Verilog模型路径,+libext+.v指定扩展名;-sdf max:top.U3:...表示对top.U3实例按max角反标SDF。若SDF中的层次路径与网表不一致,日志会出现“SDF annotation failed”或“cell not found”,此时需要检查综合后的实例名是否被优化或重命名。

门级仿真前先确认三件事:网表实例名与SDF路径一致、库角与SDF角一致、仿真器已启用负时序检查(+neg_tchk)。这三项任一不满足,时序结果都可能失真。

总结来看,门级网表提供“谁连谁”,标准单元库提供“每个单元怎么动、动多快、耗多少”,PVT决定“用哪一组数据”。SDF回标则是把特定角下的延迟数据注入网表实例,使仿真从理想逻辑走向带时序的真实行为。理解这三层关系,后续的SDF反标、时序检查和结果判读才有可靠基础。