【Xilinx Vivado 时序分析/约束系列11】FPGA开发时序分析/约束-FPGA DDR-PLL接口的 input delay 约束优化方法

2023-11-10

目录

DDR-PLL 简述

实际操作

实际工程

顶层代码

PLL配置

添加时钟约束

添加 input delay 约束

添加 False Path

Setup Time

Hold Time

Multicycle约束

解决办法

PLL配置

发现问题

建立时间中

保持时间中

添加 False Path

 总结

往期系列博客


 

DDR-PLL 简述

在之前介绍了 DDR-Direct 的时序模型,也就是不带有 PLL 的普通时序模型,这节重点介绍带有 PLL 的模型,在SDR采样模型中也介绍到这两种时序模型,因此同样的也会带有 PLL 的时序模型,PLL 的功能也是一样,可以对时钟进行偏移,可以正偏移也可以负偏移,对应的是时钟的延时增大和减小。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

在分析时,默认PCB数据路径延迟Td_bd和PCB时钟路径延迟Tc_bd是一致的,因此在分析到达FPGA管脚的时钟和数据的状态时,只需要知道在上游器件的管脚的时钟和数据的状态,就可以对FPGA的时钟和数据进行约束,分析时钟和数据的相位关系即可。

以下是时序图,在DDR-Direct中有详细的分析,这里不多介绍。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

这种时序模型可以用在input带有 PLL 的情况和不带有 PLL 的情况,带有 PLL 情况下采样时钟相移为正时需要进行 false path + Multicycle 约束,否则分析报告不正确。

实际操作

这次依然以索尼的一款CMOS器件的手册为例。

时钟频率为54Mhz,即周期为18.519ns,半周期为9.259ns。在参数表中可以看到Max skew为2ns,因此,从图中可以看出第一个下降沿作为采样沿时的数据是由上一个上升沿发射出来的,此时图中箭头1所指的时刻为input delay的最小值,而箭头2的时刻为input delay的最大值;同样的,当第一个下降沿作为发射沿发射数据时,下一个上升沿作为采样沿,此时的input delay的最大、最小值分别为箭头3、4所指的时刻。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

这里需要注意的是,由于这里采用的是PLL对时钟进行移相,所以会产生一个新的时钟,因此要对时序约束工具进行多一些的操作,让时序工具能够正确的识别到,以免给出错误的时序报告。

实际工程

依然是 DDR-Direct 的实验工程,只需对顶层文件做个小改动。

顶层代码

将上一节加入的IDELAY2原语注释或删除,并例化PLL,将rx_clk作为输入,rx_clk_90作为输出。

module top_ioddr(
    input wire        rx_clk,
    input wire        rx_ctrl,
    input wire    [3:0] rx_dat,
  //tx
    output  wire    tx_clk,
    output  wire [3:0]  tx_d,
    output  wire    tx_dv,
    input	wire 	sdrclk,
    input	wire 	[3:0]	sdrdata,
    input	wire 	sdrden,
    input	wire 	sysclk,
    output	reg 	tout 	
	);
wire RDY;
wire rst;
wire rx_clk_90;
wire rx_en;
wire [7:0] rx_data;

