Vivado开发技巧


Vivado是Xilinx系列FPGA开发环境。本文记载收录了vivado常用开发技巧,随机记录、随时更新。。。

任何Xilinx相关问题都可到WELCOME TO XILINX SUPPORT!查询

1. STA

静态时序分析(Static Timing Analysis, STA):简介及内容导航
VIVADO的综合属性ASYNC_REG

1.1. 同步器

在XDC中作如下约束,表示对名字末尾为_cdc_to的寄存器不进行STA

set_false_path -through [get_pins -hier *cdc_to*]

同时,对于跨时钟域的同步寄存器,要作如下声明。这样这几个同步寄存器就可以接收异步信号,且会布局到同一个SLICE/CLB来提高Mean Time Between Failure(MTBF)

(*ASYNC_REG = "TRUE"*)reg res_cdc_to;
(*ASYNC_REG = "TRUE"*)reg res_d1;

1.2. Report Timing Summary

详细报告可以点击Open Implemented Design下的Report Timing Summary,之后在右侧TIming一栏中选择具体的路径显示延迟

在这里插入图片描述
上图中,我们将From触发器看作是UFF0,To触发器看作是UFF1,则时序路径可简化为如下图

在这里插入图片描述

名词解释如下

● Slack:建立时间裕量
● Levels:逻辑级数,从UFF0/Q到UFF1/D之间组合逻辑器件的个数
● Fanout:表示从这一点连接到了几个目的端点,fanout = 1就表示连接了1个目的端点
● From To:发起触发器与捕获触发器
● Total Delay:路径UFF0/CK到UFF1/D的总延迟,即 T C K 2 Q U F F 0 + T U F F 0 / Q _ t o _ U F F 1 / D T_{CK2Q}^{UFF0}+T_{UFF0/Q\_to\_UFF1/D} TCK2QUFF0+TUFF0/Q_to_UFF1/D
● Logic Delay:路径UFF0/CK到UFF1/D的逻辑元件延迟,包括触发器延迟 T C K 2 Q U F F 0 T_{CK2Q}^{UFF0} TCK2QUFF0
● Net Delay:路径UFF0/CK到UFF1/D的走线延迟

由此可见,Total Delay = Logic Delay + Net Delay

之后双击Path 5那一行,得到该时序路径的时序报告,如下

请添加图片描述
Summary一栏:
● slack:建立时间裕量,为正表示这条路径是满足建立时间要求
● source:源端触发器,即时序分析的起点,发射沿(Launch Edge)
● destination:目的触发器,即时序分析的终点,锁存沿(Latch Edge)
● path group:时序分析的时钟源
● path type:路径类型,此路径为建立时间的分析
● requirement:时序要求,设定为25MHz,所以就是40ns
● data path delay:路径UFF0/CK到UFF1/D的总延迟,即 T C K 2 Q U F F 0 + T U F F 0 / Q _ t o _ U F F 1 / D T_{CK2Q}^{UFF0}+T_{UFF0/Q\_to\_UFF1/D} TCK2QUFF0+TUFF0/Q_to_UFF1/D
● logic levels:逻辑级数,从UFF0/Q到UFF1/D之间组合逻辑器件的个数
● clock path skew:时钟到达目的寄存器和源寄存器之间的时间差值
● clock uncertainty :时钟的不确定度,包括skew和jitter

Source Clock Path一栏:
● Delay Type:路径CLK到UFF0/CK产生时延的项目。从表中可见是IO-走线-IBUF-走线-BUFG-走线
● Incr(ns):每个项目的时延。例如IBUF时延是1.749ns、BUFG实验室0.120ns
● Path(ns):截止到目前项目,时延的累加和。例如IO-走线-IBUF-走线-BUFG的时延累计为3.709ns

Data Path一栏:

● Delay Type:路径UFF0/CK到UFF1/D产生时延的项目。从表中可见是FDRE-走线
● Arrival Time:即路径CK到UFF1/D的时延总和

以及下图

请添加图片描述

Destination Clock Path一栏:

● Delay Type:路径CLK到UFF1/CK产生时延的项目,考虑了时钟周期、时钟不确定度和建立时间
● Required Time:即 T c l k + T C L K 2 U F F 1 / C K + T c l k _ p e r m i s s i m o n − T c l k _ u n c e r t a i n − T s e t u p U F F 1 T_{clk}+T_{CLK2UFF1/CK}+T_{clk\_permissimon}-T_{clk\_uncertain}-T_{setup}^{UFF1} Tclk+TCLK2UFF1/CK+Tclk_permissimonTclk_uncertainTsetupUFF1

