FPGA设计时序约束六、设置最大/最小时延

目录

一、背景

二、Max/Min_delay约束

2.1 约束设置参数

2.2 约束说明

三、工程示例

3.1 工程代码

3.2 时序报告

四、参考资料


一、背景

    在设计中,有时需要限定路径的最大时延和最小时延,如没有特定时钟关系的异步信号,但需要限制最大时延和最小时延,也可以对端口到端口(中间无寄存器)的路径设置最大时延和最小时延,设置最大时延和最小时延会影响当前的setup和hold时序分析。

二、Max/Min_delay约束

    设置路径最大时延和最小时延的命令为set_max_delay,set_min_delay,可在Timing Constraints窗口进入Exceptions中,选择Set Maximum Delay或Set Minimum Delay,即为选择最大时延或最小时延。

 

2.1 约束设置参数

以设置最大时延为例,双击Set Maximum Delay进入设置窗口

Targets设置

 

Specify path delay:设置路径最大时延值,可为正整数或负整数

From:设置路径的起点,对象可以是Clocks,Cells,Cell pins,I/O ports

Through:设置路径的中间经过点,对象可以是Net,Cells,Cell pins

To:设置路径的终点,对象可以是Clocks,Cells,Cell pins,I/O ports

Options设置

 

Rise/Fall:勾选后可设置最大时延只对上升沿触发或下降沿触发的路径有效,未勾选时不区分边沿触发。

Set Maximum...ignored):勾选后设置的时延约束只对数据路径有效,时钟偏斜和hold检查会被忽略,即等效于该路径也设置了set_false_path -hold约束,此时如果约束中设置了set_min_delay约束也不会生效。并且该设置不能用于set_min_delay约束中。

Remove...path delays:勾选后,如果设置的约束路径上有其他时例外约束(如false_path,multicycle约束,最大最小时延约束都将被移除)

2.2 约束说明

    对于输入输出逻辑的约束,将不会使用set_max_delay/set_min_delay,对于输入端口到第一级寄存器或最后一级寄存器到输出端口的逻辑路径,通常使用set_input_delay

/set_output_delay约束,set_max_delay/set_min_delay通常用于约束输入端口和输出端口间的纯组合逻辑路径。

    set_max_delay另一个常用的场景是没有时钟关系的异步信号,但需要设置最大时延。两个异步时钟路径可以使用set_clock_group或set_false_path,从而不会进行时序分析。当异步时钟间的设计合理,如FIFO中的两级同步寄存器,要放宽约束,保证两个时钟间的路径延时符合实际情况,就需要使用set_max_delay。

    在多比特跨时钟域(CDC)场景中,比特之间的偏斜必须在一定要求时间内,虽然偏斜可以通过set_bus_skew来约束,但必须确保两个时钟域间的时延不能太大。此时可以通过约束set_max_delay -datapath_only代替set_false_path/set_clock_groups。

    如果对于两个时钟域间的部分路径或全部路径的最大时延必须明确时,就必须使用set_max_delay -datapath_only约束。这种场景下,set_clock_groups不能用来定义两个时钟作为异步时钟,因为从约束的优先级角度看它将取代set_max_delay。其他跨时钟域路径就必须联合约束set_false_path或set_max_delay constraints.
 2.3 路径分段

    不同于约束文件XDC中的其他约束,在设置最大时延和最小时延中,参数-from和-to选项为设置约束的起点和终点,在设置时,有些起点和终点对于约束来说是无效的。当设置了一个无效的起点时,为了让节点成为一个有效的起点,时序分析工具会阻止时序路径通过该节点。

以如下约束为例,最大延时约束的起点为有效起点

set_max_delay 5 -from [get_pins FD1/C]

 

如果约束设置到FD1/Q,时序分析工具将会断开从C->Q的路径,从而使得引脚Q为有效的起点。这种为了创建有效的起点而将时序路径断开的做法称为路径分段,路径分段对最大时延和最小时延都会有影响,同时也会影响经过这些节点(FD1/Q,FD1/C)的时序约束。

set_max_delay 5 -from [get_pins FD1/Q]

 

路径分段的影响

有序设置最大/最小时延导致路径分段,对于从起点FD1/Q的时序路径将无启动时钟,因为终点的时钟偏斜将会考进来。因此,将有可能导致大的时钟偏斜,如下图所示。

 

在路径分段后,将没有默认的hold要求时间,如果没有选择-datapath_only选项,使用set_min_delay命令设置hold要求时间。正式由于分段带来风险,出现路径分段时将会有告警提示。

如果一定要将输出FD1/Q最为约束的起点,而又不想去考虑时钟偏斜的影响,则可以勾选-datapath_only来解决。

set_max_delay 5 -from [get_pins FD1/C] -datapath_only

类似的,如果设置了一个无效的终点时,为了该节点成为有效的终点,也会出现路径分段,