reg tx_en1,tx_en2;
reg [7:0] tx_data1,tx_data2;
wire	sdrclk1;
assign rst =0;
//assign rx_clk_90 = rx_clk;

 IDELAYCTRL IDELAYCTRL_inst (
.RDY(RDY),       // 1-bit output: Ready output
.REFCLK(sysclk), // 1-bit input: Reference clock input
.RST(1'b0)        // 1-bit input: Active high reset input
);


clk_wiz_0 clk_gen0
   (
    // Clock out ports
    .clk_out1(rx_clk_90),     // output clk_out1
   // Clock in ports
    .clk_in1(rx_clk));      // input clk_in1

assign sdrclk1 = sdrclk;

always @(posedge rx_clk_90 or posedge rst) begin
	if (rst == 1'b1) begin
		tx_data1 <= 'd0;
	end
	else if (rx_en == 1'b1) begin
		tx_data1 <= rx_data+ rx_data -1;
	end
end

always @(posedge rx_clk_90 or posedge rst) begin
	if (rst == 1'b1) begin
		tx_data2 <= 'd0;
	end
	else if (tx_en1 == 1'b1) begin
		tx_data2 <= tx_data1+ tx_data1 -5;
	end
end

always @(posedge rx_clk_90 ) begin
	tx_en1 <= rx_en;
end

always @(posedge rx_clk_90 ) begin
	tx_en2 <= tx_en1;
end

	iddr_ctrl inst_iddr_ctrl
		(
			.rx_clk_90 (rx_clk_90),
			.rst       (rst),
			.rx_dat    (rx_dat),
			.rx_ctrl   (rx_ctrl),
			.rx_en     (rx_en),
			.rx_data   (rx_data)
		);

	oddr_ctrl inst_oddr_ctrl
		(
			.sclk    (rx_clk_90),
			.tx_dat  (tx_data2),
			.tx_en   (tx_en2),
			.tx_c    (rx_clk_90),
			.tx_data (tx_d),
			.tx_dv   (tx_dv),
			.tx_clk  (tx_clk)
		);

//sdr clock domain

reg [3:0] sdrdata_r1,sdrdata_r2;
reg 	sdrden_r1,sdrden_r2;

always @(posedge sdrclk1 ) begin
	{sdrdata_r2,sdrdata_r1} <= {sdrdata_r1,sdrdata};
end
always @(posedge sdrclk1 ) begin
	{sdrden_r2,sdrden_r1} <= {sdrden_r1,sdrden};
end

always @(posedge sdrclk1) begin
	if(sdrden_r2 == 1'b1) begin
		tout <= (&sdrdata_r1)|(&sdrdata_r2);
	end
	else begin
		tout <= (^sdrdata_r2);
	end
end

endmodule

PLL配置

设置向右相移30°,也就是1/12个周期,大约为1.543ns。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

对工程布局布线,完成之后可以打开布线设计,并编辑时序约束。

添加时钟约束

对 rx_clk 进行约束,周期为18.518ns

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

添加 input delay 约束

需要对四个 input delay 进行约束,分别为上升沿的Max、Min,下降沿的Max、Min。

以上升沿的Max作为示例,最大为2ns

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

下降沿的 Max 设定为2ns,并勾选 no overwrite

注意!在对下降沿进行约束时,在图中箭头所指的参数需要勾选,表示此约束是否会覆盖之前上升沿所做的约束,因为本次实验是DDR双沿采样,上升沿和下降沿既作发射沿也作采样沿,因此在定义下降沿约束时,需要作不覆盖之前约束的操作,而之前的SDR则不需要。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

input delay 约束汇总如图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

CTRL+S 保存点开XDC约束文件即可看到刚刚添加的约束信息

create_clock -period 18.518 -name sdrclk -waveform {0.000 9.259} [get_ports sdrclk]
set_input_delay -clock [get_clocks rx_clk] -rise -max 2.000 [get_ports {rx_ctrl {rx_dat[0]} {rx_dat[1]} {rx_dat[2]} {rx_dat[3]}}]
set_input_delay -clock [get_clocks rx_clk] -rise -min -2.000 [get_ports {rx_ctrl {rx_dat[0]} {rx_dat[1]} {rx_dat[2]} {rx_dat[3]}}]
set_input_delay -clock [get_clocks rx_clk] -clock_fall -fall -max -add_delay 2.000 [get_ports {rx_ctrl {rx_dat[0]} {rx_dat[1]} {rx_dat[2]} {rx_dat[3]}}]
set_input_delay -clock [get_clocks rx_clk] -clock_fall -fall -min -add_delay -2.000 [get_ports {rx_ctrl {rx_dat[0]} {rx_dat[1]} {rx_dat[2]} {rx_dat[3]}}]

从下图可以看到,在不对时序作false path的约束时,约束工具会把一些不必要的路径,在对下表的内容做约束后,上升沿与上升沿之间是不需要分析建立时间的,上升沿和下降沿之间也不需要做保持时间。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

添加 False Path

在timing constraints中的exceptions中的set false path添加

Setup Time

首先对两个上升沿之间的建立时间做false path,From是rx_clk的上升沿,To是PLL输出的时钟的上升沿。

下降沿同理

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

并在options中设定为上升沿rise的mark

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

Hold Time

再对保持时间做false path,From是rx_clk的上升沿,To是PLL输出的时钟的下降沿。

另一个From是rx_clk的下降沿,To是PLL输出的时钟的上升沿。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

在options中设定为hold time的mark

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

Multicycle约束

这时候就会避免掉一些错误的时序报告,但是仍然有一些错误的报告,比如rx_clk的上升沿与PLL输出的时钟的上升沿之间(L1r与C2r之间)作保持时间的分析。这时候就需要做另外一种约束Multicycle约束。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

同样的,在Exceptions中添加Multicycle,需要让PLL的上升沿左移一个,即让C2r变成C0r,设置成-1即可

下降沿的设置也是一样的。不多赘述。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

options中设定为hold time。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

保存后就可以看到XDC文件中有了 false path 和 Multicycle 的约束文件

set_false_path -setup -rise_from [get_clocks rx_clk] -rise_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]]
set_false_path -setup -fall_from [get_clocks rx_clk] -fall_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]]
set_false_path -hold -rise_from [get_clocks rx_clk] -fall_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]]
set_false_path -hold -fall_from [get_clocks rx_clk] -rise_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]]
set_multicycle_path -hold -rise_from [get_clocks rx_clk] -rise_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]] -1
set_multicycle_path -hold -fall_from [get_clocks rx_clk] -fall_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]] -

