DC学习随笔

Synthesis Transoformation

  1. 转换:首先将Verilog转换成Gtech网表
  2. 映射:Gtech网表映射到目标库的门级标准单元
  3. 优化:满足时序(建立时间,保持时间,最大最小延迟)和DRC的约束(max_fanout, max_capcitance, max_transition, max_leakage_power)

环境准备

  1. get_attr [get pin …] name
  2. 行内注释,: # (冒号井号)
  3. 换行的反斜杠 \ 后面不能又空格,不然会报错
  4. 重复执行上次的命令!!
  5. set可以设置任意的变量,但是set_app_var设置的变量需要是应用支持的(具体可以在dc的变量guide里面查到)
  6. “printvar”,可以查看dc的变量设置
  7. dc不会递归寻找search path的子目录
  8. cell里面有一个延迟时间的查找表:对应不同的input_transitoin,不同的output_load所对应的delay时间
  9. hierachical design与flat design的区别:flat会把层次打散,只有一个层次
  10. leaf cell: A unique instance of a library cell within a design is called a leaf cell.是指在最底层的cell,不是hierachy cell。

读入设计

  1. 可以在elaborate后面指定top模块的名字: elaborate top 这样就不用指定current_design和link。elaborate是唯一指定设计中指定参数的方法 -parameter
  2. 三种读入设计的方法read_file -format verilog, read_verilog -rtl, analyze + elaborate
  3. ddc文件(Synopsys internal database format)包含网表的信息,又有constraint和attribute的信息;甚至可以使用read_ddc {xxx.ddc}读入厂家提供的ip
  4. uniquify就可以把例化模块的模块名(不是实例名)都改成不一样的。这样在优化的时候,可以针对不同例化实例进行优化。DC学习随笔_第1张图片
  5. read命令会读入RTL文件,并且在DC李里面build “GTECH”,其实就是把RTL转换成Unmapped ddc格式。如果设计很大, 每次重新读入未编译的设计都需要很很长的时间。我们可以将其保存为ddc格式:wirite -format ddc -hier -output ./path/top.ddc

约束

  1. 通配符 *代表不匹配或多个字符的匹配,?只能匹配一个字符
  2. [ ]可以包含嵌入的命令
  3. get: get_ports, get_pins, get_libs
  4. all: all_inputs (input ports), all_outputs, all_clocks, all_registers, all design得到集合
  5. collection: sizeof-collection, foreach_in_collection, remove_from_collectionDC学习随笔_第2张图片
  6. set_attribute, get_attribute, list-attribute -application -class
  7. 时钟不确定性:set_clock_ uncertainty:- setup Tu [ge_clocks clk],pre_layout的uncertainty包含时钟倾斜, 时钟抖动和时钟margin
  8. clock的source delay和neteork delayDC学习随笔_第3张图片DC学习随笔_第4张图片
  9. 虚拟时钟:不连接到任何的端口,用作input delay, output delay 的参考(约束)):create_clock -name VCLK -period 2
  10. Time Budgetig: 给自己留时钟周期的0.4(对自己的约束需要悲观), input_dalay 设置为0.6倍的时钟周期DC学习随笔_第5张图片
  11. 对于组合逻辑输出的单元,可以替换为寄存器
  12. Timing constraints summaryDC学习随笔_第6张图片
  13. reset_design可以重置所有加载的约束
  14. set_load是为了计算输出逻辑的延迟信息(需要input_transition,output_laod来查找)
  15. 两种方法设置input_transition: set_input_transition, set_driving_cell -lib_cell. Normally, assume a weak cell drving the inputs.
  16. input_transition与load怎么设置,一般取驱动比较小,负载比较大的情况(悲观的)DC学习随笔_第7张图片
  17. 先set MAX_INPUT_LOAD [expr {[load_of …] * 10} ],再set_load [expr {[$MAX_INPUT_LOAD] * 3 } ]

优化

  1. 设置group_pth 可以优化每个group的关键路径,避免由于整个设计的关键路径降不下来而导致其他的路径也不能得到优化。还可以设置group_path 的权重(缺省值是1):TNS:total negative slack, WNS:worst negative slack. 设置权重时主要作用TNS这部分
    DC学习随笔_第8张图片
  2. Critica_range一般不超过是时钟周期的10%
  3. set_optimize_register true -design Pipeline.插入流水线
  4. 多核跑实验 set_host_options -max_cores 4
  5. report_constraint -all_violators可以读出所有的违规
  6. report_timing 可以查看详细的时序路径信息
  7. 每次compile之后查看report,再次进行针对性的compile DC学习随笔_第9张图片

check and report

  1. check_timing: 重复的多时钟,门控时钟可能对时钟造成的影响,一般加在添加约束之后。
  2. timing reportDC学习随笔_第10张图片DC学习随笔_第11张图片
  3. 查看最差的时序路径DC学习随笔_第12张图片
  4. 推荐查看时序信息的顺序report_constraint-> report_timing

DC_shell

  1. 使用history查看命令,使用!2再次执行第2条命令;使用!!执行上次的命令
  2. tab可以补全或者选择你部分忘记的命令

其他

  1. Generated Clocks: create_generated_clock -divided_by 2 -name CLK_SLM -source [get_ports CLK] [get_pins FF1/Q] .生成的时钟要重新制定时钟的约束
  2. 逻辑互斥时钟 set_clock_groups -logically_exclusivelyDC学习随笔_第13张图片
  3. 寄存器多时钟DC学习随笔_第14张图片
  4. 异步时钟问题:path不需要分析,单比特要用同步器,多比特要用异步FIFO.set_clock_groups -logically_exclusivelyDC学习随笔_第15张图片
  5. 时钟总结DC学习随笔_第16张图片

其他

  1. sdcDC学习随笔_第17张图片
  2. 避免网表中出现和assign语句:set_fix_multiple_ports_net -all -buffer_constants,还有三态门,set_app_var verilog_no_tri true
  3. change name: change_name -rules verilog -hire

你可能感兴趣的:(逻辑综合)