逻辑综合工具DC

IC设计流程,市场-->制定spec-->RTL(同时进行sim,通过alint检查RTL有没有错误)-->systhesis(逻辑综合)-->PR(STA)-->Tape Out

  • 逻辑综合将RTL转换为Gate Netlist,这些Gate时没有物理概念的,只是一些逻辑,需要摆放到具体的位置。
  • 逻辑综合还需要满足timing,否则会出现亚稳态问题。
  • 逻辑正确,Timing没有问题,然后进行优化。

1 什么是逻辑综合?

将前端设计工程师编写的RTL,映射到特定的工艺库(Fab提供)上,通过添加约束,对RTL代码进行逻辑优化,形成门级网表。

  1. 约束
  • area--面积约束
  • timing--时序约束
  • .......
  1. 优化
  • 删除冗余的逻辑--简化逻辑--cell变少--delay减少--timing更好
  • 简化逻辑之后--面积也会减少
  • .......

2 逻辑综合在ASIC设计流程的阶段

Idea-->Function description-->RTL-->RTL simulation and verification-->Gate-Level Netlist-->Physical implementation-->Tape out-->Post-silicon verfication

  • Physical implementation -- 将门级逻辑转换为实际的物理电路--会使用到physical library

3 逻辑综合的转换过程

3.1 Translation

VHDL/Verilog/System verilog 通过 translation 转换为generic(GTECH) netlist,GTECH netlist 相当于一个中间过程的网表

  • 当DC将RTL代码读入之后,会自动地将代码Translate成GETCH网表。GTECH是synopsys自家开发的一种通用的,独立于工艺的标准库,里面有与门、非门、寄存器等各种基本单元。此时GTECH网表仍然保持和rtl代码的相同的层次结构。

3.2 Logic Optimization

3.3 Gate Mapping

GETCH netlist 被映射为 gate-level standard cells
Design Compiler需要的输入

  • RTL description
  • Timing constraints
  • 工艺库

4 DC工具的流程

  1. Load library and design
  2. Apply timing constraints and design rules constraints
  • design rules constraints(驱动能力的约束)
  1. Systhesis the design
  2. Analyze the rules
  • 是否满足timing
  1. Write out the design data

5 DC综合的方式

使用DC执行逻辑综合,一般有三种方式,通常使用dc_shell配合脚本执行命令,执行综合。

  1. Design Vision启动GUI
  2. dc_shell 启动命令行
  3. batch_mode,将综合使用命令写到syn.tcl脚本中,并记录log
dc_shell -f syn.tcl | tee -i sys.log

6 DC参数设置

6.1 search_path

在综合过程中,设置文件读取路径,让工具去进行搜索文件。设置地文件路径通常包含verilog、library和scripts。

set_app_var search_path "$search_path ./rtl ./scripts ./libs"

target library是指定工艺库的名称,其中的cell对应于设计人员想要让DC推断出并且映射到的库单元。
target_library--RTL需要mapping到target_library,将lib-->编译到db类型的库,放到target_library中进行综合
link library定义其库单元只用于参考的库名称,也就是说DC不是使用link library中的单元进行推断。
为了更好的了解target library和link library需要先弄明白DC中的设计层次

DC中的设计层次

  1. top层,包含很多小的module(或者实例化的IP)
  2. 小的module(不同的.v文件,会在加载设计时和top一起被read_verilog.v加载)
  3. macros(就比如买一个解码器的IP,ROM,RAM etc)
  4. 最小的门级单元,比如OR XOR之类。
  • target ibrary即目标工艺库,由Fab确定,用哪家的工艺生产芯片,就用他家的目标工艺库。门级单元,即最小的元件在此处找到,以组成门级电路。
  • link library是层次3需要的,即将.v(RTL)中例化的IP解释成门级单元的样子,然后再在target library中选取正确的元件组成门级网表。link library可以看成解释设计的功能,link library应该由IP的供应商进行提供,指定搜索路径,得到IP的解释文件resolve design references.
  • 在进行逻辑综合的时候在内存中进行寻找,因为已经将小module加载到内存中了。

