文档库 最新最全的文档下载
当前位置:文档库 › TimeQuest就一定要搞定

TimeQuest就一定要搞定

TimeQuest就一定要搞定

作 者riple

整 理Kevin

时 间2010-7-28

目 录

z为什么一定要搞定

z时序约束和分析流程

z时序分析基本概念

z由QSF生成SDC

z时序分析基本公式

z取值为负数的建立时间

z看懂时序波形图

z图解Setup Time时序余量计算

z图解Multicycle Path时序余量计算(未完待续)

一 . 为什么一定要搞定

最近一段时间以来一直在尝试使用TimeQuest。胡乱配置了一通,屡屡失败。于是下定决心,从基本概念开始,力争把TimeQuest这个简化版的PrimeTime 搞定。

时序分析在ASIC设计中的重要性毋须多说(我也不甚了解)。在FPGA设计中,很少进行细致全面的时序约束和分析,Fmax是最常见也往往是一个设计唯一的约束。这一方面是由FPGA的特殊结构决定的,另一方面也是由于缺乏好用的工具造成的。好的时序约束可以指导布局布线工具进行权衡,获得最优的器件性能,使设计代码最大可能的反映设计者的设计意图。

花些功夫在静态时序分析上既可以保证设计质量,也可以促使设计者再认识自己的代码。这后一点,对于我们这些逻辑设计初学者来说,尤为重要。从门级(在Altera的FPGA器件中是LE级)再认识自己的代码,可以更深入地体会语言的特点,也可以更深入地理解综合工具对语言的处理,对于设计能力的提高帮助很大。

TimeQuest是Altera在6.0版的软件中加入的具备ASIC设计风格的静态时序分析(STA)工具。通过初步试用和观看网络教程,我感觉TimeQuest确实比Timng Analyzer功能强大一些,而且使用界面比较友好,易于进行深入的时序约束和结果分析。

TimeQuest采用Synopsys Design Constraints(SDC)文件格式作为时序约束输入,不同于Timing Analyzer采用的Quartus Settings File(QSF)约束文件。这正是TimeQuest的优点:采用行业通用的约束语言而不是专有语言,有利于设计约束从FPGA向ASIC设计流程迁移;有利于创建更细致深入的约束条件。

对于时序分析,我刚刚入门;采用TimeQuest进行约束输入也是第一次。在这一系列的博客里面,我计划记录自己在学习中获得的知识要点和实践中遇到的各种问题,既是自己的学习笔记,也希望对他人的工作有所助益,更希望大家提出批评意见,共同进步。

二 . 时序约束和分析流程

TimeQuest的约束和分析流程是与Quartus II的编译流程紧密结合的。如下图所示:

TimeQuest进行约束和分析的对象都来自Quartus II编译流程各阶段的编译结果。二者对应关系如下:

1. 分析与解析

Start Analysis & Elaboration -> RTL Viewer

Quartus II编译的第一步是纯粹的“逻辑综合”,虽然经过了逻辑优化,但是生成的数据库并不对应FPGA器件的物理结构,生成的网表中节点的名称也不与FPGA器件的Cell名称对应。由于TimeQuest进行约束和分析的对象是FPGA 器件的底层物理单元,所以这一步编译过程完成后不能进行TimeQuest时序约束和分析。

这一步在TimeQuest操作流程中没有实际意义。

2. 分析与综合(与映射)

Start Analysis & Synthesis -> Technology Map

Viewer(Post-Mapping) -> Create Timing Netlist(Post-Map), Specify Timing Constraints

Early Timing Estimate

这一编译步骤的名称虽然是“分析与综合”,但是在“综合”后还进行了一步“映射”(Mapping)。Start Analysis & Synthesis = Start Analysis & Elaboration + Mapping。这一步完成后生成的数据库已经对应了FPGA器件的物理结构,可以供TimeQuest进行时序约束之用。由于“映射”过程实际是预先布局过程,“映射”后的数据库包含了FPGA底层Cell的位置信息和Cell本身的时序信息,TimeQuest根据这一数据库生成的时序网表中的节点与FPGA底层Cell 是对应的。由于预先布局尚未执行时序驱动的布局和布线工作,也没有读入引脚位置等约束信息,这时的网表不包含布线信息,而且布局结果也会在P&R后发生变化,所以不能获得准确的时序分析结果。在这一步进行的时序分析是Early Timing Estimate,只是根据Cell本身的时序信息和由预布局结果得来的Cell 之间的位置关系进行的“估计”。