以LUTA/O为终点为例

set_max_delay 5 -from [get_pins LUTA/O]

 

为了使得LUTA/O为有效的终点,时序分析工具将会断开LUTA/O后面的路径,因此,所有经过LUTA/O的setup/hold路径都会受影响,对于REGA/C为起点和LUTA/O为终点的路径,时钟偏斜将会很大。

在下图中,设置约束

set_max_delay 6 -from [get_pins LUTA/O] -to [get_pins REGB/D]

由于LUTA/O不是有效的起点,将在LUTA/O处出现路径分段,LUTA/I0到LUTA/O的时序路径将断开。尽管约束只设置在了LUTA/O和REGB/D间,REGA/C到REGC/D的路径也受影响被断开。

 

路径分段与时序例外

路径分段也可能导致时序例外的优先级告警,特别是对于set_clock_groups和set_max_delay,如以下两个场景

场景1 

set_max_delay <ns> -datapath_only -from <instance> -to <instance>

最大延迟约束设置在两个instance中,如果instance设有set_clock_groups -asynchronous约束,当vivado选择instance的一个有效的起点时,set_max_delay约束将会被覆盖

场景2

set_max_delay <ns> -datapath_only -from <pin> -to <pin | instance>

约束是从pin引脚到inst的引脚,此时,如果instance设有set_clock_groups -asynchronous约束,set_max_delay约束将不会被覆盖。原因是路径分段将让路径起点pin不再被认为是第一个时钟域所启动的起点,因此set_max_delay不会被覆盖,从而约束有效。

三、工程示例

3.1 工程代码

以跨时钟域路径ff1_reg/C到ff2_reg/D的路径为例,设计代码

module timing(d1,d2,clk1,clk2,ce,ff2);
input d1,d2,clk1,clk2,ce;
output ff2;
reg ff1,ff2;
wire comb;
always@(posedge clk1,negedge ce)
begin
    if(!ce)
    begin
    ff1<=0;
    end
    else begin
        ff1<=d1;
    end
end
assign comb=ff1&d2;
always@(posedge clk2,negedge ce)
begin
    if(!ce)
    ff2<=0;
    else begin
        ff2<=comb;
    end
end
endmodule

网表连接

 

约束设置

set_max_delay -from [get_pins ff1_reg/C] -to [get_pins ff2_reg/D] 5.000  //设置clk的周期
set_min_delay -from [get_pins ff1_reg/C] -to [get_pins ff2_reg/D] 2.000	  //设置clk2的周期
create_clock -period 10.000 -name clk1 -waveform {0.000 5.000} [get_ports clk1]   //max_delay值为5
create_clock -period 7.000 -name clk2 -waveform {0.000 3.500} [get_ports clk2]   //min_delay值为2

3.2 时序报告

在report timing summary中,查看inter-clock paths中查看跨时钟域路径,在setup分析中,setup requirement即为设置的set_max_delay值5ns。

 

hold分析的requirement值为set_min_delay值2ns

 

在目的时钟路径上,时延值直接加上设置的时延值

 

 

总结:set_max_delay设置的值即为该路径的setup Requirments值,set_min_delay设置的值即为该路径的holdup Requirments值

四、参考资料

用户手册:ug903-vivado-using-constraints-en-us-2022.2.pdf

链接:https://pan.baidu.com/s/17AK_-J4wRXiFLtLTorlrwg?pwd=mylt 

