高速FPGA时序约束设计分析(2)

高速FPGA时序约束分析:时序约束语法规则(1)

高速FPGA调试时都会面临时序违约的问题,而稳定的时序能够使得系统再高低温以及异常环境下稳定可靠运行,因此时序约束不仅仅是为了满足系统高速运行的要求,也为了满足系统可靠运行。时序约束有下面常用的约束语法有一下几种。

(1)FROM-THRU-TO约束。

(2)PERIOD约束。

(3)TIMESPEC约束。

(4)TNM约束。

(5)TNM_NET约束。

(6)TPSYNC约束。

(7)TPTHRU约束。

(8)TSidentifier约束。

(9)OFFSET IN约束。

(10)OFFSET OUT约束。

(1)FROM-THRU-TO约束
这个约束一般与周期(period)约束配合使用。对于同步元件路径,FROM-THRU-TO约束用于控制路径的建立和保持时间。该约束起始于一个源时序分组,经过中间的特定中间点,终止于一个目标时序分组。源时序分组和目标时序分组既可以用户自己定义也可以预定义。在使用THRU特性时,必须先使用TPTHRU语句定义中间路径。

例如:TIMESPEC“ TS_MY_PathB ”= FROM “my_scr_grp” THRU “my_dst_pt” TO “my_dst_grp” 13.5 ns DATAPATHONLY ;

表示约束名为TS_MY_PathB的约束是从源时序分组“my_scr_grp”到“my_dst_grp”时序分组路径延时约束为13.5ns.