这一步在TimeQuest操作流程中的意义在于可以进行时序约束和时序预估。

3. 适配(P&R)

Start Fitter ->

Technology Map Viewer, Chip Planner ->

Create Timing Netlist(Post-Fit), Generate Timing Reports

这一步骤的名称“适配”对应的操作是“布局和布线”(P&R)。这一步骤是在上一个步骤获得时序约束信息后进行的,Fitter会努力按照时序约束的要求进行布局和布线优化。这一步骤获得的数据库包含了Cell的位置、Cell本身的时序信息和Cell之间连线资源的分布和时序信息,TimeQuest根据这一数据库生成的网表就是FPGA最终实现结果的时序网表,可以反映最终实现结果的时序特性。此时进行的时序分析才是最准确的。

这一步在TimeQuest操作流程中的意义在于可以进行最终的时序分析,并检查适配结果是否满足了时序约束的要求。(如文章开头引用的Quartus II Help 文档给出的流程图所示,在这一步才执行时序约束也是可以的,但是如果不指出在第2步就可以进行时序约束,会产生“先有鸡还是先有蛋”的矛盾,这一点就

是Altera文档误导读者之处。此外,在这一步才执行时序约束会重复执行P&R 操作,浪费编译时间。)

在上述流程的每一步中,都有Netlist Viewer与编译和时序分析的对应关系。根据这一对应关系,设计者可以借助Netlist Viewer工具观察编译生成的网表,间接观察和分析TimeQuest生成的对应的时序网表。Netlist Viewer实现了TimeQuest时序约束对象的可视化。

在上述操作流程的最后一步,还可以通过Chip Planner直观察看设计在FPGA中的实现情况,并且与TimeQuest的时序分析报告一一对应。Chip Planner 实现了TimeQuest时序分析结果的可视化。

相关链接:在线观看Chinese Version: Validating PeRFormance with the TimeQuest Static Timing Analyzer,离线观看Chinese Version: Validating Performance with the TimeQuest Static Timing Analyzer riple

关键路径中的时序分析工具对设计成败至关重要

附图:TimeQuest操作流程。

三 . 时序分析基本概念

以下内容译自Quartus II Version 7.0 Handbook, Volume 3:Verification

的6-13:Timing Analysis Overview部分。

TimeQuest需要读入布局布线后的网表才能进行时序分析。读入的网表是由以下一系列的基本单元构成的:

1. Cells:Altera器件中的基本结构单元。LE可以看作是Cell。

2. Pins:Cell的输入输出端口。可以认为是LE的输入输出端口。注意:

这里的Pins不包括器件的输入输出引脚,代之以输入引脚对应LE的输

出端口和输出引脚对应LE的输入端口。

3. Nets:同一个Cell中,从输入Pin到输出Pin经过的逻辑。特别注意:

网表中连接两个相邻Cell的连线不被看作Net,被看作同一个点,等价

于Cell的Pin。还要注意:虽然连接两个相邻Cell的连线不被看作Net,但是这个连线还是有其物理意义的,等价于Altera器件中一段布线逻辑,会引入一定的延迟(IC,Inter-Cell)。

4. Ports:顶层逻辑的输入输出端口。对应已经分配的器件引脚。

5. Clocks:约束文件中指定的时钟类型的Pin。不仅指时钟输入引脚。

6. Keepers:泛指Port和寄存器类型的Cell。

7. Nodes:范围更大的一个概念,可能是上述几种类型的组合,还可能不

能穷尽上述几种类型。

下面这幅图给出了一个时序网表的示例,展示了基本单元中的一部分。

有了网表的基本单元,我们就可以描述TimeQuest进行时序分析的对象:Edges。

Edges:Port-Pin,Pin-Pin,Pin-Port的连接关系都是Edges。注意,这里的Pin-Pin连接关系既包括Cell内部的连接(Net),也包括相邻Cell外部的Pin-Pin 连接。

