目录

引言

背景知识

多时钟设计

DC 输出文件分析

实际操作

设计源码

综合脚本

综合网表

SDF文件

SDC文件

REPORT文件







引言

本篇继续学习 DC的基本使用。本篇主要学习 DC 综合之后的效果分析,多同步时钟设计以及 DC 综合完成之后的各种输出文件。

前文链接:

Design Compiler工具学习笔记(1)

Design Compiler工具学习笔记(2)

Design Compiler工具学习笔记(3)

Design Compiler工具学习笔记(4)

Design Compiler工具学习笔记(5)

Design Compiler工具学习笔记(6)



背景知识

多时钟设计

多周期约束时,对应的设计代码也需要修改。比如使能信号、数据有效信号需要延迟相应的时间。

DC 输出文件分析





实际操作

设计源码

简单的设计文件:做一个9级延迟的寄存器链。源代码:


module MY_DESIGN
(input I_CLK_100M,input I_RSTN_100M,input I_DATA,input I_VAL,output O_DATA);reg [9:0] R_I_DATA;
genvar GV_I;
generatefor(GV_I = 0;GV_I < 10;GV_I = GV_I + 1)beginalways @ (posedge I_CLK_100M)beginif(~I_RSTN_100M)beginR_I_DATA[GV_I] <= 0;endelse if(GV_I == 0)beginR_I_DATA[GV_I] <= I_DATA & I_VAL;endelsebeginR_I_DATA[GV_I] <= R_I_DATA[GV_I-1];endendend
endgenerateassign O_DATA = R_I_DATA[9];endmodule

综合脚本

