SDC命令详解:使用set_propagated_clock命令进行约束

相关阅读

SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm=1001.2014.3001.5482


目录

        指定端口列表/集合

        简单使用

        注意事项


        传播时钟是在进行了时钟树综合后,使用set_propagated_clock命令可以将一个理想时钟转换为传播时钟(注意,虚拟时钟即无时钟源对象的时钟无法被转换为传播时钟)(设置对象的propagated_clock属性为true),此时的时钟延迟由源延迟和真实网络延迟组成,这里的网络延迟是根据时钟路径上的线延迟和单元延迟真实计算出来的,而不再使用set_clock_latency命令设置网络延时。有关理想时钟和传播时钟的更详细内容,可以参考下面的博客。如果想要移除传播时钟,使用remove_propagated_clock命令。

静态时序分析:ideal_clock、propagated_clock以及generated_clock的关系及其延迟计算规则(一)https://blog.csdn.net/weixin_45791458/article/details/139998035?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522e4f4bf160af3c2b2f079b3291ac96a32%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=e4f4bf160af3c2b2f079b3291ac96a32&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-139998035-null-null.nonecase&utm_term=%E4%BC%A0%E6%92%AD%E6%97%B6%E9%92%9F&spm=1018.2226.3001.4450        本文针对Design Compiler,但该命令同样存在于PrimeTime、IC Compiler等工具中,它们大致相同,略有差别。set_fanout_load命令的BNF范式(有关BNF范式,可以参考以往文章)为:

set_propagated_clock
    object_list

指定端口列表/集合

        指定一个列表/集合,包含时钟对象、端口对象或引脚对象,对于列表而言,如果有多于一个对象,需要使用引号或大括号包围(对使用集合无效),关于列表和集合的区别,可以参考下面的博客。

SDC命令详解:使用集合(Collection)而不是字符串(String)/列表(List)作为命令参数https://chenzhang.blog.csdn.net/article/details/147144571

简单使用

        下面用一个简单的例子进行说明,图1是两个D触发器的简单级联,可以看出此时的时钟路径上人为插入了一些缓冲器。 

图1 一个简单的例子

        下面使用create_clock命令,在clk端口创建了一个理想时钟,周期为10。

dc_shell> create_clock -period 10 [get_ports clk]

        对于理想时钟而言,它的延迟包括两部分:源延迟(source)和网络延迟(network delay),它们都是使用set_clock_latency命令进行设置的,关于该命令的使用,可以参考之前的文章SDC命令详解:使用set_clock_latency命令进行约束。 注意:理想时钟的网络延迟值是直接设置的,而不会从时钟路径上的线延迟(net delay)和单元延迟(cell delay)中推断出来。

        下面的命令设置了时钟clk的源延迟为2ns,网络延迟为0.5ns。

dc_shell> set_clock_latency -source 2 [get_clocks clk]
dc_shell> set_clock_latency 0.5 [get_clocks clk]

        图2所示的建立时间时序报告显示,时钟的总延迟为2.5ns(注意这里的network delay其实指的是总延迟,而不只是网络延迟),括号中的ideal提示了这是一个理想时钟。

图2 建立时间时序报告

        下面使用set_propagated_clock命令将理想时钟clk转换成传播时钟,此时会给出警告。

dc_shell> set_propagated_clock [get_clocks clk]
Warning: Converting ideal clock at 'clk' to propagated clock.  (UID-477)

        图3是此时的时钟报告,可以看出此时的时钟clk已经拥有propagated_clock属性了,即是一个传播时钟了。 

图3 时钟报告(传播时钟)

        此时的时钟延迟由源延迟和真实网络延迟组成,这里的网络延迟是根据时钟路径上的线延迟和单元延迟真实计算出来的,如图4所示(此时添加了-path full_clock选项以显示出完整的时钟路径)。

图4 展开时钟路径的建立时间报告

注意事项

        有些时候,会设置端口对象或引脚对象的传播时钟属性,此时经过这些端口对象或引脚对象的时钟对象将被视为传播时钟(注意,该时钟本身可以是理想时钟)。

        下面依旧以图1为例说明这种情况,使用set_propagated_clock命令设置输入端口clk的传播时钟属性。

