• Design Compiler工具学习笔记(5)



     


    目录

    引言

    知识储备

    代码风格

    DFT

    实际操作




    引言

    本篇继续学习 DC的基本使用。本篇主要学习 DC 工作机理和工作过程 以及简单介绍 DFT

    前文链接:

    Design Compiler工具学习笔记(1)

    Design Compiler工具学习笔记(2)

    Design Compiler工具学习笔记(3)

    Design Compiler工具学习笔记(4) 





    知识储备

    自底向上模式

    假设一个top设计文件包含 A,B,C 3个子模块,那么可以先将  A 模块设为顶层模块,并且添加对其的时序和面积约束,而后进行综合。综合完成后将该模块设置为 dont_touch ;

    然后将 B 模块设置为顶层,继续执行和 A 相同的操作流程,直到遍历所有模块。

    如果子模块之间还存在逻辑(glue logic),还需要对最终的顶层模块设置约束跑一遍综合。

    该模式费时费力。

     

     compile_ultra 是一个功能更强大的 compile 命令,可以将模块之间的层次化结构关系取消。有利于优化面积。但是这不太利于子模块后仿真时debug。此优化也可以通过下面的选项关闭。

     

     

     

     

     

     

     适当插入寄存器可以提高设计的速度。

     流水线结构综合步骤:

     多核优化:

    代码风格

    DFT

      


      




      

    实际操作

    此处仍以上篇文章的设计文件作为示例工程。主要是更新一下脚本内容:

    仅供参考~~~

    1. # |===========================================================
    2. # | Author : Xu Y. B.
    3. # | Date : 2022-11-21
    4. # | Description : tcl script for top design
    5. # |===========================================================
    6. # |===========================================================
    7. # |STEP 1: Read & elaborate the RTL design file list & check
    8. # |===========================================================
    9. set TOP_MODULE TOP
    10. analyze -format verilog [list TOP.v CAL_FUNC_MDL.v CAL_ABCD_TOP.v]
    11. elaborate $TOP_MODULE -architecture verilog
    12. current_design $TOP_MODULE
    13. if {[link] == 0} {
    14. echo "Your Link has errors !";
    15. exit;
    16. }
    17. if {[check_design] == 0} {
    18. echo "Your check design has errors !";
    19. exit;
    20. }
    21. # |===========================================================
    22. # |STEP 2: reset design
    23. # |===========================================================
    24. reset_design
    25. # |===========================================================
    26. # |STEP 3: Write unmapped ddc file
    27. # |===========================================================
    28. uniquify
    29. set uniquify_naming_style "%s_%d"
    30. write -f ddc -hierarchy -output ${UNMAPPED_PATH}/${TOP_MODULE}.ddc
    31. # |===========================================================
    32. # |STEP 4: define clocks
    33. # |===========================================================
    34. set CLK_NAME I_CLK_100M
    35. set CLK_PERIOD 10
    36. set CLK_SKEW [expr {$CLK_PERIOD*0.05}]
    37. set CLK_TRANS [expr {$CLK_PERIOD*0.01}]
    38. set CLK_SRC_LATENCY [expr {$CLK_PERIOD*0.1 }]
    39. set CLK_LATENCY [expr {$CLK_PERIOD*0.1 }]
    40. create_clock -period $CLK_PERIOD [get_ports $CLK_NAME]
    41. set_ideal_network [get_ports $CLK_NAME]
    42. set_dont_touch_network [get_ports $CLK_NAME]
    43. set_drive 0 [get_ports $CLK_NAME]
    44. set_clock_uncertainty -setup $CLK_SKEW [get_clocks $CLK_NAME]
    45. set_clock_transition -max $CLK_TRANS [get_clocks $CLK_NAME]
    46. set_clock_latency -source -max $CLK_SRC_LATENCY [get_clocks $CLK_NAME]
    47. set_clock_latency -max $CLK_LATENCY [get_clocks $CLK_NAME]
    48. # |===========================================================
    49. # |STEP 5: define reset
    50. # |===========================================================
    51. set RST_NAME I_RSTN
    52. set_ideal_network [get_ports $RST_NAME]
    53. set_dont_touch_network [get_ports $RST_NAME]
    54. set_drive 0 [get_ports $RST_NAME]
    55. # |===========================================================
    56. # |STEP 6: set input delay using timing budget
    57. # |Assume a weak cell to drive the input pins
    58. # |===========================================================
    59. set LIB_NAME typical
    60. set WIRE_LOAD_MODEL smic18_wl10
    61. set DRIVE_CELL INVX1
    62. set DRIVE_PIN Y
    63. set OPERATE_CONDITION typical
    64. set ALL_INPUT_EXCEPT_CLK [remove_from_collection [all_inputs] [get_ports "$CLK_NAME"]]
    65. set INPUT_DELAY [expr {$CLK_PERIOD*0.6}]
    66. set_input_delay $INPUT_DELAY -clock $CLK_NAME $ALL_INPUT_EXCEPT_CLK
    67. # set_input_delay -min 0 -clock $CLK_NAME $ALL_INPUT_EXCEPT_CLK
    68. set_driving_cell -lib_cell ${DRIVE_CELL} -pin ${DRIVE_PIN} $ALL_INPUT_EXCEPT_CLK
    69. # |===========================================================
    70. # |STEP 7: set output delay
    71. # |===========================================================
    72. set OUTPUT_DELAY [expr {$CLK_PERIOD*0.6}]
    73. set MAX_LOAD [expr {[load_of $LIB_NAME/INVX8/A] * 10}]
    74. set_output_delay $OUTPUT_DELAY -clock $CLK_NAME [all_outputs]
    75. set_load [expr {$MAX_LOAD * 3}] [all_outputs]
    76. set_isolate_ports -type buffer [all_outputs]
    77. # |===========================================================
    78. # |STEP 8: set max delay for comb logic
    79. # |===========================================================
    80. # set_input_delay [expr $CLK_PERIOD * 0.1] -clock $CLK_NAME -add_delay [get_ports I_1]
    81. # set_output_delay [expr $CLK_PERIOD * 0.1] -clock $CLK_NAME -add_delay [get_ports O_1]
    82. # |===========================================================
    83. # |STEP 9: set operating condition & wire load model
    84. # |===========================================================
    85. set_operating_conditions -max $OPERATE_CONDITION \
    86. -max_library $LIB_NAME
    87. set auto_wire_load_selection false
    88. set_wire_load_mode top
    89. set_wire_load_model -name $WIRE_LOAD_MODEL \
    90. -library $LIB_NAME
    91. # |===========================================================
    92. # |STEP 10: set area constraint (Let DC try its best)
    93. # |===========================================================
    94. set_max_area 10000
    95. # |===========================================================
    96. # |STEP 11: set DRC constraint
    97. # |===========================================================
    98. # set MAX_CAPACITANCE [expr {[load_of $LIB_NAME/NAND4X2/Y] * 5}]
    99. # set_max_capacitance $MAX_CAPACITANCE $ALL_INPUT_EXCEPT_CLK
    100. # |===========================================================
    101. # |STEP 12: set group path
    102. # |Avoid getting stack on one path
    103. # |===========================================================
    104. # group_path -name $CLK_NAME -weight 5 \
    105. # -critical_range [expr {$CLK_PERIOD * 0.1}]
    106. # group_path -name INPUTS -from [all_inputs] \
    107. # -critical_range [expr {$CLK_PERIOD * 0.1}]
    108. # group_path -name OUTPUTS -to [all_outputs] \
    109. # -critical_range [expr {$CLK_PERIOD * 0.1}]
    110. # group_path -name COMBS -from [all_inputs] \
    111. # -to [all_outputs] \
    112. # -critical_range [expr {$CLK_PERIOD * 0.1}]
    113. # report_path_group
    114. # |===========================================================
    115. # |STEP 13: Elimate the multiple-port inter-connect &
    116. # | define name style
    117. # |===========================================================
    118. # set_app_var verilogout_no_tri true
    119. # set_app_var verilogout_show_unconnected_pins true
    120. # set_app_var bus_naming_style {%s[%d]}
    121. # simplify_constants -boundary_optimization
    122. # set_boundary_optimization [current_design] true
    123. # set_fix_multiple_port_nets -all -buffer_constants
    124. # |===========================================================
    125. # |STEP 14: timing exception define
    126. # |===========================================================
    127. # set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]
    128. # set ALL_CLKS [all_clocks]
    129. # foreach_in_collection CUR_CLK $ALL_CLKS
    130. # {
    131. # set OTHER_CLKS [remove_from_collection [all_clocks] $CUR_CLK]
    132. # set_false_path -from $CUR_CLK $OTHER_CLKS
    133. # }
    134. # set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]
    135. # set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]
    136. # set_disable_timing TOP/U1 -from a -to y
    137. # set_case_analysis 0 [get_ports sel_i]
    138. # set_multicycle_path -setup 6 -from FFA/CP -through ADD/out -to FFB/D
    139. # set_multicycle_path -hold 5 -from FFA/CP -through ADD/out -to FFB/D
    140. # set_multicycle_path -setup 2 -to FFB/D
    141. # set_multicycle_path -hold 1 -to FFB/D
    142. # |===========================================================
    143. # |STEP 15: compile flow
    144. # |===========================================================
    145. # ungroup -flatten -all
    146. # 1st-pass compile
    147. # compile -map_effort high -area_effort high
    148. # compile -map_effort high -area_effort high -boundary_optimization
    149. compile -map_effort high -area_effort high -scan
    150. # simplify_constants -boundary_optimization
    151. # set_fix_multiple_port_nets -all -buffer_constants
    152. # compile -map_effort high -area_effort high -incremental_mapping -scan
    153. # 2nd-pass compile
    154. # compile -map_effort high -area_effort high -incremental_mapping -boundary_optimization
    155. # compile_ultra -incr
    156. # |===========================================================
    157. # |STEP 16: write post-process files
    158. # |===========================================================
    159. # change_names -rules verilog -hierarchy
    160. # remove-unconnected_ports [get_cells -hier *] -blast_buses
    161. # Write the mapped files
    162. write -f ddc -hierarchy -output $MAPPED_PATH/${TOP_MODULE}.ddc
    163. # write -f verilog -hierarchy -output $MAPPED_PATH/${TOP_MODULE}.v
    164. # write_sdc -version 1.7 $MAPPED_PATH/${TOP_MODULE}.sdc
    165. # write_sdf -version 2.1 $MAPPED_PATH/${TOP_MODULE}.sdf
    166. # |===========================================================
    167. # |STEP 17: generate report files
    168. # |===========================================================

    编译指令为:compile -map_effort high -area_effort high 

    用design version打开ddc文件:

     触发器:

     编译指令为:compile -map_effort high -area_effort high -scan

    触发器: 

     

  • 相关阅读:
    【python】拦截导弹
    Web Vitals:提升用户体验的关键指标
    驱动LCD12864显示器
    three.js纹理贴图褪色失真问题解决
    LeetCode - 1162 地图分析
    动作活体检测能力,构建安全可靠的支付级“刷脸”体验
    【毕业设计源码】基于JAVA的微信小程序直播在线教育平台
    C++的指针
    欧拉计划详解第504题:平方数个内部格点
    【MindSpore易点通】数据处理之Numpy数组的广播计算
  • 原文地址:https://blog.csdn.net/qq_43045275/article/details/127989363