ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Nangate 45nm FreePDK实战:跑通开源数字设计全流程

Nangate 45nm FreePDK实战:跑通开源数字设计全流程 第一次把 Nangate 45nm FreePDK 跑进数字设计流程是在一个完全没有商业 PDK 授权的环境里。当时手头只有一份课程给的 RTL 代码、一台普通工作站以及一个看似不起眼的开源工艺库压缩包。一开始我把它当成一个能凑合用的教学工具后来才发现这套开源工艺库在数字设计流程里承担的角色远比我以为的重要它不只是让你把综合、布局布线跑通更是理解整个数字后端方法论的一个绝佳载体。尤其对于学生、开源芯片项目团队、以及还没拿到商用工艺库访问权限的工程师来说Nangate 45nm 配合 FreePDK 的整套标准单元库几乎是数字设计流程完整闭环的最低成本入口。这篇内容我就按自己从零开始使用的实际路径来拆把文件作用、流程接入、环境配置、典型坑、以及它和真实流片 PDK 的差距一次讲清楚。1. Nangate 45nm FreePDK是什么开源工艺库在数字设计流程里的真实坐标1.1 为什么数字设计流程离不开工艺库抽象很多刚接触数字 IC 的人容易有个误区以为写好了 Verilog剩下的就是让工具自动生成版图。但实际上综合工具也好、布局布线工具也好它们根本不直接理解晶体管和金属层它们只认识工艺库。工艺库就是工具和真实硅片之间的翻译层。一个标准数字流程里工具需要几类东西逻辑综合需要 Liberty 时序库里面描述了每个标准单元的延时、功耗、面积、逻辑功能布局布线需要 LEF 抽象里面定义了单元的形状、pin 位置、布线阻挡层物理验证需要 GDS 和 CDL前者是版图多边形后者是晶体管级网表。这些东西组合在一起才构成一个可用的工艺平台。Nangate 45nm FreePDK 恰恰就是把这套东西打包好了。相比很多只能看不能用的早期开源 PDK这套工艺库的好处是它提供了标准单元库的完整视图从 .lib 到 .lef 到 .gds 到 .v全部齐全。你不需要自己画任何版图直接在数字设计流程里用就行。1.2 Nangate 和 FreePDK 的关系标准单元库PDK这里需要先厘清一个概念Nangate 45nm 并不是一个包含所有工艺文件的完整 PDK而是标准单元库的部分它配合 FreePDK45 平台一起使用。具体拆开看FreePDK45 是北卡罗莱纳州立大学NCSU主导的开放工艺 PDK定义了 45nm 工艺的基础抽象包括金属层、过孔、设计规则、器件模型层面的内容适合做学术研究和教学。NangateOpenCellLibrary 是 Nangate 公司捐赠的一套 45nm 标准单元库包含从 INV、NAND、NOR 到 DFF、AOI、OAI、全加器等常用单元并且基于 FreePDK45 的工艺假设做了后端物理实现。所以你在实际使用中通常说的用 Nangate 45nm 跑流程其实是指使用 Nangate 提供的标准单元库作为主要抽象同时参考 FreePDK45 的工艺规则来定义芯片的物理环境例如 45nm 工艺下的金属层堆叠、引脚位置、标准单元行高度等。数字设计流程里的关键角色就在这里它不只是提供时序参数更是把工艺不可见变成工具可见的桥梁。没有这套库综合工具连一个 NAND 门的延时都算不出来。1.3 它能做什么不能做什么说完了定位说边界。Nangate 45nm FreePDK 能做的事情非常多跑通从 RTL 到 GDS 的完整数字流程做逻辑综合、时序分析、功耗评估、布局布线、ECO、形式验证甚至生成最终的 GDS 交给 DRC 工具检查。对绝大多数教学项目和开源芯片项目来说它的能力已经足够支撑一个完整 PPA性能-功耗-面积评估。但它不能做的是真实流片。请注意这一点极其重要。Nangate 45nm Open Cell Library 是基于 FreePDK45 工艺模型开发的开放库并没有经过真实 Foundry 的工艺验收。它的延时模型、单元版图、设计规则不是某个具体代工厂的最终版本。你可以把它理解为虚拟工艺平台用来学习流程、开发方法学、评估工具链非常合适但产出结果不能直接拿去硅验证。有趣的是恰恰是这个边界让它更适合做数字设计流程教学。因为是虚拟工艺你不需要签 NDA不需要处理厂家的机密信息可以放心把整个流程讲透、跑透、调试透。2. 落地第一步把PDK目录结构和EDA环境理顺2.1 文件夹里那些文件到底干什么用拿到 Nangate 45nm FreePDK 的压缩包之后第一件事不是急着丢给工具而是先花半小时把目录看明白。这一步能省下后面大量的排查时间。我习惯的目录结构大致是这样的FreePDK45/ ├── NangateOpenCellLibrary_PDKv1_3_v2010_12/ │ ├── lib/ │ │ ├── NangateOpenCellLibrary_typical.lib │ │ ├── NangateOpenCellLibrary_fast.lib │ │ └── NangateOpenCellLibrary_slow.lib │ ├── lef/ │ │ └── NangateOpenCellLibrary.lef │ ├── gds/ │ │ └── NangateOpenCellLibrary.gds │ ├── verilog/ │ │ ├── NangateOpenCellLibrary.v │ │ └── NangateOpenCellLibrary_netlist.v │ ├── cdl/ │ │ └── NangateOpenCellLibrary.cdl │ ├── tech/ │ │ └── ...这些文件分别对应流程中的不同工具lib/下的 .lib 文件是 Liberty 时序库主要喂给逻辑综合和静态时序分析工具。typical、fast、slow 分别代表典型工艺角、快工艺角、慢工艺角。实际项目里通常至少要用 slow 和 fast 两个角去检查建立时间和保持时间。lef/下的 .lef 文件是物理抽象喂给布局布线工具告诉工具每个单元占多大面积、pin 在哪个位置、哪些层可以走线。记住它不是完整版图只是抽象。gds/下的 .gds 文件是单元的实际版图多边形主要用于物理验证、最终导出、和 DRC/LVS。verilog/下的 .v 文件是功能仿真和网表仿真用的同时也可以给形式验证工具提供参考网表。cdl/下的 .cdl 文件是晶体管级网表主要做 LVS 时用。你自己做项目的时候不一定每个文件都会用到但心里要清楚任何一个文件缺失对应的那一环工具就会罢工或给出不可靠的结果。比如你综合只读 .lib不读 .lef那布局布线工具就无法导入。2.2 环境变量与工具链版本匹配PDK 文件本身不会自动进入工具你需要通过环境变量或者脚本把路径暴露给工具。不同工具读库的方式不太一样但整体上可以分为两类基于 Tcl 的脚本和基于文件列表的配置。先给一个通用的环境变量示例export PDK_ROOT/home/user/FreePDK45 export NANGATE45$PDK_ROOT/NangateOpenCellLibrary_PDKv1_3_v2010_12 export NANGATE45_LIB$NANGATE45/lib export NANGATE45_LEF$NANGATE45/lef然后在一个统一的环境脚本里把工具路径、PDK 路径全部 source 好。我个人的做法是建一个setup.tcl把常用的读库命令写好这样不管是跑综合、跑布局布线还是跑时序分析只需要改几个变量。工具版本匹配上有两点必须注意。第一LEF 版本不能太新。Nangate 这套库的 LEF 文件格式比较老用较新版本的布局布线工具读取时有时候会出现 Unknown version 或者 pin 属性不识别的问题。解决方式通常是需要开启工具的旧版 LEF 兼容模式比如设置set_db lef_version 5.7这类选项。第二Liberty 文件的语法兼容性。多数工具都支持比较老的 Liberty 语法但少数新工具默认会开更严格的检查遇到cell_footprint、dont_use这些老旧字段时会有 warning。这些 warning 大部分可以忽略但你要分清楚 warning 和 error 的区别别看到一屏 warning 就觉得环境坏了。2.3 用OpenROAD快速验证环境如果你还没有商业工具授权或者只是想先验证 PDK 文件没问题我非常推荐用 OpenROAD 这套开源工具链搭配 Yosys 做逻辑综合、OpenSTA 做时序分析、OpenROAD 本身做布局布线。它是把整个 RTL-to-GDS 流程开源化的代表而且对 LEF/DEF、Liberty 的支持很完整。用 OpenROAD 读 Nangate 库一个最小化的测试脚本长这样set init_lef_file $::env(NANGATE45_LEF)/NangateOpenCellLibrary.lef set init_verilog /path/to/your_design.v set init_design_netlist_type Verilog set init_mmmc_file /path/to/mmmc.tcl set init_pwr_net VDD set init_gnd_net VSS source /path/to/OpenROAD-flow-scripts/flow/scripts/init_floorplan.tcl实际跑之前还需要一个 mmmc 配置来定义 corner 和 librarycreate_library_set -name typical \ -timing $::env(NANGATE45_LIB)/NangateOpenCellLibrary_typical.lib create_constraint_mode -name func_mode -sdc_files /path/to/constraints.sdc create_delay_corner -name default_dc -library_set typical create_analysis_view -name setup_view -constraint_mode func_mode -delay_corner default_dc set_analysis_view -setup {setup_view} -hold {setup_view}我第一次用这个组合跑通一个简单的 8-bit 加法器从综合到布线到生成 GDS整个过程不到半小时。这一步的成功验证意味着你的环境已经具备跑完整数字设计流程的基础。3. 从RTL到GDS用Nangate 45nm跑通完整数字前端到后端流程3.1 逻辑综合Liberty库选择与线负载模型逻辑综合是所有数字设计流程的起点。你写的 RTL 是行为级的综合工具要把它映射到 Nangate 标准单元库上输出一个门级网表。用 Yosys 做综合的命令大致是这样的read_verilog rtl/top.v hierarchy -top top proc; flatten; opt; fsm; opt; memory; opt techmap; opt dfflibmap -liberty $NANGATE45_LIB/NangateOpenCellLibrary_typical.lib abc -liberty $NANGATE45_LIB/NangateOpenCellLibrary_typical.lib -script strash;scorr;ifraig;retime;strash;dch,-f;map,1,20 clean write_verilog synthesis/top_netlist.v write_smt2 synthesis/top_smt2.smt2这段命令里最关键的是abc那一步它负责把泛化的逻辑门映射到 Nangate 单元库的具体单元。这里有两个容易忽略的点第一.lib文件的选择会直接影响综合结果。typical角通常用于做中间阶段评估和功耗估计slow角用于检查建立时间fast角用于检查保持时间。如果你只用了typical一个库后面在 OpenSTA 里做多角检查时就会出现库缺失的问题。所以从一开始就建议把三个角都准备好。第二早期工艺库通常自带线负载模型wire load model但 Nangate 这套库的线负载模型比较粗糙它假设线电容和扇出有固定关系这在 45nm 工艺下并不准确。如果你只是学习流程用默认模型没问题但如果想做更接近物理实际情况的时序评估就要以布局布线之后的 SPEF 为主综合阶段的线负载模型只是粗略参考。综合完成之后一定要打开生成的网表看一眼确认里面确实出现了 Nangate 的单元例如NAND2_X1、DFF_X1这样的名字而且没有留下_smt2之类的垃圾逻辑。很多人跑完综合直接进去布局布线结果发现网表里全是未知黑盒单元这就是因为abc映射失败或者 dfflibmap 没有成功。3.2 布局布线LEF抽象与floorplan布局布线阶段是数字设计流程中最能体现角色的部分。Nangate 的 LEF 文件告诉布局布线工具每个单元的形状和 pin 位置工具据此把单元摆放出来再通过金属线连接。用 OpenROAD 做布局布线之前我建议先手动设置好 floorplan 参数set die_area 0 0 200 200 set core_area 10 10 190 190 floorplan -r 0.7 0.7 10 10这里的0.7 0.7分别表示 core 利用率和行高利用率10 10是 core 到 die 的间距。对于 Nangate 45nm 这套库行高通常是单元高度的整数倍单元高度在 LEF 里有明确标注正常情况下工具会自动对齐。如果你用的是 9-track 还是 12-track 的标准单元这里会影响布线资源的多少。Nangate 这套库属于比较小的标准单元库行高选择不激进的话12-track 会更稳妥但面积会大一些。布局布线过程中最需要关注的报告有两个拥塞报告congestion report。如果 floorplan 面积开得太小绕线资源不够工具会四处绕线最后时序和 DRC 都会崩。Nangate 库里的单元数量有限驱动强度选择不多面积给得太紧时往往需要降利用率。单元密度报告。布局完成之后检查一下看看有没有大片空白或者单元堆叠。45nm 工艺下的标准单元行宽并不宽但依然要避免把高速单元塞在角落里。布线完成之后用 OpenROAD 输出 DEF 和 GDSwrite_def results/top.def write_gds results/top.gds这个时候生成的 GDS 只是布局布线后的 GDS里面包含的是标准单元版图实例和金属连线但并不等于经过完整物理验证的最终 GDS。它的意义在于你可以把它导进 KLayout 或者其他版图工具里看到整个芯片的实际样子。3.3 时钟树综合与时序收敛时序分析是数字设计流程中永远绕不开的话题。使用 Nangate 45nm 跑时序我的建议是不要在综合阶段就纠结到极致而是先让布局布线跑通再针对时钟树和关键路径做优化。OpenSTA 的时序分析脚本通常这么写read_liberty $NANGATE45_LIB/NangateOpenCellLibrary_slow.lib read_verilog synthesis/top_netlist.v link_design top read_sdc constraints/top.sdc set_propagated_clock [all_clocks] report_checks -path_delay max -digits 4 report_checks -path_delay min -digits 4实际项目中我见过不少人在这个阶段被 hold time 卡住。Nangate 库的 fast corner 比 typical corner 快不少DFF 的 CK-to-Q 延时差异明显如果你的 SDC 里没有设置好 generated clock 和时钟 uncertaintyOpenSTA 很快会报一大堆 hold violation。处理时序收敛有一个基本顺序先修 setup再修 hold。因为 setup 关系到功能逻辑能否在时钟周期内稳定下来hold 则是时序边缘可能导致的采样错误。大多数开源流程里工具自动优化 setup 的能力比较强但 hold 优化往往需要你手动插入 buffer 或者做有用的时钟偏斜。还要注意Nangate 的时序库是基于理想时钟模型做特性化的实际时钟树综合之后你需要使用 SPEF 文件重新做签核级时序分析。这一步才是流程中真正逼近真实的时刻。如果只用综合阶段的零线延迟来签核结果会和实际物理实现差得很远。3.4 GDS导出与DRC/LVS认知当布局布线结束且时序收敛通过数字设计流程进入最后阶段导出 GDS做物理验证。这一步最容易让人误解因为很多人以为没有 DRC error 就代表可以流片了。在 Nangate 45nm FreePDK 这套环境里GDS 导出后确实可以用 KLayout 打开查看klayout results/top.gds但这里要特别强调这套库的 DRC 规则是虚拟的没有经过真正 Foundry 的验收。从 GDS 里你确实能看到金属层、过孔、单元多边形但你不能把它当作某个 45nm 工艺厂的实流版本。它给你的价值是流程上的物理验证预演——让你理解 DRC 是检查什么、LVS 是比对什么、为什么版图需要这些规则。如果你需要做 LVS需要同时准备 CDL 网表和 GDS。Nangate 的.cdl文件描述的是每个标准单元内部的晶体管连接布局布线产生的版图需要和综合网表做比对。由于 OpenROAD 输出的 GDS 本身就来自原始单元库 GDS 的实例理论上 LVS 应该很容易通过但如果你在脚本里对单元做了改名、翻转、或者 merge就有可能出现 mismatch。4. 踩过的坑和填坑方法Nangate 45nm实际使用中常见问题清单4.1 库文件缺失与Missing cell这个是新手最容易踩的第一个坑。综合网表里出现了DFF_X1、NAND2_X1但布局布线工具读 LEF 时发现库里没有这个 cell直接报Missing cell。为什么会出现这种情况多半是网表里的单元名与 LEF 里的单元名大小写不一致或者你用了某个库封装里没有的单元。Nangate 库里有多个版本的目录不同版本的单元名命名会有微小差异例如 X1、X2、X4 的驱动强度后缀。如果你在综合时用了typical.lib但布局布线时读的 LEF 文件却是另一套版本的就极容易出问题。解决方式很朴素统一库版本。我建议在setup.tcl顶部做一次库文件列表校验把所有文件的路径打印出来确认lib/、lef/、gds/来自同一个目录。不要凭记忆复制路径。还有一个隐藏问题有些综合工具默认会对未映射的单元保留成$_NOT_之类的内部门形式如果直接写网表出来OpenROAD 会把它当黑盒。这种情况需要在综合脚本里加clean -purge把未映射的中间逻辑清掉。4.2 Typical、Slow、Fast三个corner的时序口径不一致Nangate 这套库提供的三个 .lib 文件对应的是不同工艺角但它们之间不只是 delay 数字不同部分单元的 setup/hold 时序弧也可能有比例差异。这意味着你不能只拿 typical 角做完一切优化然后指望改成 slow 角后只会整体变慢。我在实际跑一个 32 位 ALU 时遇到过这样的事在 typical 角下 setup 余量有 0.2ns换成 slow 角后某条路径因为单元延时增长分布不均匀出现了 0.05ns 的 violation。排查了很久发现是路径上有一段组合逻辑的单元在 slow 角下上升沿和下降沿延时失衡比较严重。解决思路不复杂从综合阶段开始所有关键步骤至少用 slow 角做 setup 检查用 fast 角做 hold 检查。综合阶段可以宽松一点但到布局布线之后一定要切到签核视角重新跑一遍时序。4.3 LEF版本和布局布线工具兼容问题这一条主要影响想直接用最新版商业工具的人。Nangate 的 LEF 文件年代比较久里面对SITE、CLASS、SYMMETRY等关键字的定义方式比较老。新版布局布线工具对 LEF 的解析越来越严格有些地方会直接报错。我实测过在 Innovus 或 OpenROAD 里读 Nangate LEF通常会遇到以下两类问题LEF 版本的 5.7 字段与新工具的解析器不兼容报Unknown version。单元在 LEF 中定义为COREclass但新工具要求必须指定SITE否则 floorplan 无法识别行高和 site 宽度。这两种问题的处理方式通常是修改 LEF 文件头部的版本声明以及在 LEF 中补全SITE定义。注意改完 LEF 后一定要重新跑一遍布局布线冒烟测试确认没引入新的 geometry 问题。4.4 功耗评估时波形信息的缺失很多人在用 Nangate 45nm 做功耗分析时发现功耗数字看起来很可疑要么奇高要么奇低。这不一定是库有问题更多是因为你没有提供翻转率信息。功耗分析需要知道每个 net 的 toggle rate在布局布线早期阶段如果没有门级仿真产生的 SAIF 文件工具会使用默认的翻转率通常 0.1 或 0.2这个值对真实电路来说非常不准。尤其是时钟网络默认翻转率往往会严重高估动态功耗。我的经验是如果你是做设计方法学验证功耗数值的相对趋势比绝对值更重要。不同实现方案之间只要 PWM 翻转率设置一致得出的结论就有参考价值。但千万不要拿着 Nangate 的功耗报告去对外宣称我们芯片功耗是 X mW。5. 从教学到研究再到流片怎么看待FreePDK的边界5.1 用开源工艺库做科研与教学的价值为什么这么多高校、研究机构、开源芯片项目愿意选 Nangate 45nm FreePDK因为它把数字设计流程的门槛降到了一个近乎免费的程度。学生不需要等学校采购商业 PDK不需要签保密协议就可以在自己的笔记本上跑完一次完整的数字后端实验。对于教学它的价值尤其突出。你可以把教学重点完全放在流程和方法论上综合策略如何影响面积、floorplan 怎么影响拥塞、时钟树综合怎么影响时延、ECO 修复怎么改 hold。这些内容不会因为工艺是 45nm 还是 5nm 发生本质变化。掌握了方法论换到先进工艺只是换库的问题。对于科研它是算法验证的极好载体。比如做机器学习辅助的布局布线、做新的时钟树综合算法、做低功耗单元优化很多工作是可以在 Nangate 45nm 上先验证效果的。因为它可复现、可分发、没有保密约束同行评审时更容易被人接受。5.2 从FreePDK转向商用PDK时需要补哪些认知我最后想提醒的是不要把开源工艺库的经验无缝平移到商业流片项目。真实商用 PDK 里除了标准单元库还有大量 Nangate 这套虚拟库不具备的东西完整的 RC 寄生参数提取规则文件、天线效应规则、ESD 单元、IO PAD、存储器编译器、模拟 IP、metal fill 规则、复杂的设计 rule deck。从 FreePDK 转向商用库时大多数人会面临三个认知冲击签核标准完全不同。商用 PDK 的时序库包含几十个 corner 和多种电压模式你需要理解ss_cworst、ff_best、rcbest_125c等术语而 Nangate 这套只有三个基本角。物理库的抽象层级更多。商用库里除了 LEF还有 Milkyway、NDM 之类的二进制格式不同工具链的读取方式也不一样。DRC 规则极其复杂。商用 PDK 会有几十页甚至上百页的设计规则Nangate 的规则只能称之为教学版。但这不是说用 Nangate 的经验没用。正相反数字设计流程的核心方法论——从 RTL 综合到网表、从 floorplan 到时序收敛、从 GDS 到物理验证——是高度一致的。你在 FreePDK 上练出来的跑流程的感觉会在你第一次接触商用库时给你巨大的底气因为你知道时序分析要看哪些报告、布局布线卡住了先去查哪里、congestion 和 density 的关系怎么权衡。我在实际项目里带过不少新人观察到一个规律凡是先在开源工艺库上完整跑过一遍数字流程的人上手商用库的速度普遍快很多。他们对为什么会报错的理解不是靠背命令而是靠对整个链条的直觉。这种直觉恰恰就是开源工艺库最宝贵的产出。
返回列表