​dc_shell> set_propagated_clock [get_clocks clk]

        此时时钟对象依旧是理想时钟,如图5所示。

图5 时钟报告(理想时钟)

        下面使用set_input_delay命令设置输入端口d的输入延迟。

dc_shell> set_input_delay 0.5 -clock [get_clocks clk] [get_ports d]

        此时经过输入端口d的建立时间时序报告如图6所示(此时添加了-path full_clock选项以显示出完整的时钟路径)。

图6 展开时钟路径的建立时间报告

        可以看出,即使是同一个时钟对象clk,对于发射路径其被视为理想时钟(使用设置网络延迟), 对于捕获路径其被视为传播时钟(使用真实网络延迟)。

        如果将时钟本身设置为传播时钟,发射路径将只包含源延迟,而不含网络延迟(在不使用-reference_pin选项的情况下)。

# ==================== GCD Routing 脚本 (修改版) ==================== # 设计名称与工艺平台 set DESIGN_NAME "microwatt" set ACTUAL_TOP_MODULE_NAME "microwatt" set PLATFORM "nangate45" # --- 路径配置 --- set PLATFORM_DIR "./platforms/${PLATFORM}" set RESULTS_DIR "./results/${PLATFORM}/${DESIGN_NAME}/routing" set SDC_FILE "./results/${PLATFORM}/${DESIGN_NAME}/cts/4_cts.sdc" file mkdir $RESULTS_DIR # === 技术文件配置 === set TECH_LEF "${PLATFORM_DIR}/lef/NangateOpenCellLibrary.tech.lef" set SC_LEF "${PLATFORM_DIR}/lef/NangateOpenCellLibrary.macro.mod.lef" set LIB_FILES "${PLATFORM_DIR}/lib/NangateOpenCellLibrary_typical.lib" # === 环境变量配置 === set ::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) 4 set ::env(DONT_USE_CELLS) "TAPCELL_* FILLER_*" set ::env(SCRIPTS_DIR) "./scripts" set ::env(REPORTS_DIR) "./reports" set ::env(LIB_FILES) $LIB_FILES set ::env(RESULTS_DIR) $RESULTS_DIR # === 新增拥塞优化参数 === set ::env(MIN_ROUTING_LAYER) metal2 set ::env(MAX_ROUTING_LAYER) metal10 set ::env(FILL_CELLS) "FILLCELL_X1 FILLCELL_X2 FILLCELL_X4 FILLCELL_X8 FILLCELL_X16 FILLCELL_X32" set ::global_route_congestion_report "$::env(REPORTS_DIR)/congestion.rpt" set ::env(ROUTING_LAYER_ADJUSTMENT) 0.2 ;# 降低布线层使用率(原0.4) set ::env(GLB_RT_MAX_DIODE_INS_ITERS) 10 ;# 增加二极管插入迭代次数 set ::env(GLB_RT_OVERFLOW_ITERS) 100 ;# 增加拥塞优化迭代次数 set ::env(GLB_RT_ADJUSTMENT) 0.3 ;# 增加布线资源调整因子 set ::env(GLB_RT_ALLOW_CONGESTION) 0.1 ;# 允许轻度拥塞 set ::env(GLB_RT_L1_ADJUSTMENT) 0.99 ;# 调整金属层1资源分配 # ==== 读取设计 ==== read_lef $TECH_LEF read_lef $SC_LEF read_liberty $LIB_FILES read_db "./results/${PLATFORM}/${DESIGN_NAME}/cts/4_1_cts.odb" read_sdc $SDC_FILE # 加载平台RC配置文件 source ${PLATFORM_DIR}/setRC.tcl source $::env(SCRIPTS_DIR)/util.tcl # ==== 全局布线优化 ==== puts "=== 开始增强型全局布线 ===" # 执行引脚布线访问 pin_access -bottom_routing_layer $::env(MIN_ROUTING_LAYER) \ -top_routing_layer $::env(MAX_ROUTING_LAYER) # 执行全局布线(增加拥塞优化迭代) global_route -congestion_iterations 50 \ -congestion_report_file $::global_route_congestion_report \ -verbose 2 set_placement_padding -global \ -left $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) \ -right $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) # 设置传播时钟 set_propagated_clock [all_clocks] estimate_parasitics -global_routing set_dont_use $::env(DONT_USE_CELLS) # 天线效应预检查 check_antennas -report_file $::env(REPORTS_DIR)/antenna_pre.rpt # Repair design using global route parasitics repair_design_helper # Running DPL to fix overlapped instances global_route -start_incremental detailed_placement global_route -end_incremental \ -congestion_report_file $::env(REPORTS_DIR)/congestion_post_repair_design.rpt # Repair timing using global route parasitics puts "Repair setup and hold violations..." estimate_parasitics -global_routing repair_timing_helper # Running DPL to fix overlapped instances global_route -start_incremental detailed_placement global_route -end_incremental \ -congestion_report_file $::env(REPORTS_DIR)/congestion_post_repair_timing.rpt # 保存全局布线结果 write_def $ RESULTS_DIR/5_1_grt.def write_db $ RESULTS_DIR/5_1_grt.odb # ==== 详细布线优化 ==== puts "=== 开始详细布线(含拥塞优化)===" # 配置高级布线参数 set detailed_route_args " -output_drc $::env(REPORTS_DIR)/route_drc.rpt -output_maze $::env(REPORTS_DIR)/maze.log -drc_report_iter_step 10 -verbose 3 -bottom_routing_layer $::env(MIN_ROUTING_LAYER) -top_routing_layer $::env(MAX_ROUTING_LAYER) -distributed -num_cpus 4 " # 迭代式布线修复(3次迭代) for {set i 0} {$ i < 3} {incr i} { detailed_route {*}$detailed_route_args repair_antennas -iterations 5 } # 保存详细布线结果 write_def $RESULTS_DIR/5_2_route.def write_db $RESULTS_DIR/5_2_route.odb # ==== 填充单元插入 ==== puts "=== 开始填充单元插入 === " filler_placement $::env(FILL_CELLS) write_def $ RESULTS_DIR/5_3_fillcell.def write_db $ RESULTS_DIR/5_3_fillcell.odb # 最终设计检查 check_antennas -report_file $::env(REPORTS_DIR)/antenna_final.rpt report_design_area -file $::env(REPORTS_DIR)/area_final.rpt puts "Routing阶段完成!优化后拥塞率降低至可接受范围" 检查脚本语句语法是否错误
07-10
set_clock_uncertainty是一个设置时钟不确定性的命令,它用于定义时钟的不确定性范围。在引用中,set_clock_uncertainty -setup 0.2 [get_clocks CLK_CONFIG]表示设置CLK_CONFIG时钟的建立时间不确定性为0.2,而set_clock_uncertainty -hold 0.05 [get_clocks CLK_CONFIG ]表示设置CLK_CONFIG时钟的保持时间不确定性为0.05。 set_clock_latency是一个设置时钟延迟的命令,它用于定义时钟信号的传输延迟。在引用中,set_clock_latency 0.8 [get_clocks CLK_CONFIG]表示设置CLK_CONFIG时钟的传输延迟为0.8,而set_clock_latency 1.9 -source [get_clocks SYS_CLK]表示设置SYS_CLK时钟的传输延迟为1.9。此外,set_clock_latency 0.851 -source -min [get_clocks CFG_CLK]和set_clock_latency 1.322 -source -max [get_clocks CFG_CLK]分别表示设置CFG_CLK时钟的最小和最大传输延迟为0.851和1.322。 set_clock_uncertainty和set_clock_latency都是在时钟设计和时序分析中使用命令set_clock_uncertainty用于考虑时钟不确定性,以确保电路在时序要求下正常工作。而set_clock_latency用于考虑时钟延迟,以确保时钟信号在各个时序路径中被正确地传输。两者都对于时钟和时序的稳定性和可靠性至关重要。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数字电路静态时序分析基础三](https://blog.csdn.net/weixin_45799954/article/details/114948996)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日晨难再

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值