TIMESPEC “TS_tx_fifo_rd_to_wr_0” = FROM “tx_fifo_rd_to_wr_0” TO
“u_rgmii_inf/u_rgmii_locallink/*eth_ip_tx_clk0” 8 ns DATAPATHONLY;

表示约束名为TS_tx_fifo_rd_to_wr_0的约束是从源时序分组tx_fifo_rd_to_wr_0到u_rgmii_inf/u_rgmii_locallink/*eth_ip_tx_clk0时序分组路径延时约束为8ns.

TIMESPEC “TS_MC_RD_DATA_SEL” = FROM “TNM_RD_DATA_SEL” TO FFS "8ns;

表示约束名为TS_MC_RD_DATA_SEL的约束是从源时序分组TNM_RD_DATA_SEL到该路径上的所有的CLB和IOB沿触发的触发器、LUT移位寄存器、DDR寄存器时序分组路径延时约束为8ns.

TS_MC_RD_DATA_SEL =MAXDELAY FROM TIMEGRP “TNM_RD_DATA_SEL” TO TIMEGRP “FFS”
TS_SYS_CLK * 4;

表示约束名为TS_MC_RD_DATA_SEL的约束是从源时序分组TNM_RD_DATA_SEL到该路径上的所有的CLB和IOB沿触发的触发器、LUT移位寄存器、DDR寄存器时序分组路径最大延时约束为TS_SYS_CLK* 4(5*4=20ns).这个可以在静态时序分析中可以查看系统编译后约束的时序报告。可以查看到约束名为TS_MC_RD_DATA_SEL的约束报告如下:

Timing constraint:
TS_MC_RD_DATA_SEL = MAXDELAY FROM TIMEGRP “TNM_RD_DATA_SEL” TO
TIMEGRP “FFS” TS_SYS_CLK * 4;

For more information, see From:To (Multicycle) Analysis in the Timing Closure User Guide (UG612).

208 paths analyzed, 208 endpoints analyzed, 0 failing endpoints

0 timing errors detected. (0 setup errors, 0 hold errors)

Maximum delay is 5.229ns.


Paths for end point u_hight_pass/u_ddr2_core/u_ddr2_top_0/u_mem_if_top/u_usr_top/u_usr_rd/rd_data_out_rise_7
(SLICE_X33Y75.B6), 1 path


Slack (setup paths): 14.771ns (requirement - (data path - clock path skew + uncertainty))

Source: u_hight_pass/u_ddr2_core/u_ddr2_top_0/u_mem_if_top/u_phy_top/u_phy_io/u_phy_calib/gen_rd_data_sel[0].u_ff_rd_data_sel
(FF)

Destination: u_hight_pass/u_ddr2_core/u_ddr2_top_0/u_mem_if_top/u_usr_top/u_usr_rd/rd_data_out_rise_7
(FF)

Requirement: 20.000ns

Data Path Delay: 4.542ns (Levels of Logic = 2)

Clock Path Skew: -0.488ns (2.811 - 3.299)

Source Clock: u_hight_pass/u_ddr2_core/clkdiv0
rising at 0.000ns

Destination Clock: u_hight_pass/ddr_clk_in rising at 5.000ns

Clock Uncertainty: 0.199ns

Clock Uncertainty: 0.199ns ((TSJ^2 + DJ2)1/2) / 2 + PE

 Total System Jitter (TSJ):  0.070ns 

 Discrete Jitter (DJ):       0.140ns 

 Phase Error (PE):           0.120ns

从上面的报告中可以看出这个时序约束路径延时最大要求是在20ns以内,在实际的布局布线后路径延时是4.524ns,时钟偏斜是-0.488ns,时钟不确定性是0.199ns,根据公式(requirement - (data path - clock path skew + uncertainty)可以得到路径时序裕量是14.771ns.在静态时序后面会把数据最大路径和最小路径都进行分析。在不满足时序约束时可以通过优化最大或者最小路径来满足时序要求。

因此FROM-THRU-TO约束规则是比较常用的约束规则,特别是针对某一特定路径的调节。下列组合是合法的FROM-THRU-TO约束:

FROM -TO

FROM-THRU-THRU -THRU -TO

FROM-THRU

THRU -TO

其实这里的THRU中间模块数量是没有限制的,源点、中间点和目标点可以是一个网络、一个实体模块、一个硬件原语、一个宏、一个端口或者时序分组。

然而针对特定的模块或者单元,官方给出了固定的字符代表那些模块和单元。FROM-TO支持下面的预定义组:

(1)CPUS:PPC405处理器。

(2)DSPS:DPS45。

(3)FFS:所有的CLB和IOB沿触发的触发器、LUT移位寄存器、DDR寄存器。

(4)HSIOS:GT和GT10。

(5)LATCHES:所有CLB和IOB电平敏感的触发器。

(6)MULTIS:所有的同步/异步乘法器。

(7)PADS:所有I/O引脚。

(8)RAMS:所有CLB LUT RAM。

(9)BRAMS_PORTA,BRAMS_PORTB:所有双端口BRAM的端口A或B。

(2)PERIOD约束
周期约束是最基本的时序约束和综合约束。一个时钟周期约束检查与目标元件时序分组相关的时钟域内所有同步元件之间的时延。时序分组可能包括跨时钟域路径。

例如:TIMESPEC
“TS_SYS_clk_100m_i” = PERIOD “SYS_clk_100m_i” 10 ns HIGH 50%;

表示表示约束名为TS_SYS_clk_100m_i的约束是"SYS_clk_100m_i"信号定义时钟周期为10ns,高电平为50%。

TS_u_clk_rst_gen_u_clk_pll1_CLKOUT2_BUF= PERIOD TIMEGRP “u_clk_rst_gen_u_clk_pll1_CLKOUT2_BUF”
TS_SYS_clk_100m_i PHASE 5 ns HIGH 50%;
表示约束名为TS_u_clk_rst_gen_u_clk_pll1_CLKOUT2_BUF的约束是" u_clk_rst_gen_u_clk_pll1_CLKOUT2_BUF "信号定义时钟周期为5ns,高电平为50%。

在系统布局布线结束后的静态时序分析中可以看到该约束共有16个路径进行分析,8个端点路径进行分析。这个约束路径的起始点是u_clk_rst_gen/clk_rst_n(FF),终点是adc_io[4].ODDR_i1_2(FF)。关键的是建立实际裕量的1.211ns.因此可以满足约束的要求。具体的信息可以看下面的详细分析。

Timing constraint:TS_u_clk_rst_gen_u_clk_pll1_CLKOUT2_BUF = PERIOD TIMEGRP
“u_clk_rst_gen_u_clk_pll1_CLKOUT2_BUF” TS_SYS_clk_100m_i PHASE 5 ns HIGH 50%;

For more information, see Period Analysis in the Timing Closure User Guide (UG612).

16 paths analyzed, 8 endpoints analyzed, 0
failing endpoints

0 timing errors detected. (0 setup errors, 0
hold errors, 0 component switching limit errors)

Minimum period is 7.578ns.


Paths for end point adc_io[4].ODDR_i1_2
(OLOGIC_X1Y182.SR), 2 paths


Slack (setup path): 1.211ns
(requirement - (data path - clock path skew + uncertainty))

Source: u_clk_rst_gen/clk_rst_n(FF)

Destination: adc_io[4].ODDR_i1_2(FF)

Requirement: 5.000ns

Data Path Delay: 3.355ns (Levels of Logic = 1)

Clock Path Skew: -0.229ns (2.970 - 3.199)

Source Clock: pll_25m_i rising at 0.000ns

Destination Clock: pll_25m_i_180 rising at 5.000ns

Clock Uncertainty: 0.205ns

Clock Uncertainty: 0.205ns ((TSJ^2 + DJ2)1/2) / 2 + PE

 Total System Jitter (TSJ):  0.070ns 

 Discrete Jitter (DJ):       0.154ns 

 Phase Error (PE):           0.120ns

从上面可以看出满足了建立时间的要求,由于数据传输延时较长,这样肯定满足保持时间的要求,但若传输延时变大的话就会可能不满足建立时间的要求。因此这个路径如果要进一步优化的话需要减小传输延时。减小传输延时的方法是切流水,也就是把组合逻辑优化为时序逻辑。

(3)TIMESPEC约束
TIMESPEC(timingsepecification)使用TS占位符定义时序属性,成为TS属性。时序属性可以供其他时序定义语句调用。每个TS属性都以TS开头,后面可以使用字母、数字和下划线。

这个约束就像是一个宏定义似的,是对约束在特定路径的端点定义TS属性的语句。

TIMESPEC"TS_rgmii_client_clk_tx0" =PERIOD “rgmii_client_clk_tx0” 8 ns HIGH 50 %;

这个语句的表示为TS属性的约束名为TS_rgmii_client_clk_tx0的约束,约束信号起始点为rgmii_client_clk_tx0的信号时钟周期为8ns,其中高电平为50%。

在source_group和dest_group必须是一下几种时序分组之一:

(1)预定义时序分组;

(2)以及使用TNM定义好时序分组;

(3)以及使用TIMEGRP定义好的时序分组;

(4)TPSYNC时序分组;

示例如下:

NET"u_rgmii_inf/*RX_CLIENT_CLK_0" TNM_NET = “clk_client_rx0”;TIMEGRP “*rgmii_client_clk_rx0” = “clk_client_rx0”;

TIMESPEC"TS_rgmii_client_clk_rx0" =PERIOD “rgmii_client_clk_rx0” 7.5 ns HIGH 50 %;

这个是对信号"u_rgmii_inf/*RX_CLIENT_CLK_0"进行周期约束,这个是先对信号进行分组,分组属性为clk_client_rx0,然后再对这个这个信号组进行周期约束。

NET"u_rgmii_inf/u_rgmii_locallink/v5_emac_block_inst/*rgmii_txd_0<?>"TNM = “rgmii_tx_0”;

NET"u_rgmii_inf/u_rgmii_locallink/v5_emac_block_inst/*rgmii_tx_ctl_0"TNM = “rgmii_tx_0”;

NET"u_rgmii_inf/u_rgmii_locallink/v5_emac_block_inst/*rgmii_txc_0" TNM = “rgmii_tx_0”;

TIMEGRP"rgmii_tx_0" OFFSET = OUT AFTER “u_rgmii_inf/*rgmii_txc” REFERENCE_PIN
"u_rgmii_inf/u_rgmii_locallink/v5_emac_block_inst/*rgmii_txc_0"RISING;

TIMEGRP"rgmii_tx_0" OFFSET = OUT AFTER “u_rgmii_inf/*rgmii_txc” REFERENCE_PIN
"u_rgmii_inf/u_rgmii_locallink/v5_emac_block_inst/*rgmii_txc_0"FALLING;

上面是Xilinx官方提供的网络MAC IP的发送数据IO约束。

(4)TNM约束
TNM(timingname)为设计元件指定时序属性,是基本的分组约束。所有具有该属性名的元件均划分为同一个时序分组,以便于对他们使用同一种时序约束。TNM可以基于预定义时序分组(如FF、RAM、LATCH、PAD等)简化时序约束。

TNM约束语法为NET"net_name" TNM = “property_value”;当应用于引脚网络时不能穿过IBUF,但IBUF的输出端可以传播到IBUF输出端的所有同步原件。这个语句实质上就是定义一个信号的传输线的定义,不能穿越FF、RAMS、PADS、CPUS、HSIOS、MULT、LATCHES原件。

NET"u_rgmii_inf/u_rgmii_locallink/v5_emac_block_inst/*rgmii_rxd_0<?>" TNM = “rgmii_rx_0”;

NET"u_rgmii_inf/u_rgmii_locallink/v5_emac_block_inst/*rgmii_rx_ctl_0" TNM = “rgmii_rx_0”;

TIMEGRP"rgmii_rx_0" OFFSET = IN 1 ns VALID 2 ns BEFORE"u_rgmii_inf/*rgmii_rxc_0" RISING;

TIMEGRP"rgmii_rx_0" OFFSET = IN 1 ns VALID 2 ns BEFORE"u_rgmii_inf/*rgmii_rxc_0" FALLING;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值