# |===========================================================
# | Author      : Xu Y. B.
# | Date        : 2022-11-21
# | Description : tcl script for top design
# |===========================================================# |===========================================================
# |STEP 1: Read & elaborate the RTL design file list & check
# |===========================================================
set TOP_MODULE MY_DESIGN
analyze        -format verilog [list MY_DESIGN.v]
elaborate      $TOP_MODULE     -architecture verilog
current_design $TOP_MODULEif {[link] == 0} {echo "Your Link has errors !";exit;
}if {[check_design] == 0} {echo "Your check design has errors !";exit;
}# |===========================================================
# |STEP 2: reset design
# |===========================================================
reset_design# |===========================================================
# |STEP 3: Write unmapped ddc file
# |===========================================================
uniquify
set uniquify_naming_style "%s_%d"
write -f ddc -hierarchy -output ${UNMAPPED_PATH}/${TOP_MODULE}.ddc# |===========================================================
# |STEP 4: define clocks
# |===========================================================
# -------------------------- CLK 100MHz ----------------------
set       CLK_NAME              I_CLK_100M
set       CLK_PERIOD            10
set       CLK_SKEW              [expr {$CLK_PERIOD*0.05}]
set       CLK_TRANS             [expr {$CLK_PERIOD*0.01}]
set       CLK_SRC_LATENCY       [expr {$CLK_PERIOD*0.1 }]
set       CLK_LATENCY           [expr {$CLK_PERIOD*0.1 }]                       create_clock            -period     $CLK_PERIOD       [get_ports $CLK_NAME]
set_ideal_network                                     [get_ports $CLK_NAME]
set_dont_touch_network                                [get_ports $CLK_NAME]
set_drive               0                             [get_ports $CLK_NAME]set_clock_uncertainty   -setup       $CLK_SKEW        [get_clocks $CLK_NAME]
set_clock_transition    -max         $CLK_TRANS       [get_clocks $CLK_NAME]
set_clock_latency       -source -max $CLK_SRC_LATENCY [get_clocks $CLK_NAME]
set_clock_latency       -max         $CLK_LATENCY     [get_clocks $CLK_NAME]# --------------------------- CLK 50MHz ----------------------
# set       CLK_NAME_2              I_CLK_50M
# set       CLK_PERIOD_2            20
# set       CLK_SKEW_2          [expr {$CLK_PERIOD_2*0.05}]
# set       CLK_TRANS_2             [expr {$CLK_PERIOD_2*0.01}]
# set       CLK_SRC_LATENCY_2       [expr {$CLK_PERIOD_2*0.1 }]
# set       CLK_LATENCY_2           [expr {$CLK_PERIOD_2*0.1 }]                     # create_clock          -period     $CLK_PERIOD_2     [get_ports $CLK_NAME_2]
# set_ideal_network                                       [get_ports $CLK_NAME_2]
# set_dont_touch_network                                  [get_ports $CLK_NAME_2]
# set_drive                 0                             [get_ports $CLK_NAME_2]# set_clock_uncertainty   -setup       $CLK_SKEW_2        [get_clocks $CLK_NAME_2]
# set_clock_transition    -max         $CLK_TRANS_2       [get_clocks $CLK_NAME_2]
# set_clock_latency       -source -max $CLK_SRC_LATENCY_2 [get_clocks $CLK_NAME_2]
# set_clock_latency       -max         $CLK_LATENCY_2     [get_clocks $CLK_NAME_2]# |===========================================================
# |STEP 5: define reset
# |===========================================================
# ------------------------- RST 1 ----------------------------
set RST_NAME                    I_RSTN_100M
set_ideal_network               [get_ports $RST_NAME]
set_dont_touch_network          [get_ports $RST_NAME]
set_drive             0         [get_ports $RST_NAME]# # ------------------------- RST 2 ----------------------------
# set RST_NAME_2                    I_RSTN_50M
# set_ideal_network                 [get_ports $RST_NAME_2]
# set_dont_touch_network          [get_ports $RST_NAME_2]
# set_drive             0         [get_ports $RST_NAME_2]# |===========================================================
# |STEP 6: set input delay using timing budget
# |Assume a weak cell to drive the input pins
# |===========================================================
set         LIB_NAME            typical
set         WIRE_LOAD_MODEL     smic18_wl10set      DRIVE_PIN           Y
set         OPERATE_CONDITION   typicalset      ALL_INPUT_EXCEPT_CLK [remove_from_collection [all_inputs] [get_ports "$CLK_NAME"]]
set         INPUT_DELAY          [expr {$CLK_PERIOD*0.6}]set_input_delay  $INPUT_DELAY -clock         $CLK_NAME         $ALL_INPUT_EXCEPT_CLK
set_driving_cell -lib_cell    ${DRIVE_CELL}  -pin ${DRIVE_PIN} $ALL_INPUT_EXCEPT_CLK# |===========================================================
# |STEP 7: set output delay
# |===========================================================
set OUTPUT_DELAY  [expr {$CLK_PERIOD*0.6}]
set MAX_LOAD      [expr {[load_of $LIB_NAME/INVX4/A] * 10}]set_output_delay  $OUTPUT_DELAY -clock $CLK_NAME      [all_outputs]
set_load          [expr {$MAX_LOAD * 3}]             [all_outputs]
set_isolate_ports -type buffer                       [all_outputs]# |===========================================================
# |STEP 8: set max delay for comb logic
# |===========================================================
# set_input_delay  [expr $CLK_PERIOD * 0.1] -clock $CLK_NAME -add_delay [get_ports I_1]
# set_output_delay [expr $CLK_PERIOD * 0.1] -clock $CLK_NAME -add_delay [get_ports O_1]# |===========================================================
# |STEP 9: set operating condition & wire load model
# |===========================================================
set_operating_conditions -max           $OPERATE_CONDITION \-max_library    $LIB_NAMEset                     auto_wire_load_selection false
set_wire_load_mode       top
set_wire_load_model      -name    $WIRE_LOAD_MODEL \-library $LIB_NAME# |===========================================================
# |STEP 10: set area constraint (Let DC try its best)
# |===========================================================
set_max_area             1000# |===========================================================
# |STEP 11: set DRC constraint
# |===========================================================
# set MAX_CAPACITANCE [expr {[load_of $LIB_NAME/NAND4X2/Y] * 5}]
# set_max_capacitance $MAX_CAPACITANCE $ALL_INPUT_EXCEPT_CLK# |===========================================================
# |STEP 12: set group path
# |Avoid getting stack on one path
# |===========================================================
group_path -name $CLK_NAME -weight 5                \-critical_range  [expr {$CLK_PERIOD * 0.1}] group_path -name INPUTS    -from [all_inputs]      \-critical_range  [expr {$CLK_PERIOD * 0.1}] group_path -name OUTPUTS   -to [all_outputs]       \-critical_range  [expr {$CLK_PERIOD * 0.1}] group_path -name COMBS     -from [all_inputs]      \-to [all_outputs]      \-critical_range  [expr {$CLK_PERIOD * 0.1}]
report_path_group# |===========================================================
# |STEP 13: Elimate the multiple-port inter-connect &
# |         define name style
# |===========================================================
# set_app_var                       verilogout_no_tri                   true
# set_app_var                       verilogout_show_unconnected_pins    true
# set_app_var                       bus_naming_style                    {%s[%d]}
# simplify_constants                -boundary_optimization
# set_boundary_optimization         [current_design]                    true
# set_fix_multiple_port_nets        -all                                -buffer_constants# |===========================================================
# |STEP 14: timing exception define
# |===========================================================
# set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]
# set ALL_CLKS [all_clocks]
# foreach_in_collection CUR_CLK $ALL_CLKS
# {
#   set OTHER_CLKS [remove_from_collection [all_clocks] $CUR_CLK]
#   set_false_path -from $CUR_CLK $OTHER_CLKS
# }# set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]
# set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]# set_disable_timing TOP/U1 -from a -to y
# set_case_analysis 0 [get_ports sel_i]# set_multicycle_path -setup 6 -from FFA/CP -through ADD/out -to FFB/D
# set_multicycle_path -hold 5 -from FFA/CP -through ADD/out -to FFB/D
# set_multicycle_path -setup 2 -to FFB/D
# set_multicycle_path -hold 1 -to FFB/D# |===========================================================
# |STEP 15: compile flow
# |===========================================================
# ungroup -flatten -all# 1st-pass compile
# compile -map_effort high -area_effort high
# compile -map_effort high -area_effort high -boundary_optimization
compile -map_effort high  -area_effort high# simplify_constants -boundary_optimization
# set_fix_multiple_port_nets -all -buffer_constants# compile -map_effort high -area_effort high -incremental_mapping -scan# 2nd-pass compile
# compile -map_effort high -area_effort high -incremental_mapping -boundary_optimization
# compile_ultra -incr# |===========================================================
# |STEP 16: write post-process files
# |===========================================================
change_names -rules verilog -hierarchy
remove-unconnected_ports [get_cells -hier *] -blast_buses
# Write the mapped files
write -f ddc -output $MAPPED_PATH/${TOP_MODULE}.ddc
write   -f verilog  -hierarchy -output  $MAPPED_PATH/${TOP_MODULE}.v
write_sdc -version  1.7                 $MAPPED_PATH/${TOP_MODULE}.sdc
write_sdf -version  2.1                 $MAPPED_PATH/${TOP_MODULE}.sdf# |===========================================================
# |STEP 17: generate report files
# |===========================================================
# Get report file
redirect   -tee     -file     ${REPORT_PATH}/check_design.txt           {check_design}
redirect   -tee     -file     ${REPORT_PATH}/check_timing.txt           {check_timing}
redirect   -tee     -file     ${REPORT_PATH}/report_constraint.txt      {report_constraint -all_violators}
redirect   -tee     -file     ${REPORT_PATH}/check_setup.txt            {report_timing -delay_type max}
redirect   -tee     -file     ${REPORT_PATH}/check_hold.txt             {report_timing -delay_type min}
redirect   -tee     -file     ${REPORT_PATH}/report_area.txt            {report_area}

