爱游戏-BPO行业整合方案提供者
专业化、科技化、国际化;高标准、广覆盖、全流程
了解更多vivado时序异常阐发 时候:2024-12-19 20:25:38 手机看文章
扫描二维码随时随地手机看文章
时序异常
英文名为Timing Exception,可以认为是时序破例或时序异常“破例”或“异常”是指这部门时序的阐发与年夜大都常规时序阐发分歧。下表给出了Vivado撑持的时序异常号令和功能:
Vivado不撑持即时阐发有矛盾的时序异常,需要运行report_exceptions进行完全的阐发,陈述所有时序异常。多周期路径的环境有良多,比力复杂,本文介绍其余三种时序异常的相干常识。
子虚路径false path某些在拓扑布局上看存在在设计中的路径,可是没有工作或不需要被计时,便被称作子虚路径。子虚路径在时序阐发进程中应当被疏忽不计。下面这些环境都属在子虚路径:
在有双同步器逻辑的处所有时钟域交叉
可能只在上电时写入一次的寄放器
复位或测试逻辑
异步散布式RAM的写端口在异步读时钟之间的路径
举个具体的例子加深对子虚路径的理解,以下图:
两个多路选择器MUX节制两个寄放器间的数据传输,可是两个MUX采取统一个选择旌旗灯号。细心阐发会发现,不管若何Q端数据都没法传递到D端。固然布局图上看起来Q和D之间存在一条路径,可是没有起到任何功能,是以应当界说为子虚路径。
为什么要在时序阐发中移除失落子虚路径?来由以下:
削减运行时候:东西不需要为这些子虚路径计时和做优化,可以削减良多运行时候。
增添成果质量:移除子虚路径可以极年夜增添成果质量QOR(Quality of Results)。综合、结构和优化设计的质量很年夜水平上遭到时序问题的影响,由于东西总会测验考试解决这些问题,包括子虚路径会致使不睬想的成果(好比东西将过量留意力放在解决子虚路径的时序违反上,而轻忽了真正需要解决的问题)。
子虚路径由set_false_path号令界说,该号令模板以下:
set_false_path [-setup] [-hold] [-from] [-to] [-through]
几个节点列表选项的寄义以下:
-from:一组正当的出发点列表,包罗时钟对象、时序元素的时钟管脚、输入主端口或双向主端口。
-to:一组正当的终点列表,包罗时钟对象、时序元素的数据输入管脚、输出主端口或双向主端口。
-through:一组正当的管脚或端口,留意节点的挨次很主要。假如束缚中仅利用了-through,没有利用-from和-to选项,Vivado会从时序阐发中移除所有经由过程该列表的路径,利用时要特殊谨慎。
下面给出几个界说子虚路径的例子:
#-through的挨次暗示路径穿过节点的挨次,是以下面是两条分歧的束缚
set_false_path -through cell1/pin1 -through cell2/pin2
set_false_path -through cell2/pin2 -through cell1/pin1
#上图中的子虚路径应当用下面这条号令束缚
set_false_path -through [get_pins MUX1/a0] -through [get_pins MUX2/a1]
#利用-through而不消-from和-to的益处是可以确保所有经由过程此节点的路径城市被移除,而不消斟酌出发点和终点
#移除复位端口到所有寄放器间的时序路径
set_false_path -from [get_port reset] -to [all_registers]
#禁用两个异步时钟域间的时序路径,从CLKA到CLKB
set_false_path -from [get_clocks CLKA] -to [get_clocks CLKB]
#留意,上述号令并没有禁用从CLKB到CLKA的路径,还需要弥补以下束缚
set_false_path -from [get_clocks CLKB] -to [get_clocks CLKA]
从最后一个例子可知,我们需要双向地禁用时序路径,可是假如设计中有多个异步时钟域,编写起来就很是麻烦。不知道您是不是还记得第31篇中讲过的时钟束缚方式,这类环境最好其实应当利用set_clock_groups设置分歧的异步时钟组。
上面还说到了异步散布式RAM的环境,这里也举一个束缚例子。假定一个异步双口散布式RAM,其写操作在RAM时钟同步,可是读操作是异步的,这类环境下应当在写和读时钟间设置一个子虚路径。束缚以下:
#在RAM前的写寄放器和RAM后的读寄放器间设置子虚路径
set_false_path -from [get_cells] -to [get_cells]
个例阐发设计中,某些旌旗灯号在特定模式中为常数值,好比:(1).某些测试旌旗灯号不会变换,直接毗连在VSS或VDD上;(2).某些旌旗灯号上电后便不再产生转变;(3).假如设计有多种功能模式,某些旌旗灯号在部门模式下为活跃状况,但在其它模式下为不活跃状况。这些环境便属在“个例阐发”。
我们必需告知静态时序阐发引擎,哪些旌旗灯号为常数值,从而削减阐发规模、运行时候和内部占用率,而且没必要陈述那些不工作的和不相干的路径。凡是,设计者利用set_case_analysis号令将旌旗灯号(管脚和端口)声名为不活跃状况。该号令的语法以下 :
set_case_analysis
参数值value可所以0、1、zero、one、rise、rising、fall或falling。感化对象可所以端口(port)、子单位(英文名为leaf cell)的管脚或条理模块的管脚。下面举两个例子增强对这类时序异常的理解。
第一个例子以下图,clock_sel是一个时钟选择器,经由过程选择管脚s对两个输入时钟clk_1和clk_2进行选择输出:
假如我们只但愿阐发一种个例,好比只阐发选择clk_2时的环境。经由过程将 s管脚设置为常数便可只把clk_2传递到输出端口o。束缚以下:
set_clock -name -clk_1 -period 10.0 [get_pins clock_sel/I0]
set_clock -name -clk_2 -period 15.0 [get_pins clock_sel/I1]
set_case_analysis 1 {get_pins clock_sel/S}
对某一管脚设置了个例阐发,会致使禁用颠末该管脚的路径上的时序阐发,也不会陈述相干信息。第二个例子以下图,BUFG_GT有一个动态时钟分频节制管脚DIV[2:0],由其它逻辑驱动而不是直接毗连到VCC/GND:
默许环境下,Vivado会假定输出时钟的最坏可能环境,即1分频(相当在不分频,此时频率最高)。但是假如设计中底子不会呈现DIV取1的环境,这就成了过度束缚。为了更公道地束缚设计,我们可以对DIV[2:0]总线进行个例阐发束缚,好比可能呈现的最差环境为DIV取3,束缚以下:
set_case_analysis 0 {get_pins bufg_gt_pclk/DIV[0]}
set_case_analysis 1 {get_pins bufg_gt_pclk/DIV[1]}
set_case_analysis 0 {get_pins bufg_gt_pclk/DIV[2]}
最小/最年夜延迟最年夜延迟束缚set_max_delay用在改写路径的默许成立时候(或恢复时候)需求;最小延迟束缚set_min_delay用在改写路径的默许连结时候(或移除时候)。两公约束号令的语法模板以下:
set_max_delay[-datapath_only] [-from] [-to] [-through]
set_min_delay[-from] [-to] [-through]
-from、-to和-through和子虚路径中的用法不异。set_max_delay号令中假如添加了-datapath_only,那末计较裕量时便不会斟酌时钟斜率。利用最小/最年夜延迟束缚要留意以下三点:
路径上仅设置最年夜延迟束缚(不利用-datapath_only选项),不会点窜该路径上的最小延迟需求,连结时候查抄仍采取默许值,相反同样成立。但假如插手了-datapath_only,就会致使该路径上的连结时候需求被疏忽。
凡是输入端口到第一级寄放器间的束缚用set_input_delay号令;最后一级寄放器到输出端口之间的束缚用set_output_delay号令(详情见第32篇)。但输入端口到输出端口之间的纯组合逻辑路径可以用set_max_delay和set_min_delay号令进行束缚(凡是称为in-to-out I/O路径)。
某些异步旌旗灯号间没有时钟关系,可是需要最年夜延迟束缚。好比我们凡是用set_clock_groups划分两个异步时钟域,但有时我们需要确保两个时钟域之间的路径延迟不要太高。这类环境下,我们就要用set_max_delay和set_false_path的号令组合(由于set_clock_groups的优先级更高,会代替set_max_delay,是以不克不及和其一块利用)。
别的在束缚最小延迟和最年夜延迟时,假如-from和-to中的节点选择不公道,会呈现路径朋分(Path Segmentation)现象。第34篇给出了路径朋分的具体实例和申明。
禁用Timing Arcs最后再介绍一种时序异常的特例:Timing Arcs,字面翻译为时序弧,之所以没有零丁列为一种时序异常,是由于它与其它时序异常有着千丝万缕的关系。其实良多环境下计时器为了处置一些非凡环境会主动禁用某些时序弧,好比:
组合逻辑反馈环不克不及被准确地计时(是以也不保举利用),计时器会经由过程禁用环内的某条时序弧来打破环路。
据前文所述,默许环境下MUX的所有输入数据城市传递端口,可是个例阐发时将MUX的选择旌旗灯号设为常数值,此时唯一一个数据输入端口会传递到输出端口。其实这恰是由计时器打断了其它数据端口到输出端口间的时序弧实现的。
Vivado供给了set_disable_timing号令,可以报酬打断一个单位输入端口到输出端口之间的时序弧。斟酌以下利用环境:
好比对上面第一个例子的环境,可以人工设定打断组合反馈环中的哪条时序弧,而不是让东西主动完成。
假定有多个时钟同时达到LUT的输入管脚,可是只能有一个时钟传递到LUT的输出端口。此时需要打断与其它时钟相干的时序弧。
当禁用了时序弧后,经由过程该时序弧的所有时序路径都不会在时序阐发中陈述。是以利用时要额外谨慎,避免禁用了需要的时序弧,致使埋没的时序违反或时序问题使设计在硬件中不克不及正常工作。set_disable_timing的语法和示例以下:
#语法,-from和-to只能设置为库单位的管脚名称(不是设计管脚名称)
set_disable_timing [-from] [-to] [-quiet] [-verbose]
#禁用所有基在LUTRAM的异步FIFO的WCLK到O之间的时序弧
set_disable_timing -from WCLK -to O [get_cells inst_fifo_gen/ gdm.dm/gpr1.dout_i_reg[*]]
#指定对象的所有以O管脚为终点的时序弧都被禁用
set_disable_timing -to O
#指定对象的所有以WCLK管脚为出发点的时序弧都被禁用
set_disable_timing -from WCLK
#指定对象内的所有时序弧都被禁用
set_disable_timing
利用report_disable_timing号令可以查看所有主动禁用和手动禁用了的时序弧。留意这个列表可能会很是年夜,最好加上-file选项保留成果到文件中查看。
欲知详情,请下载word文档 下载文档