link是介于translate和compile之间地一个小步骤,主要解决设计中所有地reference。设计的instances必须有相应的定义,instance就是上面的几个设计层次中的实例。DC针对不同设计层次的instance的获取:

  • 已经translate的GETEC网表可以从内存中获取
  • RTL中的例化了foundary提供的stdcell,从GETECH中获取。
  • macros(比如IP),将其转变为门级单元,从target library找到元件组成,也是有厂商提供的.db提供的。
  • system_library,指定的库包含了工艺库中的单元的图形slow.sdb
# 指定target_library--指定具体工艺库的路径
set_appr_var target_library 90nm_typical.db
# 设定 link_library
set_app_var link_library "* 90nm_typical.db" or
set_app_var link_library "* $target_library"

# link_library 列表
set_app_var link_library [list * ${target_library} macro_library macro_library2]
  • *表示从内存中获取,对应的是GETCH网表
  • ${target_library}对应std
  • macro_library对应macros
  • $--表示使用变量

6.3 read_verilog

通过read_verilog将design读入,将RTL转化为GETCH网表,设置一个design作为current design。一般需要进行设置current design,否则系统默认读入的最后一个作为current design。将current design设置在Top上,一般针对于top进行综合。

read_verilog "Top.v A.v B.v"

6.4 current_design

设置current_design,告诉DC针对哪一个对象进行综合。

current_design Top

6.5 source timing constrain

timing constrain也是一些命令,可以将这些命令写到脚本中进行执行。

  • Apply timing constrain on current design
  • Clock constrain:modeling clock trees

# clock period 
create_clock -period 2 [get_ports Clk]

# clock skew 
set_clock_uncertainty -setup 0.3 [get_clocks Clk]

# clock transition 
set_clock_transition -max 0.15 [get_clock Clk]

# clock latency
set_clock_latency -max 0.7 [get_clock Clk]
  • create_clock,做约束的时候或者是检查约束的时候,模型是组合逻辑--寄存器--组合逻辑,组合逻辑就会造成delay,在FF1上升沿,将D端数据抓到Q端,进行数据传输,在FF2上升沿将输入抓入。在FF2上升沿之前,需要保证数据稳定下来,保证抓取数据正确,如果数据不稳定,在FF2上升沿之前数据没有传递到,就会造成FF2抓取数据错误。所以需要满足一个setup time,定义一个时钟,在一个时钟之内,FF1 D端数据要传到FF2 D端,并且保持数据的稳定。
  • set_clock_uncertainty,约束margin skew,clock是有抖动的,要留有预量。在前端设计来所,任务Clk到FF1和到FF2的时间是一致的,在后端而言,是同过金属走线连接的,有些cell距离port比较近,有的cell离port比较远,可以通过在近端插入buffer,在远端金属走线上加RC延迟,保证FF1和FF2的timing一致。从clock的port到不同的register的时间会有偏差,叫做skew。
    在前端考虑timing的时候,对于可能存在的skew也需要考虑进来。后面比较容易满足。
  • set_clock_transition,理想的信号翻转是不需要时间的,但是实际的情况信号完成从0到1,或者从1到0进行跳变总是需要时间的。
  • set_clock_latency,从Clk到达D_in消耗的时间。如果一个design中只有一个Clk,可以将latency忽略掉,因为检查的时候检查FF1和FF2之间相对的时间就可以。当design有不同的Clk,clk1和clk2到达的时间不同,如果要检查一个clk驱动的register到另一个clk驱动的register的时候,不仅要考虑两个register之间的相对时间还要考虑clk到register的时间。(clk1->FF1与clk2->FF2)。clk决定了什么时间去lanch。

6.6 timing constrain(II)

03-逻辑综合工具 – Design Compiler-小白菜博客
对于My_design内部的约束,可以通过set_cloclk的方式进行约束。一个时钟周期之内,信号可以稳定传输,这是reg to reg path 的约束。
对于IO path来说,信号什么时候来是不知道的,可以假设信号经过前一个reg输出后,经过port进入第一级reg。所以从FF1到FF2总体的时间就是一个时钟周期,知道My_design外部的时间消耗,就知道了My_Design的第一级reg的时间。就可以选择合适的cell来代替组合My_design中第一级reg之前的组合逻辑。如何告诉组合逻辑外部消耗的时间,就通过set_input_delay进行设置,告诉DC工具,外部消耗了0.6,里面用时钟周期减掉外部消耗。