综合网表

打开映射后的 .v 文件:

编译时可以加上 -scan 选项,观察寄存器映射的差别:

SDF文件

里面包含了单元的延迟信息。

SDC文件

里面包含了该设计的所有约束

REPORT文件

可以分别打开进行分析,包括时间、面积等。此处就不一一展开。



至此 DC 的视频学习告一段落,了解了基本的使用技巧。但是功夫还需要磨练,多结合工程进行实践是必不可缺的环节。继续加油~~

Design Compiler工具学习笔记(7)相关推荐

  1. Design Compiler工具学习笔记(5)

    目录 引言 知识储备 代码风格 DFT 实际操作 引言 本篇继续学习 DC的基本使用.本篇主要学习 DC 工作机理和工作过程 以及简单介绍 DFT. 前文链接: Design Compiler工具学习 ...

  2. Design Compiler工具学习笔记(6)

    目录 引言 知识储备 实际操作 设计源码 仿真源码 VCS执行仿真 DC 综合 TCL编程练习 引言 本篇继续学习 DC的基本使用.本篇主要学习 DC 综合之后的效果分析,重点在时序分析. 前文链接: ...

  3. Postman接口测试工具学习笔记(二)Postman进阶实践:获取天气预报实例

    Postman接口测试工具学习笔记(一) 入门及基本概念 https://blog.csdn.net/sevensolo/article/details/87208546 Postman进阶实践:获取 ...

  4. Postman接口测试工具学习笔记(一)接口测试概念及Postman入门

    (下文照搬@Storm啊老师博文,留下记录为了方便学习和理解.大家可以去看看原文地址:https://blog.csdn.net/duzilonglove/article/details/786454 ...

  5. locust工具学习笔记(三)-Tasks属性、tag修饰符、TaskSet类

    locust工具学习笔记(三) 虚拟用户数分配和权重的关系 1.一个场景文件中如果定义多个用户类,用来对不同用户行为进行压测时,可以用weight属性来控制用户行为执行权重 2.当用户权重不足1人时, ...

  6. VCS工具学习笔记(4)

    目录 引言 VCD文件及生成 实际操作 makefile 编译仿真 打开波形文件 其他 1.$vcdpluson() 参数更改 2. $vcdplusmemon() 3.__FILE__  , __L ...

  7. VCS工具学习笔记(3)

    目录 引言 技术文档 DVE介绍 实践 使用技巧总结 调用光标 局部区域放大 全局查看 进制切换 信号分组 数据查找 信号比较 单步调试 设置总线 PLI/DPI 引言 按照视频的讲解进度,继续学习 ...

  8. GDB调式工具学习笔记---断点

    GDB调式工具学习笔记---断点 2.断点 2.1 示例代码 2.2 常用命令 2.2.1 display和undisplay 2.2.2 break(b) 2.2.3 continue(c) 2.2 ...

  9. Reliable Cloud Infrastructure: Design and Process学习笔记

    最后更新2022/03/16 忘记更新对应的学习笔记,补上.这一科有9节,加上0章简介 简介 google cloud的好多功能有点相似,这科内容是介绍应该选什么产品,怎么选择,怎么规划,怎么设计等等 ...

最新文章

  1. AICompiler动态shape编译框架
  2. html动画怎么隐藏,JQuery操作div隐藏和显示的4种动画
  3. 非递归分治法排序 MergeSort without recursion
  4. RabbitMQ实现中AMQP与MQTT消息收发异同
  5. linux环境 下载Neo4j
  6. 将VS2010的工程转换为VS2005,即用VS2005打开
  7. python 除法符号_python的除法运算符是什么
  8. PHP2018人资面试题
  9. String类中的api
  10. [noip2014]解方程 hash+秦九昭
  11. linux双网卡透明网桥,两种网桥透明网桥和源路由选择网桥
  12. 暴风电视刷鸿蒙,暴风电视蓝屏怎么解决
  13. 微信公众号网页 H5 video 标签自动播放
  14. 庆祝自己喜提ROG冰刃3新锐!
  15. 理解MySQL主从复制之realy_log_recovery
  16. 《CLR via C#》读书笔记---10属性
  17. 职场吐槽大会,原来办公软件也有如此多神技能?
  18. ATC计算机会议,实验室三项成果分别被计算机系统、数据库、分布式计算重要会议 USENIX ATC、ICDE、IPDPS收录...
  19. 文章原创度检测 api数据接口
  20. Rosetta安装过程报错集锦

热门文章

  1. html整体图片拆分拼图代码源代码,canvas拼图功能实现代码示例
  2. 元素滚动 scroll 系列
  3. opencv C++图像/视频旋转 90度 180度 270度
  4. 英语听力采用计算机化考试,高考英语听力机考特点与应对建议
  5. 网购可到家门口的报亭提货了
  6. Excel分列小技巧
  7. 解决github官网进不去
  8. 【信息安全技术】RSA算法的研究及不同优化策略的比较
  9. 计算机光驱无法启用,win10系统没法启动光驱怎么解决
  10. open wrt 跟换主题_openwrt 更改默认主题