Edges根据起止路径分为三类。

1. Clock paths:从Clock Port或内部生成的clock Pin到寄存器Cell的时

钟输入Pin。

2. Data paths:从输入Port到寄存器Cell的数据输入Pin,或从寄存器Cell

的数据输出Pin到另一个寄存器Cell的数据输入Pin。

3. Asynchronous paths:从输入Port到寄存器Cell的异步输入Pin,或从

寄存器Cell的数据输出Pin到另一个寄存器Cell的异步输入Pin。

下面这幅图给出了三种不同的Edges。

还要注意这样一组概念,这里的edge指的是时钟沿:

https://www.wendangku.net/doc/b714679241.html,unch Edge :前级寄存器发送数据对应的时钟沿,是时序分析的起

点。

https://www.wendangku.net/doc/b714679241.html,tch Edge :后级寄存器捕获数据对应的时钟沿,是时序分析的终

点。

下面这幅图给出了发送、捕获时钟沿的示意图。

有了上述的诸多概念,我们就可以得到时序分析公式的基本项了:

1.Data Arrival Time:Launch Edge + 前级寄存器Clock path的延时 + 前

级寄存器Cell从时钟Pin到数据输出Pin的Net延时(uTco) + Data path

的延时。

2.Data Required Time:Latch Edge + 后级寄存器Clock path的延时(+ uTh)或

(- uTsu)。

3.Clock Arrival Time:Latch Edge + 后级寄存器Clock path的延时。

四 . 由QSF生成SDC

QSF是Quartus Settings File的缩写,包含了一个Quartus工程的所有约束,包括工程信息、器件信息、引脚约束、编译约束和用于Classic Timing Analyzer的时序约束。

SDC是Synopsys Design Constraints的缩写,该文件用于TimeQuest Timing Analyzer的时序约束和定制报告。

在TimeQuest中把Classic Timing Analyzer的约束语句转换为SDF是很容易的。在Constraints菜单下,执行Generate SDC File from QSF即可。

以Quartus II安装路径下的\qdesigns\fir_filter项目为例,QSF文件中关于时序约束的语句如下:

# 约束clk为100MHz的时钟。

set_global_assignment -name FMAX_REQUIREMENT "100 MHz" -section_id clocka

set_instance_assignment -name CLOCK_SETTINGS clocka -to clk

# 约束clkx2为clk的二倍频时钟,相位偏移0.5ns

set_global_assignment -name BASED_ON_CLOCK_SETTINGS clocka -section_id clockb

set_global_assignment -name DIVIDE_BASE_CLOCK_PERIOD_BY 2 -section_id clockb

set_global_assignment -name OFFSET_FROM_BASE_CLOCK "500 ps" -section_id clockb

set_instance_assignment -name CLOCK_SETTINGS clockb -to clkx2

# 约束所有从clk到clkx2的时序路径为Multicycle,取值2

set_instance_assignment -name MULTICYCLE 2 -from clk -to clkx2

由该组QSF约束转换得到的SDC约束如下:

# Original Clock Setting Name: clocka

create_clock -period "10.000 ns" \

-name {clk} {clk}

# Original Clock Setting Name: clockb

create_generated_clock -multiply_by 2 -offset "0.500 ns" \

-source clk \

-name {clkx2} \

{clkx2}

# ** Multicycles

# QSF: -name MULTICYCLE 2 -from clk -to clkx2

set_multicycle_path -end -setup -from [get_clocks {clk}] -to [get_clocks {clkx2}] 2

set_multicycle_path -end -hold -from [get_clocks {clk}] -to [get_clocks {clkx2}] 1

从上面的例子可以看出,SDC比QSF简洁了些,在Multicycle的约束上也清晰明确了些

五 . 时序分析基本公式

以下内容译自Quartus II Version 7.0 Handbook, Volume 3:Verification 的6-28:Clock Analysis部分。 riple