并且满足 Slack = Required Time - Arrival Time

《基于Xilinx的时序分析、约束和收敛》目录与传送门

2. 编译

2.1. 增量编译

vivado 中的增量编译以及用法详解

2.2. 一直卡在route_design问题

综合能通过说明能生成网表,但布局布线一直不成功,可能是没地方放了。

可查看工程名.runs/synth_1/runme.log信息,文中显示number of nodes with overlaps 一直在刷新,且等号右边的值一直不为零,为零才表示布局布线找到可行解。并且每次迭代iterationWNS一直为负,导致卡在route design。

可能的原因如下:

  1. IP核设置不合理,例如multiplier用的是LUTs就会导致布线时间长,应该为Mults。
  2. 设置了多个同名IP核,建议建立新的工程重新设置IP
  3. BUFR改为BUFG等clock buffer使用是否正确

可通过回溯更改内容锁定问题位置。

Router is stuck at “Number of Nodes with overlaps…”
What is “Number of Nodes with overlaps” parameter in implementation?

3. 综合

《Vivado Design Suite User Guide Synthesis - UG901》
Vivado使用技巧(24):HDL/XDC中设置综合属性

3.1. Report

在点击Open Implemented Design之后,可以在TCL中直接输入以下指令获取部分报告

vivado之report

利用率报告 report_utilization

功耗报告 report_power

拥塞 report_design_analysis -congestion

时序违例路径 report_design_analysis -max_paths 50 -setup

工程编译完成之后,点击Open Implemented Design,之后tcl中输入以下内容即可显示最差的50条路径

report_design_analysis -max_paths 50 -setup

3.2. IOB

为了保证FPGA输入输出接口的时序,一般会要求将输入管脚首先打一拍再使用,输出接口也要打一拍再输出FPGA。这样做的目的是为了让这打一拍的寄存器约束到IO Buffer(IOB)上,从而使得每一次编译输入或者输出的时序不会发生改变。

这是因为,IOB是FPGA上距离IO最近的寄存器,并且位置固定。当你输入或者输出采用了IOB约束,那么就可以保证从IBUF到达寄存器或者从寄存器到达OBUF之间的走线延迟最短,即输入端走线为IO-IBUF-ILOGIC-...,输出端走线为...-OLOGIC-OBUF-IO

最大限度保证时序满足要求,同时由于IO的位置是固定的,所以每一次编译都不会造成输入或者输出的时序发生改变。

哪些信号需要置于IOB呢?对于关键输入输出信号,对时序有要求的信号,都要布置到IOB上,其他电平信号则无需布置、时钟信号无需布置、LVDS非时钟信号只需布置p端。

FPGA基础资源之IOB的应用

配置

可在XDC中对接口信号作约束

set_property  IOB true [get_ports {
    
    port_name}]

或者是在verilog中作约束,如下所示

(*IOB = "TRUE"*)output res_o,
...
(*IOB = "TRUE"*) reg a;

同时在verilog中要保证:输入信号以及输出信号和其所直连的寄存器之间 不能存在任何时序逻辑、任何组合逻辑和走线分支。且那个直连的寄存器,就会被放入IOB中。

检查

工程编译完成后,打开Open Implemented Design,再下方Tcl Console中输入tclapp::install ultrafast后回车

之后再在Tcl Console中输入xilinx::ultrafast::report_io_reg后回车,则出现IO Ports Summary 表格

在这里插入图片描述

其中

● Info为Unconnected的信号,无需布置
● Info为No Input FF的信号,其ILOGIC为0,表示该输入信号未连接到IOB
● Info为No Output FF的信号,其OLOGIC为0,表示该输出信号未连接到IOB
● Info无信息的信号,其ILOGIC为1或OLOGIC为1,表示该信号已连接到IOB。双向信号要ILOGIC和OLOGIC均为1

3.3. 安全状态机

状态机中的default语句意思是异常状态下状态机能跳转到正常状态,但EDA工具会对default语句自动忽视,这是对状态机进行优化的结果。

而安全状态机模式改变了状态机编码方式,在异常状态下也能跳转至正常状态,应当进行配置。

vivado 如何设置安全状态机模式