重新reload一下时序报告可以看到,时序出现了违例,通过看时序报告可以得出这个时序报告是正确的。只有在时序报告是正确的情况下,再去做时序约束才是有意义的,如果时序报告给的是错的,那时序约束也是无用功。时序报告是正确的,即使是违例的,我们再去调整也不麻烦。因此学会让时序工具给出正确的时序报告比懂得如何约束更重要!

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

report timing可以看到保持时间出现了违例

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

解决办法

现在得到了正确的时序报告,如何去修正时序呢,利用PLL的移相的功能就可以实现,既然是保持时间出现了违例,就说明是时钟的延时过大,只需要将PLL向左相移60°,即可恢复时序正常。

PLL配置

双击打开PLL配置界面,将相移改成-60即可

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

重新布局布线,由于这次是将PLL向左相移,所以在刚刚向右移的PLL所设定的Falsh Path和Multicycle删除掉,然后重新 reload 并 report time 查看时序报告。

发现问题

这时候看可以看到时序恢复了正常。但是有些余量是不正常的

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

建立时间中

rx_clk的rise到PLL的rise是不对的

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

rx_clk的fall到PLL的fall是不对的

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

保持时间中

rx_clk的fall到PLL的rise是不对的

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

rx_clk的rise到PLL的fall是不对的

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

添加 False Path

这四种情况所得到的建立时间和保持时间是不对的,因此需要把他们利用false path进行剔除。

添加四个false path

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

另外,不需要添加Multicycle,因为在使用PLL时,向右相移时才需要添加Multicycle,而向左相移则不需要添加。

重新reload可以看到给出的是正确的时序,并且时序恢复了正常。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 总结

如何得到正确的时序报告比如何解决时序违例更重要,知道问题的根,才能更好的解决问题!在用PLL进行时序优化时,注意看是否需要添加 False Path 和 Multicycle,以及怎么添加这些约束。

