第三章:RTL到GDSII全流程初探:OpenROAD流程架构、设计输入文件、一键式自动化运行

各位同学,欢迎来到第三章。说实话,很多刚接触芯片设计的工程师,一听到「从RTL到GDSII」就觉得头大。我当年也一样,觉得这玩意儿得用上百万的EDA工具,还得配个专门的CAD团队。但OpenROAD的出现,说白了就是要把这件事「平民化」。

这一章,咱们不搞虚的。直接看看OpenROAD到底怎么把代码变成版图,以及它需要哪些「食材」才能开火做饭。

3.1 OpenROAD流程架构:一个「流水线」的故事

OpenROAD的流程,你可以想象成一条汽车生产线。从一堆零件(RTL代码)进去,到一辆完整的车(GDSII版图)出来,中间经过好几个工位。每个工位干一件事,互不干扰,但又紧密衔接。

我个人习惯把OpenROAD的流程分成三大阶段:

  • 前端准备:把RTL代码、约束文件、库文件准备好,相当于把食材洗好切好。
  • 后端实现:从逻辑综合开始,到布局布线、时钟树综合,这是最核心的烹饪过程。
  • 签核验证:检查做出来的菜有没有毒(DRC/LVS),味道对不对(STA)。

下面这张图,是我自己画的OpenROAD流程架构图。你仔细看看,每个模块之间都有数据流动。

OpenROAD 全流程架构图 阶段一:前端准备 阶段二:后端实现 阶段三:签核验证 RTL解析 SDC约束 逻辑综合 布局布线 DRC/LVS STA Verilog + SDC DEF + LEF GDSII 最终输出:GDSII 每个阶段都有对应的检查点,确保数据质量

嗯,这张图你看懂了吗?其实核心就一句话:数据从左往右流,每一步都在前一步的基础上加工。我在项目中遇到过不少新人,上来就想跳过某一步直接跑,结果后面一堆问题。记住,芯片设计没有捷径。

3.2 设计输入文件:OpenROAD的「三驾马车」

OpenROAD要跑起来,至少需要三种文件。少了任何一个,流程都跑不动。我管它们叫「三驾马车」。

3.2.1 Verilog:芯片的「源代码」

Verilog文件,说白了就是你的设计本身。它描述了芯片里每个模块的逻辑功能。OpenROAD支持两种输入:

  • RTL级Verilog:还没综合的代码,包含always块、assign语句等。
  • 门级网表:已经综合过的,只有标准单元和连线。

我个人建议,如果你刚开始用OpenROAD,最好用门级网表。为什么呢?因为RTL综合这一步,OpenROAD的yosys工具虽然能用,但效果不如商业工具稳定。我曾经有一次用RTL直接跑,结果综合出来的面积比预期大了30%,排查了半天才发现是综合策略没调好。

小提示:OpenROAD的yosys支持SystemVerilog 2012的大部分语法,但别忘了检查你的代码里有没有用SystemVerilog 2017的新特性,比如unique0、priority等。这些可能会报错。

3.2.2 SDC:芯片的「交通规则」

SDC(Synopsys Design Constraints)文件,就是告诉工具你的芯片要跑多快、哪些路径是假的、哪些时钟是异步的。没有SDC,工具就像没有地图的司机,乱开一气。

一个典型的SDC文件长这样:

# 创建时钟
create_clock -name clk -period 10.0 [get_ports clk]

# 设置输入延迟
set_input_delay -clock clk 2.0 [get_ports data_in]

# 设置输出延迟
set_output_delay -clock clk 2.5 [get_ports data_out]

# 设置伪路径
set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b]

# 设置最大扇出
set_max_fanout 20 [current_design]

你想想看,如果period设成10ns,但你的设计实际只能跑到8ns,那综合出来的电路肯定时序违例。我建议你刚开始时,把period设得宽松一点,比如目标频率的1.2倍,先跑通流程再说。

避坑指南:我曾经因为SDC里漏写了set_clock_uncertainty,导致流片回来的芯片在高温下时序崩溃。记住,SDC里的每一行都有意义,别偷懒。

3.2.3 LEF/DEF:芯片的「物理蓝图」

LEF(Library Exchange Format)和DEF(Design Exchange Format),这两个文件是OpenROAD做物理设计的基础。

  • LEF:描述标准单元、宏单元的物理信息,比如尺寸、引脚位置、金属层等。你可以理解为每个零件的「规格书」。
  • DEF:描述整个芯片的布局信息,比如单元放在哪里、电源网络怎么走。相当于整个芯片的「施工图」。

OpenROAD自带了一些开源工艺库的LEF文件,比如Nangate 45nm、SkyWater 130nm。如果你用商业工艺,记得把LEF文件转成OpenROAD能读的格式。

文件类型 内容 来源 注意事项
Verilog 逻辑功能描述 设计团队 检查是否有未连接的端口
SDC 时序约束 设计团队 时钟定义必须准确
LEF 单元物理信息 工艺厂/PDK 注意版本兼容性
DEF 芯片布局信息 前一步输出 坐标不能超出芯片边界

3.3 一键式自动化运行:让工具自己干活

OpenROAD最吸引人的地方,就是它支持一键式自动化运行。你只需要写一个Tcl脚本,把流程串起来,然后敲一行命令,剩下的交给工具。

一个最简单的自动化脚本长这样:

# 读取设计文件
read_lef ./lib/Nangate45.lef
read_def ./results/floorplan.def
read_verilog ./results/synthesis.v
read_sdc ./constraints/top.sdc

# 布局
place_global
place_detail

# 时钟树综合
clock_tree_synthesis

# 布线
route_global
route_detail

# 输出GDSII
write_gds ./results/top.gds

然后你只需要在终端里敲:

openroad -gui run_flow.tcl

工具就会自动执行每一步。你想想看,以前用商业工具,光设置环境变量就得半天。现在一行命令搞定,是不是很爽?

我的经验:虽然是一键式运行,但我建议你每一步都检查一下中间结果。比如布局完看看congestion map,布线完看看有没有short。别等到最后GDSII出来了才发现问题,那时候改起来就麻烦了。

嗯,说到这里,我想起一个事。有一次我帮一个团队调试OpenROAD流程,他们的一键式脚本跑了一整天,结果最后GDSII是空的。排查了半天,发现是read_verilog的时候路径写错了,工具根本没读到网表。所以啊,自动化虽好,但别完全信任它。每一步都留个心眼,检查一下日志文件。

好了,这一章的内容就到这里。你只要记住:OpenROAD的流程是线性的,输入文件是Verilog、SDC、LEF/DEF,一键式运行靠的是Tcl脚本。下一章我们会深入每个步骤的细节,到时候再细聊。


可可精品资料库