如何约束 既做时钟又做数据的信号

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约束


####约束的作用:
对模块
##基本时序约束
###时序路径与关键路径

以上是关于如何约束 既做时钟又做数据的信号的主要内容,如果未能解决你的问题,请参考以下文章

亚稳态及跨时钟域的处理办法

对哪些信号需要进行约束 FPGA

生产环境中nginx既做web服务又做反向代理

DC——时钟约束

DC——时钟约束

在FPGA中,如何实现一个时钟信号的可控延时? (用高频50MHZ的时钟去延时一个22KHZ的信号)