往期系列博客

 【Xilinx Vivado时序分析/约束系列1】FPGA开发时序分析/约束-寄存器间时序分析

 【Xilinx Vivado时序分析/约束系列2】FPGA开发时序分析/约束-建立时间

 ​​​​​​【Xilinx Vivado时序分析/约束系列3】FPGA开发时序分析/约束-保持时间

 【Xilinx Vivado时序分析/约束系列4】FPGA开发时序分析/约束-实验工程上手实操

 【Xilinx Vivado时序分析/约束系列5】FPGA开发时序分析/约束-IO时序分析

 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

 【Xilinx Vivado时序分析/约束系列7】FPGA开发时序分析/约束-FPGA单沿采样数据input delay时序约束实操

 【Xilinx Vivado时序分析/约束系列8】FPGA开发时序分析/约束-FPGA数据中间采样、边缘采样PLL时序优化实操

 【Xilinx Vivado时序分析/约束系列9】FPGA开发时序分析/约束-FPGA单沿数据input delay边沿对齐,不同时序模型实操练习

 【Xilinx Vivado 时序分析/约束系列10】FPGA开发时序分析/约束-FPGA DDR-Direct接口的 input delay 约束优化方法

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Xilinx Vivado 时序分析/约束系列11】FPGA开发时序分析/约束-FPGA DDR-PLL接口的 input delay 约束优化方法 的相关文章

  • 权限设计=功能权限+数据权限

    权限管理 Authority Management 目前主要是通过用户 角色 资源三方面来进行权限的分配 具体来说 就是赋予用户某个角色 角色能访问及操作不同范围的资源 通过建立角色系统 将用户和资源进行分离 来保证权限分配的实施 一般指根