TimeQuest静态时序分析的对象包括:寄存器和寄存器之间的路径、I/O之间、I/O和寄存器之间的路径、异步复位和寄存器之间的路径。TimeQuest根据Data Arrival Time和Data Required Time计算出时序余量(Slack)。当时序余量为负值时,就发生了时序违规(Timing Violation)。 riple 需要特别指出的一点是:由于时序分析是针对时钟驱动的电路进行的,所以分析的对象一定是“寄存器-寄存器”对。在分析涉及到I/O的时序关系对时,看似缺少一个寄存器分析对象,构不成“寄存器-寄存器”对,其实是穿过FPGA 的I/O引脚,在FPGA外部虚拟了一个寄存器作为分析对象。

一、 建立时间(Setup Time)检查:

遵循的原则是信号从Launch edge开始计时,经过一系列的时序路径,到达后级寄存器的数据输入Pin的速度不能太慢,时间不能太长,否则会侵占后级寄存器数据输入Pin相对于Latch edge的建立时间。刚好满足后级寄存器建立时间的数据到达时间是Data Required Time(相对于Latch edge计算),实际的数据到达时间是Data Arrival Time(相对于Launch edge计算)。显然,在建立时间检查中,Data Arrival Time要小于Data Required Time,否则就会造成建立时间违规。也就是说,Data Required Time是Data Arrival Time的最大值。二者之差就是建立时间的时序余量。

1)寄存器-寄存器(Register-to-Register)路径检查:

Clock Setup Slack = Data Required Time – Data Arrival Time

Data Arrival Time = Launch Edge + Clock Network Delay Source Register +μtco + Register-to-Register Delay

Data Required Time = Clock Arrival Time – μtsu – Setup Uncertainty Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register

2)输入引脚-寄存器(Pin-to-Register)路径检查:

Clock Setup Slack Time = Data Required Time – Data Arrival Time Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + Input Maximum Delay of Pin + Pin-to-Register Delay Data Required Time = Clock Arrival Time – μtsu

Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register

3) 寄存器-输出引脚(Register-to-Pin)路径检查:

Clock Setup Slack Time = Data Required Time – Data Arrival Time Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μtco + Register-to-Pin Delay

Data Required Time = Clock Arrival Time – Output Maximum Delay of Pin

Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register

从上面三组公式可以看出:Data Arrival Time的前两项是相同的;Data Required Time的第一项是相同的;Clock Arrival Time的公式是相同的。 riple 所以,第一组公式可以归纳如下:

Clock Setup Slack Time = Data Required Time – Data Arrival Time Data Arrival Time = 时钟到达前级寄存器的时刻 + 前级寄存器时钟到后

级寄存器数据输入的延迟

Data Required Time = 时钟到达后级寄存器的时刻 – 后级寄存器的建立

时间 riple

其中,后两个公式的第二项在其他情况下适当修改即可。

这就和一些书中讲到时序分析时采用的公式一致了。

report_timing -from [get_registers reg1] -to [get_registers reg2] -setup -npaths 1 -panel_name "Report Timing"

二、 保持时间(Hold Time)检查:

遵循的原则是信号从Launch edge开始计时,经过一系列的时序路径,到达后级寄存器的数据输入Pin的速度不能太快,时间不能太短,否则会侵占后级寄存器数据输入Pin相对于上一个Latch edge的保持时间。刚好满足后级寄存器保持时间的数据到达时间是Data Required Time(相对于Latch edge计算),实际的数据到达时间是Data Arrival Time(相对于Launch edge计算)。显然,

在保持时间检查中,Data Arrival Time要大于Data Required Time,否则就会造成保持时间违规。也就是说,Data Required Time是Data Arrival Time的最小值。二者之差就是保持时间的时序余量。

相对于建立时间检查,保持时间检查稍微难懂一些。二者都是同步逻辑设计中对同一个规则的不同解释:当前时钟沿发出的数据要在下一个时钟沿被正确捕获,不能晚,也不能早。晚了,会造成下一个时钟沿的建立时间违规,当前时钟沿发送的数据不能被下一个时钟沿捕获;早了,会造成上一个时钟沿发送的数据保持时间违规,上一个时钟沿发送的数据不能被当前时钟沿正确捕获。

二者在计算公式上的区别在于Slack计算公式中减数与被减数关系。

1)寄存器-寄存器(Register-to-Register)路径检查:

Clock Hold Slack = Data Arrival Time – Data Required Time

