RTL 综合流程(RTL Synthesis Flow)
- 编写和验证 RTL 代码:编写 RTL 代码(如 Verilog 或 VHDL),并进行功能仿真,确保设计逻辑正确。
- 创建启动文件(Setup File):准备包含综合所需配置的启动文件,加载设计和技术数据。
- 创建约束文件(Constraints File):定义设计的约束条件(时序、面积、功耗等),以指导综合工具优化设计。
- 选择合适的综合流程:根据设计目标选择合适的综合编译策略(如以时序为主或以面积为主)。
- 加载设计和技术数据:导入 RTL 代码、库文件和技术文件,为综合工具提供必要的数据支持。
- 应用设计约束:应用设计约束,确保综合结果满足时序、面积和功耗目标。
- 执行设计综合:使用工具将 RTL 转换为门级网表,同时进行优化。
- 分析设计结果:生成综合后的报告(时序、面积、功耗),检查设计是否满足约束条件。
- 输出设计数据:保存综合结果,包括门级网表、时序报告等,为后续物理设计(布局布线)提供输入。
下面介绍最简单的综合流程,涉及到需要补充的流程或需要解释的名词将在后面补充部分做出讲解。
综合Step 1:Setup Commands and Variables
Setup 文件.synopsys_dc.setup
用于配置 DC的运行环境,包含路径设置、库信息和别名定义。
主要变量配置
-
search_path
:定义工具搜索文件的路径。确保 DC能找到设计文件和约束文件。set search_path "$search_path mapped rtl libs cons"
-
target_library
:指定目标库,用于映射综合结果到具体的标准单元。set target_library 22nm.db
-
link_library
:定义链接库,用于解析设计中引用的单元或模块。set link_library "* $target_library"
-
symbol_library
:定义符号库,用于逻辑符号与单元的映射。set symbol_library 22nm.sdb
附加设置
-
命令历史:设置保留的命令记录数量,便于追溯和复用。
history keep 50
-
命令别名:设置命令别名以简化操作。
alias h history alias rc "report_constraint -all_violators"
综合Step 2:Invoking DC and Reading a Verilog RTL File
在完成.synopsys_dc.setup
配置后,如何调用DC并加载一个 Verilog RTL 文件,主要包括图中几步:
假设CWD (Current Working Directory) 是运行 DC 的起始目录。该目录的结构为:
其中cons/
存放约束文件。rtl/
存放 Verilog HDL 文件。libs/
存放库文件。
-
进入工作目录:
cd risc_design
-
启动 DC :参数
topo
启用拓扑模式,用于综合时考虑布局信息。dc_shell -topo
-
使用
read_verilog
命令加载 RTL 文件:read_verilog rtl/my_design.v
-
read_verilog
的作用:- 加载默认 GTECH libraries和用户指定的link libraries
- 读取 RTL 文件并将其转化为unmapped ddc
- 加载 designs至 DC memory
- 将memory中的一个design设置为
current design
(current design
可以简单理解成哪个设计是顶层设计)
-
加载过程中可能会出现库文件读取警告,例如:
Warning: Can not read link_library file 'your_library.db'
这些警告通常可以通过正确设置库路径或修正 Setup 文件解决。
综合Step 3:Constraining and Compiling Unmapped RTL
在使用read_verilog
命令加载设计的RTL代码后,需要再进行以下几步:
- 加载约束文件:使用
source
命令加载约束文件(.con
文件),设置时序、面积等设计约束。约束文件包含时钟定义、输入输出延迟等关键参数,指导综合工具优化设计。 - 检查时序:使用
check_timing
命令检查当前设计的时序状态,确保设计的约束条件没有明显冲突,便于后续综合。 - 执行综合:使用
compile_ultra
命令执行RTL代码的综合,将其转换为门级网表(Gate-Level Netlist):
常见问题和解决方法
-
目标库错误:如果目标库未正确加载,会出现如下错误:
Error: Could not read the following target libraries: your_library.db
解决方法:检查并正确配置目标库路径,确保Setup文件中
target_library
变量正确指向工艺库文件。
综合Step 4:在退出前保存门级网表
注意set_app_var target_library libs/65nm_wc.db
要在compile_ultra
前面做,在后面做就没有意义了
在执行完以上各个步骤后,可以将生成的门级网表保存为 Verilog 格式,并指定输出路径:
write -format verilog -output mapped/MYREG_mapped.v
保存完成后使用命令exit
退出DC
综合Step 5:读取并分析网表 (Read and Analyze a Netlist)
-
进入工作目录并启动 DC
- 切换到工作目录:
cd risc_design
- 启动 Design Compiler 的拓扑模式:
dc_shell -topo
- 切换到工作目录:
-
读取门级网表
-
使用
read_verilog
命令加载综合后的门级网表:read_verilog mapped/MYREG_mapped.v
-
-
设置目标库
-
指定目标库文件,用于解析和分析设计中的单元:
set_app_var target_library libs/65n_wc.db
-
-
加载约束文件
-
使用
source
命令加载约束文件,定义时序、面积等设计目标:source cons/myreg.con
-
-
分析约束
-
使用
report_constraint -all_violators
命令生成约束分析报告:report_constraint -all_violators
-
报告中列出所有违反约束(如时序、面积限制)的模块或单元,便于设计者优化。
-
常见警告
-
库文件警告
-
如果
link_library
未正确配置,可能出现如下警告:Warning: Can not read link_library file 'your_library.db'.
-
-
单元解析警告
-
当设计中引用的逻辑单元(如 OR2_4X、NAND2_2X、DFF_4X)在目标库或链接库中找不到时,可能出现如下警告:
Warning: Unable to resolve reference 'OR2_4X' in 'my_design'.
-
这些警告表明库文件配置存在问题,但不会中止报告生成或综合过程。
-
补充 1:.lib
文件中单元示例
示例单元名称为 OR2_4X
,表示一个两输入 OR 门。area
表示单元占用的芯片面积,单位通常为平方微米。
引脚描述 (Pin Description):以输出引脚 y
为例,方向定义为输出引脚 (direction : 2
)。
时序信息:
-
相关引脚:
related_pin : "A";
表示该引脚的时序特性与输入引脚A
相关。 -
时序关系:
timing_sense : positive_unate
表示正相关(输入信号变化会导致输出信号以相同方向变化)。 -
延迟传播表:定义了不同负载条件下的上升传播延迟。
rise_propagation (drive_3_table_1) { values ("0.2616, 0.2711, 0.2831"); }
-
转换时间表:定义了输出信号从低到高转换的时间。这两个表是基于特定的 PVT 条件(如最慢或最差情况)进行表征的。
rise_transition (drive_3_table_2) { values ("0.0223, 0.0254, ..."); }
单元功能
-
逻辑功能:描述该单元的逻辑行为,这里表示 OR 门的功能。
function : "(A|B)";
电气特性
-
最大和最小电容:定义引脚能够驱动的最大和最小负载电容。用于设计规则检查 (DRC)**。**在优化过程中,逻辑和缓冲相关的设计规则(例如最大电容限制)优先于时序要求。
max_capacitance : 1.14810; min_capacitance : 0.0020;
补充 2:Target Library 的用途
Target Library用于综合过程中,将 RTL 转换为技术相关的门级网表。DC 会根据目标库中的单元信息选择符合设计规则(DRC)、时序和逻辑功能要求的最小单元。
默认情况下,目标库变量未设置或者是非实际存在的值。用户可以通过命令printvar target_library
查看目标库的当前值。
用户需要指定实际的目标库文件,目标库文件通常由供应商提供。设置目标库的命令为set_app_var target_library libs/65nm_wc.db
-
目标库通常表征特定的工艺(Process)、电压(Voltage)和温度(Temperature)条件,如最差情况(worst-case)或最快情况(best-case),以用于时序优化。此处的库文件
65nm_wc.db
通常是针对特定的 PVT 条件(如最差情况 "worst-case")表征的库。 -
set_app_var
只能用于设置DC自带的变量,如果不是DC自带的变量使用set_app_var
会报错,这个时候只能用set去设置。但使用set_app_var
设置变量可以避免拼写错误导致的问题,工具会立即提示错误,这比普通set
命令更安全。
补充 3:使用 link_library
解决引用问题
有时候购买的IP供应商只提供.db
或.ddc
格式文件,此时就可以通过link_library
来解决网表或 RTL 文件中实例化的引用问题。首先在 DC 内存中查找匹配的设计名称。然后在 link_library
中指定的技术库中查找匹配的单元(library_cell
)名称。
用户需要在综合前将默认的 link_library
替换为实际的技术库文件(由供应商提供)。
set_app_var link_library "* $target_library"
*
表示 DC memory
如果 link_library
未正确配置,工具可能会因无法解析引用的单元而报错或生成警告。link_library
不直接参与综合,而是确保所有引用的单元都能正确解析,保证设计完整性。
补充 4:使用 search_path
变量
使用search_path
变量可以避免在命令中反复输入完整路径。例如,可以直接使用文件名而无需指定完整路径(如 mapped/MYREG_mapped.v
或 cons/myreg.con
)。
read_verilog MYREG_mapped.v
source myreg.con
在默认情况下,包含DC 安装目录下的标准库路径(例如 gtech.db
)和用于仿真和综合的设计库路径。这里"."
表示当前工作目录(CWD),即运行 DC 的目录。工具会先在 CWD 中搜索设计文件,如果找不到,再依次搜索 search_path
中的目录。
search_path = ".<Install_dir>/libraries/syn
<Install_dir>/dw/sim_ver
<Install_dir>/dw/syn_ver"
用户可以通过命令将自定义目录添加到 search_path
中,例如使用以下指令追加了 libs
和 cons
目录,便于工具自动定位库文件和约束文件。
set_app_var search_path "$search_path libs cons"
注意
- 变量需提前设置:在运行
read
或link
命令之前,必须正确设置search_path
,确保 DC 能找到所需文件。 - 可用 Setup 文件配置:为了简化每次运行的配置过程,可以将路径设置写入
.synopsys_dc.setup
文件,避免每次手动设置。
补充 5:.synopsys_dc.setup
文件及其位置
配置文件统一命名为.synopsys_dc.setup
,用于初始化 DC 的运行环境,例如设置库路径、搜索路径和别名。DC 启动时会自动按照以下顺序加载配置文件:
- 系统默认配置:
- 路径:
$SYNOPSYS/admin/setup
- 通常为全局默认配置,由管理员设置,适用于所有用户。
- 路径:
- 用户通用配置:
- 路径:
~user
- 用户主目录下的
.synopsys_dc.setup
文件,供特定用户全局使用。
- 路径:
- 当前工作目录(CWD)配置:
- 路径:当前运行 DC 的目录。
- 此文件覆盖前两个位置的设置,适用于当前设计的特定需求。
一般不动前两个,自己随意配置第三个。如果多个位置有 .synopsys_dc.setup
文件,后者会覆盖前者的设置。
CWD配置举例:
这里symbol_library
之前没有提到过,它用于将 RTL 或门级网表中的逻辑单元(如 OR、AND、FF 等)显示为标准的符号。在逻辑综合完成后,可以通过DV GUI 查看设计的门级网表。它并不直接参与综合或时序分析,仅用于提高设计可读性。说白了它是图形界面显示用的。
补充 6:读取层次化的 RTL 设计
在read RTL时,可以逐个文件加载,每次加载一个文件,最后一个加载的文件默认为current design
。
read_verilog TOP.v
read_verilog A.v
read_verilog B.v
也可以批量文件加载,使用大括号 {}
指定多个文件,同时加载多个文件。第一个文件(TOP.v
)的模块将被设置为current design
。
read_verilog {TOP.v A.v B.v}
如果单个文件,包含多个模块,则文件中的第一个模块将被设置为current design。
read_verilog TOP_hier.v
这些内容了解即可,大多数时候是自己指定哪个设计是current design
,防止记错出现问题。
补充 7:使用 check_design
命令验证设计
check_design
会检查当前设计中的连接性和层次问题。常见检查内容包括:
- 缺失端口或未连接的输入引脚。
- 递归层次结构,即设计中存在循环引用。
- 多重实例化,即重复定义模块实例。
- 输出结果:如果检测到问题,会发出 警告 或 错误。如果没有问题,显示信息为 “NO issues found”。出现任何错误时,命令返回值为
0
。
举例:
read_verilog {A.v B.v TOP.v}
current_design MY_TOP
link
check_design
source TOP.con
- 读取设计:使用
read_verilog
命令加载 RTL 文件。 - 指定当前设计:使用
current_design
命令设置顶层模块。 - 链接设计:执行
link
命令解析所有模块的引用。 - 验证设计:使用
check_design
检查设计的完整性。 - 加载约束:如果设计无问题,加载约束文件进行进一步操作。
注意,check_design
必须在 link
之后运行:link
命令解析了所有引用的模块后,设计才处于完整状态,可以进行验证。
补充 9:使用 analyze
和 elaborate
读取设计
通过 analyze
和 elaborate
命令也可以读取和展开设计文件,与传统的 read_verilog
和 link
流程相比,这种方法更加简化和高效。
analyze
命令用于对指定的 Verilog 源文件进行语法检查和编译,将其转换为 DC内部的中间表示(PVL)。命令格式为analyze -format verilog {A.v TOP.v}
。这里指定了文件列表 {A.v TOP.v}
和文件格式 verilog
。编译文件后,DC 会将文件内容存储在设计数据库中。
elaborate
命令用于展开设计的顶层模块,解析所有模块实例化的层次结构,建立完整的设计模型。命令格式为elaborate MY_TOP
。这里指定顶层模块 MY_TOP
作为当前设计。current design
被设置为 MY_TOP
,无需手动设置 current_design
或运行 link
。
补充 10:使用 elaborate
修改parameter
在 Verilog 中,模块通常定义一些可配置的参数(parameters),例如总线宽度、延迟值等。默认情况下,设计中使用的是 RTL 代码中定义的默认参数值。如果需要在综合阶段修改这些参数值,就需要借助 elaborate
命令。
假设模块 MY_TOP
包含两个参数,这些参数用于定义输入信号的宽度,以及实例化其他子模块(MY_A
和 MY_B
)。
parameter A_WIDTH = 2;
parameter B_WIDTH = 4;
使用 elaborate
命令指定新参数值,将 A_WIDTH
修改为 9,B_WIDTH
修改为 16。修改后的参数值会覆盖 RTL 中的默认值。
elaborate MY_TOP -parameters "A_WIDTH=9, B_WIDTH=16"
补充 11:综合前保存未映射的 DDC 文件
DDC 文件(Design Compiler Design Constraints file)是 Design Compiler 内部存储的设计文件格式,包含设计的逻辑结构、层次信息和约束。未映射 DDC 文件是指未映射到具体工艺库单元的设计,仅包含 GTECH 逻辑单元。保存未映射的设计,后续可以不需要重新从 RTL 开始分析和展开设计,使用 read_ddc
命令加载设计比重新从 RTL 读取和展开设计快得多。不需要重复执行 read_verilog
、link
和其他步骤。注意,当RTL修改后就要重新读取RTL和展开设计,不能再用之前保存的ddc文件了。
format ddc
:指定保存为 DDC 格式。hier
:保存设计的层次结构。output unmpad/MY_TOP.ddc
:指定输出文件路径和名称。
补充 12:综合后保存 DDC 文件
保存综合后的 DDC 文件,可以直接用于物理实现流程。可直接导入到 ICC 进行物理设计。
-
重命名节点确保所有名称符合 Verilog 命名规则,便于生成网表。
change_names -rule verilog -hier
-
保存映射后的设计
保存综合后的网表:
write -format verilog -hier -output mapd/MY_TOP_net.v
保存综合后的 DDC 文件:
write -format ddc -hier -output mapd/MY_TOP.ddc