DC(Design Compiler)综合入门(2)

RTL 综合流程(RTL Synthesis Flow)

  1. 编写和验证 RTL 代码:编写 RTL 代码(如 Verilog 或 VHDL),并进行功能仿真,确保设计逻辑正确。
  2. 创建启动文件(Setup File):准备包含综合所需配置的启动文件,加载设计和技术数据。
  3. 创建约束文件(Constraints File):定义设计的约束条件(时序、面积、功耗等),以指导综合工具优化设计。
  4. 选择合适的综合流程:根据设计目标选择合适的综合编译策略(如以时序为主或以面积为主)。
  5. 加载设计和技术数据:导入 RTL 代码、库文件和技术文件,为综合工具提供必要的数据支持。
  6. 应用设计约束:应用设计约束,确保综合结果满足时序、面积和功耗目标。
  7. 执行设计综合:使用工具将 RTL 转换为门级网表,同时进行优化。
  8. 分析设计结果:生成综合后的报告(时序、面积、功耗),检查设计是否满足约束条件。
  9. 输出设计数据:保存综合结果,包括门级网表、时序报告等,为后续物理设计(布局布线)提供输入。

下面介绍最简单的综合流程,涉及到需要补充的流程或需要解释的名词将在后面补充部分做出讲解。

综合Step 1:Setup Commands and Variables

Setup 文件.synopsys_dc.setup用于配置 DC的运行环境,包含路径设置、库信息和别名定义。

主要变量配置

  1. search_path:定义工具搜索文件的路径。确保 DC能找到设计文件和约束文件。

    set search_path "$search_path mapped rtl libs cons"
    
  2. target_library:指定目标库,用于映射综合结果到具体的标准单元。

    set target_library 22nm.db
    
  3. link_library:定义链接库,用于解析设计中引用的单元或模块。

    set link_library "* $target_library"
    
  4. symbol_library:定义符号库,用于逻辑符号与单元的映射。

    set symbol_library 22nm.sdb
    

附加设置

  1. 命令历史:设置保留的命令记录数量,便于追溯和复用。

    history keep 50
    
  2. 命令别名:设置命令别名以简化操作。

    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 的作用

    1. 加载默认 GTECH libraries和用户指定的link libraries
    2. 读取 RTL 文件并将其转化为unmapped ddc
    3. 加载 designs至 DC memory
    4. 将memory中的一个design设置为current designcurrent design可以简单理解成哪个设计是顶层设计)
  • 加载过程中可能会出现库文件读取警告,例如:

    Warning: Can not read link_library file 'your_library.db'
    

    这些警告通常可以通过正确设置库路径或修正 Setup 文件解决。

综合Step 3:Constraining and Compiling Unmapped RTL

在使用read_verilog命令加载设计的RTL代码后,需要再进行以下几步:

  1. 加载约束文件:使用source命令加载约束文件(.con文件),设置时序、面积等设计约束。约束文件包含时钟定义、输入输出延迟等关键参数,指导综合工具优化设计。
  2. 检查时序:使用check_timing命令检查当前设计的时序状态,确保设计的约束条件没有明显冲突,便于后续综合。
  3. 执行综合:使用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)

  1. 进入工作目录并启动 DC

    • 切换到工作目录:cd risc_design
    • 启动 Design Compiler 的拓扑模式:dc_shell -topo
  2. 读取门级网表

    • 使用 read_verilog 命令加载综合后的门级网表:

      read_verilog mapped/MYREG_mapped.v
      
  3. 设置目标库

    • 指定目标库文件,用于解析和分析设计中的单元:

      set_app_var target_library libs/65n_wc.db
      
  4. 加载约束文件

    • 使用 source 命令加载约束文件,定义时序、面积等设计目标:

      source cons/myreg.con
      
  5. 分析约束

    • 使用 report_constraint -all_violators 命令生成约束分析报告:

      report_constraint -all_violators
      
    • 报告中列出所有违反约束(如时序、面积限制)的模块或单元,便于设计者优化。