# Latest Data Arrival Time at Port A,after Jane's launching clock edge = 0.6ns
set_input_delay -max 0.6 -clock Clk [get_ports A]
  • get_ports A--指定从A port到前一级reg消耗的时间
    03-逻辑综合工具 – Design Compiler-小白菜博客
    对于正常来说,计算reg to reg,对于My_design的output port,也不是一个完整周期,假设外部还有一个register,知道外部的到下一个register的时间,就知道了当前My_design中reg到output port的时间。
# Latest Data Arrival Time at Port B,before Joe's capturing clock=0.8ns
set_input_delay -max 0.8 -clock Clk [get_ports B]
  • -clock Clk--指定哪一个clock
  • get_ports B --指定B port到下一级reg的消耗时间
  • delay和clock是有关系的,内部使用clock是Clk,外部使用的也是Clk,可以使用同一个时钟周期去减,如果用的不是一个clock,情况会复杂。

6.7 environment constrainu

03-逻辑综合工具 – Design Compiler-小白菜博客
除了input delay和output delay,Desgin中的每一个cell都会计算delay,比如在My_design中插入了一个buffer,这个buffer的delay是从library中查出的。在library中定义了各种各样的cell,每个cell都有一个delay table,delay table是一个二维的cha表,一个是load compatitence,另一个是input transition。
也就是说对于一个cell来说,它的delay取决于input transition和输出的负载,输出的负载越达,delay越大。对于FF2来说,它的input transition是由前一级传递过来的,对于它的output load是由后一级给它的。
对于My_design中第一级来说,前面一级时port,没有input transition,分析起来比较乐观,为了让条件更加严格,可以通过set_input_transition给它一个input transition。如果对于input transition不是很了解,也可以给一个driving cell。

set_input_transition 0.12 [get_ports A]

对于output来说,它的input transition是从前面一级一级传递过来的,最后传递到一个cell上,但是对于它来说,output load又是缺失的,通过set_load进行指定它后面的load是什么样的情况。

set_load [expr {30.0/1000}] [get_ports B]

6.8 compile/compile_ultra

compile=Logic Optimization + Gate Mapping

  1. Performs three level of optimization--三个层次的优化
  • Architectural level synthesis
    在design中有结构进行调整的,工具进行优化。
  • Logic level or GETCH optimization
    在纯逻辑和算法的层面进行优化。
  • Gate-level or mapping optimization
  1. Minimize area while meeting timing constraints
    compile执行的命令
compile
compile_ultra
  • To compile a design, use the compile command if you are using DC Expert,or the compile_ultra command if you are using DC Ultra or DC Graphical. Command options allow you to customize and control optimization.
  • compile_ultra的优化功能更多一些。在优化的时候优先满足timing和DRC,area优先级是最低的。

6.9 report_qor

通过report_qor报告结果
report quality of result(qor) for a synthesis summary

  1. 报告信息
  • levels of logic是逻辑级联数,相当于一个信号经由几个LUT串联而来,data path delay就是走线延时了,和逻辑规模、布局、扇出数有关。
    2.Timing
  • clock period
  • WNS:Worst negtive slack
  • TNS:total negtive slack
    3.cell count--cell数量
  • Leaf cell count
    03-逻辑综合工具 – Design Compiler-小白菜博客
    3.Area
  • Cell area

6.10 report_timing

report_timing
  • The report_timing invokes DC's Static Timing Analyzer
  • Break the design down into individual timing paths
  • Analyzes each timing path for max-delay timing
  • DC中是不会优化hold的,优化setup通过优化组合逻辑进行。setup来说是delay太大了,减小需要进行优化组合逻辑。对于hold来说,是delay太快了,需要进行延缓,可以插入buffer进行优化hold。
  1. header部分
  • startpoint--timing path开始;并说明startpoint是由哪个时钟进行capture和launch的
  • endpoint--timing path结束;并说明endpoint是由哪个时钟进行capture和launch的
  • path group--dc中path group根据capture clock进行分的,同一个capture clock的timing path分到同一个path group
  • path type--max 表示setup,min表示hold
  1. 对于这条path经过的所有cell
    reg1--->reg0
  • data arrival time
  • clock

6.11 output

write_sdc my_design.sdc

write -f ddc -hier -output my_ddc.ddc

write -f verilog -heir -outout my_design.gv