提取码:mylt  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include <REGX52.H> #include "intrins.h" //_nop_();延时函数用 #define uchar unsigned char #define uint unsigned int sbit SO = P3^6; //P3.6口与SO相连 sbit SCK = P3^4; //P3.4口与SCK相连 sbit CS = P3^5; //P3.5口与CS相连 sbit wx = P2^6; sbit dx = P2^7; const unsigned char DevID = 1; //本机设备ID unsigned char buffer; //串口接收缓冲区 unsigned char rcv_buffer[20]; unsigned char send_buffer[20]; unsigned char flag_ok = 0; //接收完毕的标识 unsigned int MAX6675_Temp; unsigned char Flag_connect; unsigned char CRCH,CRCL; unsigned char wd[2]; //wd[]:BCD码的温度 unsigned char flag_dis; //显示刷新的标识 unsigned char dis[4] = { 0x00, 0x00, 0x00,0x00 }; unsigned char code SMG[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e}; unsigned int MAX6675_ReadReg(void) { unsigned char i; unsigned int dat; i = 0; dat = 0; CS = 0; SCK = 0; for(i=0; i<16; i++) //get D15-D0 from 6675 { SCK = 1; dat = dat<<1; if( SO==1 ) dat = dat|0x01; SCK = 0; } CS = 1; return dat; } /* * 功 能:延时,若干毫秒 * 参 数:毫秒数 * 返回值:无 */ void DelayMs(unsigned int i) //一个延时函数,这个函数在11.0592M晶振下的延时时间大概为1ms { unsigned int j,k; for(j=i; j>0; j--) for(k=114; k>0; k--); } /* * 功 能:数码管在指定的位置显示指定的字符 * 参 数:place:要显示的位置,num:要显示的字符 * 返回值:无 */ void SMG_DisChar(unsigned char place, unsigned char num) { unsigned char i; i = 0x80 >> place; //根据显示位置选择相应的数码管 P0 = SMG[num]; //发送要显示的段码 dx = 1; dx = 0; P0 = i; //发送要显示的位码,只显示一位数字 wx = 1; wx = 0; DelayMs(1); } void Display(unsigned int temp) { if(Flag_connect==0) //Flag_connect为0 表示热电偶已连接,这时显示温度 { if(temp > 999) { SMG_DisChar(3,temp/1000); } if(temp > 99) { SMG_DisChar(2,(temp00)/100); } if(temp > 9) { SMG_DisChar(1,(temp/10)); } SMG_DisChar(0,temp); } else //Flag_connect为1表示 热电偶未连接,这时显示FFFF { SMG_DisChar(3, 0x0F); SMG_DisChar(2, 0x0F); SMG_DisChar(1, 0x0F); SMG_DisChar(0, 0x0F); } } void main(void) { unsigned char cnt = 11; unsigned int t; while(1) { t=MAX6675_ReadReg(); Flag_connect=t&0x04; //读出数据的D2位是热电偶掉线标志位,该位为1表示掉线,该位为0表示连接 Flag_connect=Flag_connect>>2; //MAX6675是否在线 t = t<<1; //读出来的数据的D3~D14是温度值 t = t>>4; MAX6675_Temp = t/4; //测得的温度单位是0.25,所以要乘以0.25(即除以4)才能得到以度为单位的温度值 for(t=0; t<200; t++) //显示温度 { Display(MAX6675_Temp); } } }
Dependency Walker 可以自由查看任何32位 或 64位 Windows 程序模块的内部层次依赖关系与结构关系 (包括exe, dll, ocx, sys, 等文件),并通过树状图示的方式显示。 本资源为32位系统支持,其他位宽程序请查看下面官网下载 http://www.dependencywalker.com/ (以下不做翻译) For each module found, it lists all the functions that are exported by that module, and which of those functions are actually being called by other modules. Another view displays the minimum set of required files, along with detailed information about each file including a full path to the file, base address, version numbers, machine type, debug information, and more. Dependency Walker is also very useful for troubleshooting system errors related to loading and executing modules. Dependency Walker detects many common application problems such as missing modules, invalid modules, import/export mismatches, circular dependency errors, mismatched machine types of modules, and module initialization failures. Dependency Walker runs on Windows 95, 98, Me, NT, 2000, XP, 2003, Vista, 7, and 8. It can process any 32-bit or 64-bit Windows module, including ones designed for Windows CE. It can be run as graphical application or as a console application. Dependency Walker handles all types of module dependencies, including implicit, explicit (dynamic / runtime), forwarded, delay-loaded, and injected. A detailed help is included. Dependency Walker is completely free to use. However, you may not profit from the distribution of it, nor may you bundle it with another product.
手把手课堂: Xilinx FPGA设计时序约束指南 Xilinx FPGA设计时序约束指南是一份详细的技术指南,旨在帮助设计人员在Xilinx FPGA设计过程中正确地应用时序约束。该指南提供了关于时序约束的基础知识和最佳实践,并详细介绍了如何使用Xilinx工具来设置和验证时序约束。 在设计FPGA时,时序约束对于确保电路操作的正确性和可靠性至关重要。时序约束指定了电路中不同信号之间的时序关系,例如时钟和数据信号之间的关系。通过正确地设置时序约束,可以确保电路在特定的时钟频率下工作正常,并且可以防止出现时序冲突和故障。 Xilinx FPGA设计时序约束指南首先介绍了时序约束的基本概念,包括时钟信号和数据路径的相关术语和特性。然后,指南详细解释了如何使用Xilinx工具(如Vivado)来设置时序约束,包括使用基于约束文件的约束方法和使用基于时序推导的约束方法。通过这些方法,设计人员可以根据设计需求和时序规范准确地定义时序约束。 此外,该指南还介绍了如何验证时序约束的正确性。通过使用Xilinx工具提供的时序分析功能,设计人员可以分析和优化电路的时序性能,确保设计满足指定的时序要求。指南还提供了一系列实际的案例研究和常见问题解答,帮助设计人员更好地理解和应用时序约束。 综上所述,Xilinx FPGA设计时序约束指南是设计人员在进行FPGA设计时的重要参考资料。通过使用该指南提供的指导和实践经验,设计人员可以更好地应用时序约束,确保电路的时序性能和可靠性,提高FPGA设计的成功率和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值