常见警告

  1. 库文件警告

    • 如果 link_library 未正确配置,可能出现如下警告:

      Warning: Can not read link_library file 'your_library.db'.
      
  2. 单元解析警告

    • 当设计中引用的逻辑单元(如 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.vcons/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 中,例如使用以下指令追加了 libscons 目录,便于工具自动定位库文件和约束文件。

set_app_var search_path "$search_path libs cons"

注意

  • 变量需提前设置:在运行 readlink 命令之前,必须正确设置 search_path,确保 DC 能找到所需文件。
  • 可用 Setup 文件配置:为了简化每次运行的配置过程,可以将路径设置写入 .synopsys_dc.setup 文件,避免每次手动设置。

补充 5:.synopsys_dc.setup 文件及其位置

配置文件统一命名为.synopsys_dc.setup,用于初始化 DC 的运行环境,例如设置库路径、搜索路径和别名。DC 启动时会自动按照以下顺序加载配置文件:

  1. 系统默认配置
    • 路径:$SYNOPSYS/admin/setup
    • 通常为全局默认配置,由管理员设置,适用于所有用户。
  2. 用户通用配置
    • 路径:~user
    • 用户主目录下的 .synopsys_dc.setup 文件,供特定用户全局使用。
  3. 当前工作目录(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:使用 analyzeelaborate 读取设计

通过 analyzeelaborate 命令也可以读取和展开设计文件,与传统的 read_veriloglink 流程相比,这种方法更加简化和高效。

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_AMY_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_veriloglink 和其他步骤。注意,当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
    

### 将RTL代码编译成库文件 为了将RTL(寄存器传输级)代码编译成库文件,通常涉及几个关键步骤。这些步骤依赖于具体的工具链和目标平台。对于Verilog或VHDL等硬件描述语言的RTL代码,在将其转换为库文件之前,需要先通过综合工具将其转化为网表格式。 在芯片设计流程中,创建库文件的过程可以分为以下几个方面: #### 综合阶段 使用综合工具如Synopsys Design Compiler或其他第三方工具来处理RTL代码。这一步骤会读取RTL源文件并生成对应的门级网表。此过程可能还需要提供约束条件文件以指导优化方向[^2]。 ```verilog // 示例:简单的 RTL 代码片段 module simple_adder ( input wire [7:0] a, input wire [7:0] b, output reg [8:0] sum ); always @(a,b) begin sum = a + b; end endmodule ``` #### 创建库定义 根据具体需求选择合适的库标准,比如 liberty 文件用于描述单元特性。如果是要生成供仿真使用的模型,则可能会涉及到SystemVerilog接口类别的建模;而如果是物理实现所需的库,则更关注延迟、功耗等参数。 #### 编写Makefile自动化脚本 针对特定EDA工具设置相应的命令选项,并利用make工具简化重复性的任务执行。下面是一个基于`vcs`编译环境的例子,展示了如何配置一个简易版本的Makefile来进行RTL到网表乃至最终库形式的转化工作。 ```makefile # Makefile example for compiling RTL code into library files using VCS TOP_MODULE := top_module_name SRC_FILES := $(wildcard *.sv) LIB_NAME := mylib all: compile libgen compile: vlogan +acc -sverilog ${SRC_FILES} -top ${TOP_MODULE} libgen: # Assuming the tool supports generating libraries from compiled design dccompile -work ./work -library ${LIB_NAME} ``` 需要注意的是,在实际操作过程中,不同厂商提供的工具集会有差异化的指令语法以及功能特性,上述例子仅作为概念性说明。此外,关于模块间的信号连接应当遵循严格的规则,例如确保所有的输入输出端口都正确地关联到了结构化网络表达式上,避免出现类似“output 或者inout 端口必须被链接至结构性net 表达”的错误提示[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值