如何约束 既做时钟又做数据的信号
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何约束 既做时钟又做数据的信号相关的知识,希望对你有一定的参考价值。
参考技术A 特权同学的《SDRAM时钟相移估算》针对SDRAM的相移设置做了一些介绍,也列举了一个活生生的例子进行讲解。很多朋友在实际应用中即便对SDRAM的时序模型熟悉了,当可能仍然不知道在TimeQuest这个工具上如何进行时序约束和分析,尤其对于这个SDRAM专用时钟的约束分析。本文就是要和大家来探讨实际应用中如果使用TimeQuest进行SDRAM时钟约束。这个实例中,PLL的输出时钟clk1为100MHz,相移为0ns。PLL的输出时钟clk2为100MHz,相移为1.5ns(具体为什么不是本文讨论的重点,可以参考《SDRAM时钟相移估算》)。同时,这个clk1作为FPGA内部SDRAM控制器的时钟,而clk2输出到外部连接到SDRAM的时钟管脚。为了说明问题,我们首先会给这个作为SDRAM时钟的sdram_clk信号使用Set Maximum Delay与Set Minimum Delay添加时序约束:
set_max_delay -from [get_clocks sys_ctrl:uut_sys_ctrl|PLL_ctrl:uut_PLL_ctrl|altpll:altpll_component|_clk2] -to [get_ports sdram_clk] 5.000
set_min_delay -from [get_clocks sys_ctrl:uut_sys_ctrl|PLL_ctrl:uut_PLL_ctrl|altpll:altpll_component|_clk2] -to [get_ports sdram_clk] 1.000
该约束的意义就是希望PLL的输入时钟_clk2到sdram_clk管脚上的延时在1ns~5ns。然后我们得到的Setup slack分析结果如图1所示。
图1
_clk2到sdram_clk路径延时为1.567ns。
下一步我们要产生一个名为SDRAMCLK的生成时钟,用于SDRAM数据、地址等信号的时序约束。这个生成时钟的约束有讲究,却并不难。如图2所示,命名为SDRAMCLK,时钟源(Source)选择PLL的输出时钟clk2,目的时钟(Targets)选择连接到SDRAM上的sdram_clk。
图2
约束完成后产生约束脚本如下:
create_generated_clock -name SDRAMCLK -source [get_nets uut_sys_ctrl|uut_PLL_ctrl|altpll_component|_clk2] -master_clock sys_ctrl:uut_sys_ctrl|PLL_ctrl:uut_PLL_ctrl|altpll:altpll_component|_clk2 [get_ports sdram_clk]
然后就可以使用生成时钟SDRAMCLK约束相关的数据总线或地址总线。例如可以对数据信号进行约束:
set_input_delay -add_delay -max -clock [get_clocks SDRAMCLK] 4.500 [get_ports sdram_data[0]]
set_input_delay -add_delay -min -clock [get_clocks SDRAMCLK] -2.000 [get_ports sdram_data[0]]本回答被提问者和网友采纳
DC——时钟约束
基本概念
建立时间Tsetup:时钟有效沿到来之前,数据需要保持稳定的时间,否则触发器无法锁存数据。
保持时间Thold:在时钟有效沿到来之后,数据需要保持稳定的时间,否则触发器无法锁存数据。
亚稳态semi-stable state:在数据的建立时间和保持时间中对信号进行采样,导致输出无法预测的状态。
时序路径及约束
时序路径
时序路径是点到点的数据通路,数据沿时序路径进行传输,每条时序路径有一个起点和终点。时序路径可以分为四条:输入端口到寄存器,寄存器到寄存器,寄存器到输出端口,输入端口到输出端口。详见《静态时序分析的基本概念和目的——3时序路径与关键路径》https://www.cnblogs.com/lizhiqing/p/12704545.html。
时序路径约束目的:约束时序路径是为了满足寄存器的建立时间和保持时间
路径2(寄存器到寄存器)约束
数据从FF1的D端口传输至FF2的D端口,主要经历的时间是触发器的翻转时间/转换延时Tcq、寄存器与寄存器之间的组合逻辑延迟Tco、连线延迟等。
FF2的建立时间
要求:数据经过上述延时(触发器的翻转时间/转换延时Tcq、寄存器与寄存器之间的组合逻辑延迟Tco、连线延迟)后到达FF2的D端口再加上FF2的建立时间需要小于一个时钟周期。
否则,若延时过大,在下一个cycle的有效沿到达时,FF1的数据仍在传输,则上一cycleFF1的输入数据无法在本cycle传递给FF2,数据可能无法满足建立时间导致无法更新。
对时钟进行建模后,上述延时(触发器的翻转时间/转换延时Tcq、寄存器与寄存器之间的组合逻辑延迟Tco、连线延迟)所允许的最大范围被确定。通过对时钟进行建模后,该路径的延时也被确定,DC将从单元库中选择单元来满足这些延时的约束,如果性能最好的单元仍无法满足建立时间要求,则DC会报错,需要重新修改设计(修改约束或修改代码)。
FF2的保持时间
要求:数据经过上述延时后到达FF2的D端不能小于某个值,否则会导致FF2采样到FF1在本cycle的信号,导致FF2原应保存的FF1上个cycle的信号产生亚稳态。
保持时间一般能够满足,即传输延时一般大于触发器的保持时间;即使无法满足,可以在后盾版图设计的时候采用在路径添加缓冲器来增加延时。因此一般只注意建立时间,而不关注保持时间。
定义时钟命令:
定义时钟(虚拟时钟除外),必须定义时钟周期(-period,下列表达式中10为一个周期的时长)和时钟源(get_port,下列表达式中clk为设计中的时钟端口);同时还允许定义可选项(option),如占空比(duty cycle),时钟偏移(offset/skew)和时钟名字(clock name)等,可通过 man create_clock查看相关命令。
create_clock -period 10 [get_ports clk]
路径1约束
路径3约束
路径4约束
####约束的作用:
对模块
##基本时序约束
###时序路径与关键路径
以上是关于如何约束 既做时钟又做数据的信号的主要内容,如果未能解决你的问题,请参考以下文章