配置

推荐的写法是,在verilog中将 所有状态机的状态寄存器加入安全声明,并且位宽与实际使用一致,即定义如下

(*fsm_safe_state = "reset_state"*) reg [2:0] cur_state;

检查

编译完毕后,打开工程目录下/*.runs/synth_1/runme.log

若显示如下内容,则表示安全状态机配置成功

Implemented safe state 'reset_state' for state register 'cur_state_reg' in module '...'
encoded FSM with state register 'cur_state_reg' using encoding 'Hamming 2' in module '...'

若只显示如下内容,没有显示Implemented safe state...,则表示配置失败

encoded FSM with state register 'cur_state_reg' using encoding 'one-hot' in module '...'

3.4. DONT_TOUCH

DONT_TOUCH 属性可以用于保护信号或module不会在综合、布局布线阶段被优化掉。与 KEEP 和 KEEP_HIERARCHY 属性相比,DONT_TOUCH还能在布局布线时起作用,而且有更高的优先级。可用于等效寄存器、等效组合逻辑保留。

示例代码如下:

(*DONT_TOUCH = "TRUE"*) wire sig1;
assign sig1 = in1 & in2;
assign out1 = sig1 & in2;

VIVADO学习笔记之–DONT_TOUCH
Vivado防止信号被综合掉的三种方法
Vivado综合属性系列之七 DONT TOUCH

3.5. MAX_FANOUT

可通过Open Implementation Design之后,在tcl中写入如下语句显示几个最大扇出的路径

report_high_fanout_nets
report_high_fanout_nets -help

设置寄存器和组合逻辑信号的最大扇出限制(即最大驱动元件数量)。超出该设置值时,会复制一个完全相同的寄存器或组合逻辑。

(* MAX_FANOUT=50 *) reg sig1;  //Verilog示例

Vivado那些事儿—扇出分析与优化

4. Device Primitive Instantiation

即Vivado源语,可看作是参数化的IP,可直接设置参数例化IP,无需在IP Catalog中设置好了再例化。

下面介绍几种常用的源语。

4.1. IO Components

Input/Output Differential Buffers (IBUFDS/OBUFDS)

对于FPGA设计者来说,需要将外部输入的差分信号转成单端信号、或将单端信号转成差分信号输出,需要用到IBUFDS和OBUFDS两个源语,例化如下

IBUFDS #(
      .DIFF_TERM	("TRUE"		),     // Differential Termination
      .IBUF_LOW_PWR	("TRUE"			),    // Low power="TRUE", Highest performance="FALSE" 
      .IOSTANDARD	("LVDS"		)     // Specify the input I/O standard
   ) IBUFDS_inst (
      .O			(data_clk_tmp	),  // Buffer output
      .I			(data_clk_p		),  // Diff_p buffer input (connect directly to top-level port)
      .IB			(data_clk_n		) 	// Diff_n buffer input (connect directly to top-level port)
   );
OBUFDS #(
      .IOSTANDARD	("LVDS"	), // Specify the output I/O standard
      .SLEW			("SLOW"		)           // Specify the output slew rate
   ) OBUFDS_inst (
      .O		(tx_frame_p	),     // Diff_p output (connect directly to top-level port)
      .OB		(tx_frame_n	),   // Diff_n output (connect directly to top-level port)
      .I		(tx_frame	)      // Buffer input 
   );

Output Double Data Rate(ODDR)

4.2. Clock Buffers

Xilinx FPGA输入输出缓冲 BUF 的使用

4.3. Xilinx Parameterized Macros(XPM)

XILINX-VIVADO IP参数化方法(XPM)
《Vivado Design Suite 7 SeriesFPGA and Zynq-7000 SoCLibraries Guide》 - ug953

可以参数化例化IP,例如FIFO、Dual port RAM等,可以从 vivado内的Language Templates中寻找。

XPM IP自身的RTL设计文件路径在xxx\Xilinx\Vivado\2019.1\data\ip\xpm

4.4. Unimacros

《Vivado Design Suite 7 SeriesFPGA and Zynq-7000 SoCLibraries Guide》 - ug953

也是一种参数化例化IP的方法,详见文档说明

5. 工程目录组织

可以直接参考RTL Project Directory,了解一个工程的文件夹目录如何组织。

猜你喜欢

转载自blog.csdn.net/Starry__/article/details/131396122
今日推荐