Vivado是Xilinx系列FPGA开发环境。本文记载收录了vivado常用开发技巧,随机记录、随时更新。。。
任何Xilinx相关问题都可到WELCOME TO XILINX SUPPORT!查询
静态时序分析(Static Timing Analysis, STA):简介及内容导航
VIVADO的综合属性ASYNC_REG
在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;
详细报告可以点击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_permissimon−Tclk_uncertain−TsetupUFF1
并且满足 Slack = Required Time - Arrival Time
《基于Xilinx的时序分析、约束和收敛》目录与传送门
综合能通过说明能生成网表,但布局布线一直不成功,可能是没地方放了。
可查看工程名.runs/synth_1/runme.log
信息,文中显示number of nodes with overlaps
一直在刷新,且等号右边的值一直不为零,为零才表示布局布线找到可行解。并且每次迭代iteration
WNS一直为负,导致卡在route design。
可能的原因如下:
可通过回溯更改内容锁定问题位置。
Router is stuck at “Number of Nodes with overlaps…”
What is “Number of Nodes with overlaps” parameter in implementation?
《Vivado Design Suite User Guide Synthesis - UG901》
Vivado使用技巧(24):HDL/XDC中设置综合属性
在点击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
为了保证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
状态机中的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 '...'
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
可通过Open Implementation Design之后,在tcl中写入如下语句显示几个最大扇出的路径
report_high_fanout_nets
report_high_fanout_nets -help
设置寄存器和组合逻辑信号的最大扇出限制(即最大驱动元件数量)。超出该设置值时,会复制一个完全相同的寄存器或组合逻辑。
(* MAX_FANOUT=50 *) reg sig1; //Verilog示例
Vivado那些事儿—扇出分析与优化
即Vivado源语,可看作是参数化的IP,可直接设置参数例化IP,无需在IP Catalog中设置好了再例化。
下面介绍几种常用的源语。
对于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
);
Xilinx FPGA输入输出缓冲 BUF 的使用
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
《Vivado Design Suite 7 SeriesFPGA and Zynq-7000 SoCLibraries Guide》 - ug953
也是一种参数化例化IP的方法,详见文档说明
可以直接参考RTL Project Directory,了解一个工程的文件夹目录如何组织。
ECO指的是Engineering Change Order,即工程变更指令。目的是为了在设计的后期,快速灵活地做小范围修改,从而尽可能的保持已经验证的功能和时序。ECO的叫法算是从IC设计领域继承而来,其实在以往的FPGA设计上已被广泛采用。简单来说,ECO便相当于ISE上的FPGA Editor。
工程编译完毕后,在/xxx.runs/impl_1/
目录下有*_opt.dcp, *_place.dcp, *_route.dcp
三个文件,分别对应opt_design、placed_design和routed_design之后的文件,可根据对网表修改程度的大小,选择某一阶段的DCP文件进行ECO。
ECO可实现修改ILA、增加/删除/修改内部CELL、RAM/ROM/FF初值等功能。
Vivado-ECO修改网表进行加速debug
Vivado ECO实例教程一 增加LUT(GUI操作)
“揭秘” Xilinx FPGA 的 ECO 功能
《Vivado Design Suite User Guide Implementation》 - ug904 - Chapter 3 - Vivado ECO Flow