随机推荐

  • 逆向爬虫01 requests模块

    python requests模块 requests是一个python模拟浏览器发送http请求的模块 1 使用requests模块发送get请求 获取网页源代码 import requests url http www baidu com
  • strictfp有什么作用

    关键字 strictfp 是 sitict float point 的缩写 指的是精确浮点 它用来确保浮点数运算的准确性 JVM 在执行浮点数运算时 如果没有指定 strictip 关键字 此时计算结果可能会不精确 而且计算结果在不同平台或
  • 一不小心就弄懂了 冒泡,选择,插入,希尔,归并和快速排序

    今天我们主要看一些简单的排序 常见的时间复杂度 常数阶 1 对数阶 log2n 线性阶 n 线性对数阶 nlog2n 平方阶 n 立方阶 n K次方阶 n k 指数阶 2 n 常见的时间复杂度对应图 1 log2n n nlog2n n n
  • PKU2019暑期学堂 游记

    诈尸写博客QaQ 一塔湖图 Day 0 18 00 从学校出发 with另外三个同学 前往南站 20 20上动车 感觉人好少的样子 房间灯是坏的 还换了一间 在火车上刷知乎 提前体验一下夏令营 而其他人都在弯道QwQ 好多人水群啊QwQ D
  • 新手入门 哪个视频剪辑软件好用

    当下 视频剪辑已成为一种全新记录生活的方式 许多人剪辑视频都是从零基础开始学习 那么从入门开始选择的软件就显得比较重要了 今天在这里给大家推荐一款适合新手入门的视频剪辑软件 会声会影 图1 会声会影软件 会声会影是一款很亲民的视频剪辑软件
  • C语言

    include
  • vue实现页面停留时间统计

    前言 在实际业务中 埋点需求是前端开发中非常重要的数据指标获取的方式之一 今天 主要聊一下页面停留时间的统计 简略版 每个页面独自实现相关统计 并上报数据 export default data return startTime 0 cre
  • SQL注入-联合注入

    页面有显示位时 可用联合注入 本次以 SQLi 第一关为案例 第一步 判断注入类型 参数中添加 单引号 如果报错 说明后端没有过滤参数 即 存在注入 id 1 从数据库的报错中我们可得知 最外边的一对单引号是错误提示自带的 我们不用管 我们
  • pip install -r requirements.txt报错ERROR解决办法

    这个问题困扰了我很长时间 因为做的时候没有保存错误的截图 所以只能写一些思路 1 首先是vscode的环境 然后在里面安装Build Tools 这个很重要 否则会一直报错 安装包图片是上面这两个 下载的话Visual Studio Cod
  • 脚本收集服务器信息,shell脚本批量收集linux服务器的硬件信息快速实现

    获取默认IP default ip ifconfig head n 2 tail n 1 cut d f 2 cut d f 1 获取产品的名称 如果是简化版的linux系统 需要先安装dmidecode工具包 product name d
  • java高并发的处理--锁机制

    对于我们开发的网站 如果网站的访问量非常大的话 那么我们就需要考虑相关的并发访问问题了 而并发问题是绝大部分的程序员头疼的问题 但话又说回来了 既然逃避不掉 那我们就坦然面对吧 今天就让我们一起来研究一下常见的并发和同步吧 为了更好的理解并
  • phpstudy小皮 sqli-libs 靶场搭建

    sqli libs靶场搭建 1 下载靶场 sqli labs mster https github com Audi 1 sqli labs archive refs heads master zip 解压 2 下载 安装 phpstudy
  • Python(解非线性方程和线性方程)求水力学法向深度-浪涌高度速度及互连反应器中的浓度和流体分布

    非线性方程 在水力学领域遇到的非线性方程的一个例子是通过长梯形通道寻找流动的法向深度 y n y n yn 这样的流动深度出现在均匀流动区域 远离任何不均匀原因的影响 例如堰的上游 法向深度 y
  • 《GPT-4技术报告》【中文版、英文版下载】

    大预言模型时代已经到来 但是真正的智能之路还很长 一 以下是连接 大家请自取 英文原版 https arxiv org pdf 2303 08774 pdfhttps arxiv org pdf 2303 08774 pdf 中文翻译版本
  • 最大信息系数mic python_生物信息学

    论文剖析 热门论文 AgeGuess 一种预测人类年龄的甲基化模型 1 介绍 衰老是一个生物过程 受到遗传因子和细胞内各种分子修饰的影响 多项研究表明 使用甲基组数据可以准确预测实际年龄 本篇文章针对年龄回归问题 提出了一种三步特征选择算法
  • 【SpringBoot】pom中的变量

    在Maven项目的pom xml文件中 可以使用多个预定义变量 以下是一些常用的变量 project basedir 项目根目录的绝对路径 project build directory 构建目录的绝对路径 通常为target projec
  • mybatis_plus

    目录 一 简介 二 特性 三 快速入门 一 创建并初始化数据库 1 创建数据库 2 创建 User 表 二 初始化工程 三 添加依赖 1 引入依赖 2 idea中安装lombok插件 四 配置 五 编写代码 1 主类 2 实体 3 mapp
  • [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.(入职小灰)

    mariadb剧本安装后自动重启不了 飞要一次手动重启 这对于重要业务来说是致命的 今天遇到的错误 ERROR Can t open the mysql plugin table Please run mysql upgrade to cr
  • threejs教程(一)

    插件安装 npm i three 项目引入 这里我随便找的VUE项目练习的 import as THREE from three 大致介绍一下threejs的逻辑 一般我们用它是来搭建三维模型的 搭建三维模型就需要的三个要素 场景 scen
  • 【Xilinx Vivado 时序分析/约束系列11】FPGA开发时序分析/约束-FPGA DDR-PLL接口的 input delay 约束优化方法

    目录 DDR PLL 简述 实际操作 实际工程 顶层代码 PLL配置 添加时钟约束 添加 input delay 约束 添加 False Path Setup Time Hold Time Multicycle约束 解决办法 PLL配置 发