静态时序分析:典型与非典型时序路径的约束详解(一)
相关阅读静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482时序路径是静态时序分析中的一个重要概念了解时序路径能帮助设计者更好地编写SDC脚本本文旨在详细介绍时序路径相关内容。首先给出时序路径的定义时序路径是由时序弧构成的数据路径静态时序分析会分别对每条有约束的时序路径进行时序检查例如建立时间检查、保持时间检查、移除时间检查、恢复时间检查、最大延迟检查、最小延迟检查、门控时钟检查、数据到数据检查、最小脉冲宽度检查等。时序路径可以是典型的也可以是非典型的时序路径可以是有约束的也可以是未约束的。典型的时序路径典型时序路径的起点是输入端口包括输入输出双向端口或触发器的时钟引脚注意如果完整来说还是得包含时钟路径即时钟源到时钟引脚的路径典型时序路径的终点是输出端口包括输入输出双向端口或触发器的数据引脚包括复位引脚。下面将举例进行说明图1是一个简单电路的示意图它由两个D触发器组成。图1 一个简单的例子按照上面的定义此时一共存在五条典型的时序路径分别是输入端口data_in到触发器t_reg的数据引脚D。触发器t_reg的时钟引脚CK到触发器data_out_reg的数据引脚D。触发器data_out_reg的时钟引脚CK到输出端口data_out。输入端口rst_n到触发器t_reg的复位引脚RN。输入端口rst_n到触发器data_out_reg的复位引脚RN。可以使用下面的report_timing命令分别给出这五条时序路径的时序报告仅给出最大路径max时序报告如图2到图6所示。report_timing -from [get_ports data_in] -to [get_pins t_reg/D]图2 第一条时序路径的时序报告report_timing -from [get_pins t_reg/CK] -to [get_pins data_out_reg/D]图3 第二条时序路径的时序报告report_timing -from [get_pins data_out_reg/CK] -to [get_ports data_out]图4 第三条时序路径的时序报告下面两条终点是异步复位信号的时序路径在使用report_timing命令报告前需要先设置DC中的环境变量因为默认情况下DC会将触发器时钟引脚CK到复位引脚RN的时序弧中断。enable_recovery_removal_arcs 默认值false timing_disable_recovery_removal_checks 默认值true /*它们永远保持相斥可以将enable_recovery_removal_arcs设置为true也可以将 timing_disable_recovery_removal_checks设置为fasleDC会自动设置另一个变量。*/ set enable_recovery_removal_arcs true set timing_disable_recovery_removal_checks false //两者取一即可report_timing -from [get_ports rst_n] -to [get_pins t_reg/RN]图5 第四条时序路径的时序报告report_timing -from [get_ports rst_n] -to [get_pins data_out_reg/RN]图6 第五条时序路径的时序报告从图2到图6中的Startpoint和Endpoint可以清晰地看出时序路径的起点和终点图中并未将触发器的时钟引脚、数据复位引脚直接写作起点和终点而是将整个触发器作为起点和终点并且括号内还说明了触发器的类型这代表触发器拥有从时钟引脚到数据输入/输出端的时序弧。在后面的非典型时序路径中我们会看到数据复位引脚直接写作终点的情况这反而是少见的。从图中我们可以看到这些时序路径都属于none路径组这是因为它们未约束的。下面我们使用命令约束这几条时序路径如图7到图11所示。create_clock -period 10 [get_ports clk1] create_clock -period 15 [get_ports clk2] create_clock -period 8 -name clk_v //创建虚拟时钟为了约束复位端口 set_input_delay 0.5 -clock [get_clocks clk1] [get_ports data_in] //输入延迟约束 set_input_delay 0.5 -clock [get_clocks clk_v] [get_ports rst_n] //输入延迟约束 set_output_delay 0.5 -clock [get_clocks clk2] [get_ports data_out] //输出延迟约束report_timing -from [get_ports data_in] -to [get_pins t_reg/D]图7 第一条时序路径的时序报告建立时间report_timing -from [get_pins t_reg/CK] -to [get_pins data_out_reg/D]图8 第二条时序路径的时序报告建立时间report_timing -from [get_pins data_out_reg/CK] -to [get_ports data_out]图9 第三条时序路径的时序报告建立时间report_timing -from [get_ports rst_n] -to [get_pins t_reg/RN]图10 第四条时序路径的时序报告恢复时间report_timing -from [get_ports rst_n] -to [get_pins data_out_reg/RN]图11 第五条时序路径的时序报告恢复时间从图7到图11中可以看出时序路径起点和终点的括号内的clock信息表示端口、触发器引脚已经被时钟约束了一般而言指典型时序路径只有起点和终点都被时钟约束了才代表这条时序路径才可以进行时序分析还有一个条件该路径不能被设置为伪路径此时每条时序路径属于一个时序组从图7到图11中可以看出其按照约束其终点的时钟分组即时序路径1、4属于时序组clk1时序路径2、3、5属于时序组clk2。非典型的时序路径非典型时序路径在使用几条特定的约束命令产生路径分割后可能出现包括set_disable_timing命令、set_min_delay命令和set_max_delay命令有时set_input_delay命令和set_output_delay命令也会导致非典型时序路径的出现这发生在指定了内部引脚的输入/输出延迟的情况下。发生路径分割时使用report_timing命令会提示Warning: Breaking the timing path through pin *** due to user timing constraints. (TIM-175)一般情况不会遇见。非典型路径的起点可以是端口和任意单元的引脚只要能保证有相应的时序弧。下面将举例进行说明图12是一个简单电路的示意图它和图1很相似只多了一个反相器因此也拥有相似的五条时序路径。图12 另一个简单的例子还是使用相同的命令为设计添加约束。create_clock -period 10 [get_ports clk1] create_clock -period 15 [get_ports clk2] create_clock -period 8 -name clk_v //创建虚拟时钟为了约束复位端口 set_input_delay 0.5 -clock [get_clocks clk1] [get_ports data_in] //输入延迟约束 set_input_delay 0.5 -clock [get_clocks clk_v] [get_ports rst_n] //输入延迟约束 set_output_delay 0.5 -clock [get_clocks clk2] [get_ports data_out] //输出延迟约束随后我们使用set_max_delay命令指定从触发器t_reg的时钟引脚CK到反相器U4的输入引脚A的最大延迟。这会导致路径分割原本从触发器t_reg的时钟引脚CK到触发器data_out_reg的数据引脚D的时序路径被分割为两条一条从触发器t_reg的时钟引脚CK到反相器U4的输入引脚A另一条从反相器U4的输入引脚A到触发器data_out_reg的数据引脚D如图13和图14所示。set_max_delay 0.5 -from [get_pins t_reg/CK] -to [get_pins U4/A]report_timing -from [get_pins t_reg/CK] -to [get_pins U4/A]图13 第一条非典型的时序路径最大延迟report_timing -from [get_pins U4/A] -to [get_pins data_out_reg/D]图14 第二条非典型的时序路径最大延迟尽管已经提前介绍但这两份时序报告仍可能会让人产生很多疑惑下面详细说明。图13中时序路径的终点和图14中时序路径的起点都是反相器的输入引脚这是时序分割所带来的括号内的internal path也说明了着这是一个内部的起、终点它们没有被时钟约束。第一条时序路径终点没有时钟约束所以无法进行建立/保持时间检查但它进行了最大延迟时间检查这是由set_max_delay命令所指定的这种终点没有时钟约束的时序路径被归为时序组default。另外要注意的是可以为第一条时序路径的终点添加输出延迟约束无论是否关联时钟如关联了时钟则该路径的时序组是关联时钟组图15和图16分别展示了这两种情况。set_output_delay 0.01 [get_pins U4/A] //输出延迟约束无关联时钟report_timing -from [get_pins t_reg/CK] -to [get_pins U4/A]图15 第一条非典型的时序路径输出延迟约束无关联时钟set_output_delay 0.02 -clock [get_clocks clk2] [get_pins U4/A] //输出延迟约束有关联时钟report_timing -from [get_pins t_reg/CK] -to [get_pins U4/A]图16 第一条非典型的时序路径输出延迟约束有关联时钟可以发现最大延迟时间检查与无关联时钟的计算方式是一样的不同在于此时该路径属于时序组clk2并不会进行类似建立时间的检查这是因为最大延迟时间检查优先级高于建立时间检查但其可以进行保持时间的检查因为并没有使用set_min_delay命令覆盖保持时间检查如图17所示。report_timing -from [get_pins t_reg/CK] -to [get_pins U4/A] -delay_type min图17 第一条非典型的时序路径输出延迟约束有关联时钟第二条时序路径的起点没有时钟约束但无法进行时序分析因为第二条时序路径不是set_max_delay命令所指定的路径即使终点已经被时钟约束此时要为第二条时序路径的起点添加有关联时钟的输入延迟约束此时的建立时间的分析如图18所示此时使用set_max_delay和set_min_delay会分别覆盖有关联时钟的输入输出延迟带来的建立和保持时间检查。set_input_delay 0.1 -clock [get_clocks clk2] [get_pins U4/A] //输入延迟约束有关联时钟report_timing -from [get_pins U4/A] -to [get_pins data_out_reg/D]图18 第二条非典型的时序路径输入延迟约束有关联时钟下面来看最后一个例子巩固一下非典型时序路径的相关知识。还是以图11为例为了方便重绘为下图19。图19 另一个简单的例子这次我们使用set_max_delay命令指定从反相器U4的输入引脚A到反相器U4的输出引脚Y的最大延迟。路径分割后原本从触发器t_reg的时钟引脚CK到触发器data_out_reg的数据引脚D的时序路径被分割为三条一条从触发器t_reg的时钟引脚CK到反相器U4的输入引脚A一条从反相器U4的输入引脚A到反相器U4的输出引脚Y一条从反相器U4的输出引脚Y到触发器data_out_reg的数据引脚D。如图20、图21和图22所示。set_max_delay 0.5 -from [get_pins U4/A] -to [get_pins U4/Y]report_timing -from [get_pins t_reg/CK] -to [get_pins U4/A]图20 第一条非典型的时序路径report_timing -from [get_pins U4/A] -to [get_pins U4/Y]图21 第二条非典型的时序路径最大路径report_timing -from [get_pins U4/Y] -to [get_pins data_out_reg/D]图22 第三条非典型的时序路径最大路径和上一个例子一样三条非典型路径的分析如下所示。可以为第一条非典型的时序路径的终点添加有关联时钟的输出延迟约束这样会进行建立/保持时间的检查如要只进行建立/保持时间的约束分别添加-max/-min选项即可也可以为第一条非典型的时序路径也使用set_max_delay命令或set_min_delay命令设置约束进行最大/最小延迟时间检查。可以为第二条非典型的时序路径的起点添加有无关联时钟的输入延迟约束、终点添加有无关联时钟的输出延迟约束但注意即使起点和终点都添加了有关联时钟的输入和输出约束也只会进行最大延迟时间检查以及保持时间检查。可以为第三条非典型的时序路径的起点添加有关联时钟的输入延迟约束这样会进行建立/保持时间的检查也可以为第三条非典型的时序路径也使用set_max_delay命令或set_min_delay命令设置约束进行最大/最小延迟时间检查。因为篇幅问题本文的第一部分到此结束后面随缘更。