Data Arrival Time = Launch Edge + Clock Network Delay to Source Register +μtCO + Register to Register Delay

Data Required Time = Clock Arrival Time + μtH + Hold Uncertainty Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register

2)输入引脚-寄存器(Pin-to-Register)路径检查:

Clock Setup Slack Time = Data Arrival Time – Data Required Time Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + Input Minimum Delay of Pin + Pin to Register Delay Data Required Time = Clock Arrival Time + μtH

Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register

3) 寄存器-输出引脚(Register-to-Pin)路径检查:

Clock Setup Slack Time = Data Arrival Time – Data Required Time Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μtCO + Register to Pin Delay

Data Required Time = Clock Arrival Time – Output Minimum Delay of Pin

Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register

需要注意的是,上面公式中的Latch Edge实际对应的是上一个Launch Edge。所以,当Launch Clock和Latch Clock是同一个时钟时,上述公式中的Latch Edge 等于0;当前级和后级时钟不同时,还需要具体计算Latch Edge的取值。

report_timing -from [get_registers reg1] -to [get_registers reg2] -hold -npaths 1 -panel_name "Report Timing"

三、 恢复时间(Recovery Time)检查:

遵循的原则是异步控制信号变化的时刻不能介于寄存器的Latch edge和相应的建立时间之间,否则会导致寄存器的建立时间违规,数据输出进入亚稳态。即从前级寄存器的Launch edge开始计时,经过一系列的时序路径,前级寄存器数据输出到达后级寄存器异步控制Pin的速度不能太慢,时间不能太长,否则会

破坏后级寄存器在Latch edge的数据建立时间。该检查主要应用于异步控制信号由有效电平向无效电平转换的时刻,在该时刻破坏数据建立时间会导致亚稳态;在异步控制信号由无效电平向有效电平转换的时刻破坏数据的建立时间不会造成亚稳态。 riple

从上述定义,可以得到和建立时间检查类似的公式。

1)寄存器-寄存器(Register-to-Register)路径检查:

Recovery Slack Time = Data Required Time – Data Arrival Time

Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μtCO + Register to Register Delay

Data Required Time = Clock Arrival Time – μtSU

Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register

2)输入引脚-寄存器(Pin-to-Register)路径检查:

Recovery Slack Time = Data Required Time – Data Arrival Time

Data Arrival Time = Launch Edge + Maximum Input Delay + Port to Register Delay

Data Required Time = Clock Arrival Time – μtSU

Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register

report_timing -from [get_ports async_rst] -to [get_registers reg2] -recovery -npaths 1 -panel_name "Report Timing"

四、 移除时间(Removal Time)检查:

遵循的原则是异步控制信号变化的时刻不能介于寄存器的Latch edge和相应的保持时间之间,否则会导致寄存器的保持时间违规,数据输出进入亚稳态。即从前级寄存器的Launch edge开始计时,经过一系列的时序路径,前级寄存器数据输出到达后级寄存器异步控制Pin的速度不能太快,时间不能太短,否则会破坏后级寄存器在上一个Latch edge的数据保持时间。该检查主要应用于异步控制信号由有效电平向无效电平转换的时刻,在该时刻破坏数据保持时间会导致亚稳态;在异步控制信号由无效电平向有效电平转换的时刻破坏数据的保持时间不会造成亚稳态。

从上述定义,可以得到和保持时间检查类似的公式。

1)寄存器-寄存器(Register-to-Register)路径检查:

Removal Slack Time = Data Arrival Time – Data Required Time

Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μtCO of Source Register + Register to Register Delay Data Required Time = Clock Arrival Time + μtH

Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register

2)输入引脚-寄存器(Pin-to-Register)路径检查:

Removal Slack Time = Data Arrival Time – Data Required Time

Data Arrival Time = Launch Edge + Input Minimum Delay of Pin + Minimum Pin to Register Delay

Data Required Time = Clock Arrival Time + μtH

Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register

report_timing -from [get_ports async_rst] -to [get_registers reg2] -removal -npaths 1 -panel_name "Report Timing"

五、多周期路径(Multicycle Paths)检查:

在上述的建立、保持时间检查中,都假设数据从Launch edge开始发送,在Latch edge被捕获;Launch edge和Latch edge是相邻最近的一对时钟沿。在多周期路径检查中,仍然采用Launch edge和Latch edge的概念;但是Launch edge和Latch edge不再是相邻的一对时钟沿,而是间隔一定时钟周期的一对时钟沿,间隔的时钟周期个数由用户指定。

在同步逻辑设计中,通常都是按照单周期关系考虑数据路径的。但是往往存在这样的情况:一些数据不需要在下一个时钟周期就稳定下来,可能在数据发送后几个时钟周期之后才起作用;一些数据经过的路径太复杂,延时太大,不可能在下一个时钟周期稳定下来,必须要在数据发送后数个时钟周期之后才能被采用。针对这两种情况,设计者的设计意图都是:数据的有效期在以Lauch edge 为起始的数个时钟周期之后的Latch edge。这一设计意图不能够被时序分析工具猜度出来,必须由设计者在时序约束中指定;否则,时序约束工具会按照单周期路径检查的方式执行,往往会误报出时序违规。

不设置多周期路径约束的后果有两种:一是按照单周期路径检查的结果,虚报时序违规;二是导致布局布线工具按照单周期路径的方式执行,虽然满足了时

序规范,但是过分优化了本应该多个周期完成的操作,造成过约束

(Over-Constrain)。过约束会侵占本应该让位于其他逻辑的布局布线资源,有可能造成其他关键路径的时序违规或时序余量变小。

在多周期路径的建立时间(Setup Time)检查中,TimeQuest会按照用户指定的周期数延长Data Required Time,放松对相应数据路径的时序约束,从而得到正确的时序余量计算结果;在保持时间(Hold Time)检查中,TimeQuest 也会相应地延长Data Required Time,不再按照单周期路径的分析方式执行(不再采用Launch edge最近的时钟沿,而是采用Latch edge最近的时钟沿),这就需要用户指定保持时间对应的多周期个数。TimeQuest计算Hold Time的缺省公式等同于PrimeTime。PrimeTime会采用建立时间检查对应时钟沿的前一个时钟沿进行保持时间检查,并多会造成保持时间检查违规,需要用户指定保持时间检查对应的时钟沿为Launch edge最近的时钟沿。(西电出版社《数字IC系统设计》p189)

TimeQuest缺省的Hold Time检查公式是需要用户修改的——针对Setup Time多周期路径的设置也会影响到Hold Time的检查。究其原因,多周期路径是为了解决信号传播太慢的问题,慢到一个周期都不够,所以要把Setup Time 的检查往后推几个周期——扩大Setup Time检查的时间窗口。而Hold Time检查信号是否传播得太快,如果把检查时刻往后推,就缩小了Hold Time检查的时间窗口。

“信号跳变抵达窗口”:对Latch寄存器来说,从previous时钟对应的Hold Time开始,到current时钟对应的Setup Time结束。

“信号电平采样窗口”:对Latch寄存器来说,从current时钟对应的Setup Time 开始,到current时钟对应的Hold Time结束。

Launch寄存器必须保证驱动的信号跳变到达Latch寄存器的时刻恰好处于“信号跳变抵达窗口”内,才能保证不破坏Latch寄存器的“信号电平采样窗口”。

时序检查的目的就是确认信号跳变发生在“信号跳变抵达窗口”内,而不会发生在“信号电平采样窗口”内。

多周期路径的设置是通过延后Setup Time检查的时刻,扩大了“信号跳变抵达窗口”,放松了时序约束。通过窗口的概念,也很容易理解延后Hold Time,就会缩小“信号跳变抵达窗口”。

背景资料:

Specify multicycle set-up paths constraints riple

Specifying multicycle hold requirements constraints riple

随文附上一个,可以采用上面的命令执行并观察结果。该实例改编自Altera的multicycle_exception。

该实例由两个级联寄存器构成。

学习时序分析一定要学会察看Technology Map Viewer。

下一篇是我在使用中遇到的一个“异常现象”——负的寄存器建立时间。

六 . 取值为负数的建立时间

1)寄存器-寄存器(Register-to-Register)路径检查:

Clock Setup Slack = Data Required Time – Data Arrival Time

相关文档
相关文档 最新文档