XILINX FPGA VAVADO设计要点

时间:2024-03-27 15:27:31

XILINX FPGA VAVADO设计要点
XILINX FPGA VAVADO设计要点
Version -20190521 by-chenjun
qq:1719577901
一、Timing constraints
分离LOC约束与timing 约束
1、【使用多个XDC约束文件】使用单个约束文件看起来是方便的,但是在设计变得更加复杂时维护将面临挑战

2、【独立划分pin.xdc与timing.xdc】xilinx 推荐分离时序与物理约束为两个文件,您还可以将特定于某个模块的约束保存在单独的文件中
3、
4、【设置XDC文件使用范围】物理约束LOC只用于 implementation,timing 约束用于synthesis以及implementation

3、【XDC约束循序】,创建时钟应该最先被约束,任何 子时钟或参考时钟的约束 或 cdc 约束 必须在定义之后约束, 如在 主时钟定义之前约束 ,则会报告错误,同时相应约束被忽视,这在单个约束文件中是这样,在设计中的所有XDC文件(或Tcl脚本)中也是如此,否则会报告错误

4、推荐的约束循序如下
XILINX FPGA VAVADO设计要点
7、按顺序处理XDC命令,其中最后一个命令优先。由于timing constraints,这并不总是成功的;如果一个IP设置了一个路径来产生一个false path例外约束 ,而你在顶层XDC中同一路径上应用max_delay约束,那么这个false path将保留下来,因为它具有更高的优先级。要进行这些级别的更改,必须修改IP交付的XDC。

6、【最后约束有效】约束存在重复冲突下,最后的约束有效。如LOC位置重复约束,最后的约束有效,IP 的约束与顶层XDC的约束冲突,顶层XDC约束有效。

7、【列外约束优先级】时序约束是有优先级的,如set_false_path 优先级别高于set_max_delay –datapath_only

8、【CDC跨域电路约束】为了正确约束异步时钟域交叉电路(CDC),需要考虑以下四点:
1.如果两个时钟之间没有路径,则只需在两个时钟之间使用set_clock_groups或set_false_path。
2.如果路径都是单个大CDC(单bit信号时钟域穿越),则可以在两个时钟之间使用set_clock_groups或set_false_path。
3.如果路径都是多位路径,并且您担心数据位中的延迟和偏差,则使用set_max_delay -datapath_only和set_bus_skew约束。
4. 如果在两个时钟之间存在单比特和多比特CDC的混合,则对单比特CDC使用显式路径到路径的 false path约束,并且对于多比特CDC路径使用set_max_delay -datapath_only和set_bus_skew约束。
9、【非跨域电路】如果时钟是同步的,则不需要任何CDC约束。Vivado中的STA引擎将自动计时路径。

10、【约束路径与约束源到目的时钟】我们可以在路径中涉及的各个FF上执行此操作(路径到路径),或者我们可以在时钟本身上执行此操作(source clk to destion clk)。但是,如果我们在时钟之间执行set_false_path或在时钟上执行set_clock_groups,那么该约束具有最高优先级 - 即使我们也在路径中涉及的FF上执行set_max_delay,set_clock_groups将覆盖它,并且路径将仍然不受约束。

11、【多bit CDC电路约束】一些CDC多bit电路需要小心处理,格雷码时钟域交叉电路需要set_max_delay -datapath_only(或set_bus_skew),其使用小于或等于一个源时钟周期的值,与目标时钟无关。MUX时钟交叉器需要set_max_delay -datapath_only(或set_bus_skew),其周期与通过时钟交叉器的数据分离和同步触发器的数量有关。大多数事件同步器需要set_max_delay -datapath_only,其值小于或等于两个时钟中较快时段的周期。如果延迟对您来说不是问题,则可以通过set_false_path约束单个缓慢变化的信号,或者由您可以容忍的延迟来确定。

12、【例外约束例子】set_clock_groups 异步约束
set_clock_groups -asynchronous
-group [get_clocks {clk_fpga_0 clk_fpga_1}]
-group [get_clocks -include_generated_clocks SYS_CLOCK_P_D18]

set_clock_groups -name sys_ss_asyn8 -asynchronous
-group [get_clocks mmcm_clkout1]
-group [get_clocks mmcm_clkout0]

13、【单个pin的 false path】 如reset信号
set_false_path -to [get_pins {MicroBlaze_Core_I/Reset_DFF/*/D}]

二、Package IP
1、【Package custome IP】在创建自定义IP时,建议包含一个OOC XDC文件,以提供这些时钟定义,以便独立地合成IP
XILINX FPGA VAVADO设计要点
(1)打包IP时加入OOC XDC约束后,可以在综合后即给出时序结果。
(2)Vivado综合法使用OOC综合法运行中的独立XDC文件将IP约束到推荐的时钟频率。在顶层设计非OOC模式使用时,顶层XDC文件提供时钟约束,不需要独立的OOC XDC文件。

2、【使用OOC XDC】
(1)OOC XDC 文件:如果创建的时钟是IP内部的(GT),或者如果IP包含输入缓冲区(IBUF),create_clock约束应该保留在IP XDC文件中,因为需要定义本地时钟。
(2)将不属于内部或本地的时钟从IP XDC文件移动到一个OOC XDC文件,因为顶层设计提供了时钟。对于本例,
XILINX FPGA VAVADO设计要点
将第1行和第2行上的create_clock约束从design XDC文件移动到OOC XDC文件。当用户实例化要从IP目录打包到设计中的IP时,IP将继承父顶层设计中的时钟定义。
(3)set_max_delay约束需要注意,因为它依赖于已定义时钟的PERIOD属性(get_clocks -of_objects)。这种依赖关系受IP和顶层设计约束处理顺序的影响
(4)IP的 XDC文件需要修改【USED_IN】和【PROCESSING_ORDER】属性,以便Vivado工具正确地处理IP的约束文件,用于OOC综合的XDC设置为 EARLY 以及USED_IN需要增加 out_of_context,用于时序例外约束的 XDC设置为LATER USED_IN 为默认的综合和实现。
(5)当USED_IN属性包含out_of_context设置时,XDC文件只用于在out- context (OOC)运行时进行综合或实现(-mode out_of_context)。
(6)SCOPED_TO_REF:指定XDC文件应用到哪些模块。
(7)SCOPED_TO_CELLS:XDC文件应用到模块中的哪些单元。
(8)顶层的XDC文件PROCESS_ORDER设置为NORMAL

3、【edit IP】通过edit IP项目向自定义IP添加文件时,请确保在“添加源”对话框中选择了复制源到IP目录

4、【include xci 与include ip generated files】由于每个版本中只交付一个Xilinx IP版本,如果关联的XCI文件有一个新版本,则父IP可能会被锁定。Vivado将尝试自动升级交付时的XCI文件;但是,Xilinx强烈建议使用最新Vivado设计套件升级的XCI重新打包父IP,以维护功能。
当选择包含IP生成的文件时,将打包IP定制生成的HDL和XDC输出产品。这将删除对原始IP定制的任何引用,并将IP视为项目源文件

5、【axi ip命名】: vivado有一个端口的命名规则来让工具正确推断时钟和复位和AXI接口。如果重置信号不包含所需的命名法,则可以手动创建接口并相应地设置属性
XILINX FPGA VAVADO设计要点
对于以n结尾的复位信号,如resetn和aresetn,这意味着是一个低电平信号,接口自动将极性参数设置为低电平。Vivado IP integrator中使用此参数来确定在生成框图时重置是否正确连接。
6、【revesion】每次重新打包IP时,如果没有更改版本,则IP打包程序自动增加修订号。自定义IP可以在IP目录中有多个可用的版本,可以选择任何可用的版本。还可以将当前使用的自定义IP版本升级到最新可用的版本

6、【Package BD】
(1)由于没有维护BD设计的关系图,因此不建议通过edit in IP Packager来修改打包的BD设计,建议回到原封装工程中修改后重新封装ip。如不使用原工程封装则可以以像RTL项目一样添加需要的ip或修改IP 然后手动编解和列化调用的IP。

(2)package BD 需要修改bd NAME 因为如果项目中已有一个BD ,如也采用默认名会与package的BD名字冲突,同时 package 之前需要先打开BD design

7、【Package ELF】
封装含有 ELF文件的BD时,仿真中的ELF文件将丢失

8、【修改IP源文件】
(1)某些特殊情况下,可能需要修改源IP,比如ip约束了一个时序路径设置为flase,用户顶层之后又对该路径的max_delay做了约束,这样并不会改变路径的flase状态,因为路径flase有更高的优先级,这种情况下必须通过编辑IP源文件来实现修改;
(2)编辑xilinx源IP之前需要先生成所有的IP核相关文件,包括DCP设计检查点文件。使用下面命令将XCI文件的ISMANAGED属性设置为False;
set_property IS_MANAGED false [get_files <IP_NAME>.xci]
设置成功后,IP和图标将发生变化
XILINX FPGA VAVADO设计要点
(3)点击Tools->Report->Report IP Status报告IP状态,可以查看到IP核状态为“User-managed IP”,该状态下即可对IP核的未加密HDL文件和XDC文件进行修改:
XILINX FPGA VAVADO设计要点
(4)完成需要的编辑之后,必须在Tcl控制台中复位IP,使用“reset_run _synth_1”命令,之后使用“launch_run _synth_1”使用修改后的HDL或约束文件重新运行IP。这样便完成了对IP源文件的编辑。

9、【vivado不支持在封装IP中添加DCP】在封装IP中,添加DCP文件,dcp文件不出现在右侧file groups中,在保存package ip 后, DCP文件将丢失。

三、Create customs ip
【example design】
不要将示例设计存储在标准项目或管理IP项目的IP目录中,Xilinx建议将整个IP目录放入版本控制中,还建议不要将项目放入版本控制中。因为在启用和禁用core containers 时,可能导致问题。

四、关于AXI 模块设计
1、【防止AXI死锁】The dependency rules must be observed to prevent a deadlock condition. For example, a master must not wait for AWREADY to be asserted before driving WVALID. A deadlock condition can occur if the slave is waiting for WVALID before asserting AWREADY.

2、【interconnect 寻址】AXI master 通过interconnect 向slave写入时,如果地址不在AXI xbar寻址空间内,axi接口同样能接收到写入数据,但数据不能被正确写入,同时读取此地址时,返回RDATA都为0

3、【关于乱序】axi mm 支持写乱序,在第一个写没收到BVALID的情况下,就可以启动下一个传输

五、7series clock

XILINX FPGA VAVADO设计要点

六、Timing约束

XILINX FPGA VAVADO设计要点
create_clock–name CLKA –period 10.0 [get_ports CLKA]
create_clock–name CLKB –period 5.0 [get_ports CLKB]
set_clock_groups –async –group CLKA –group CLKB
上述约束等效于
set_false_path–from [get_clocks CLKA] –to [get_clocks CLKB]
set_false_path–from [get_clocks CLKB] –to [get_clocks CLKA]
但通常建议采用前者。

如果是如下图所示情形,即CLKA和CLKB由外部晶振提供,分别通过MMCM生成各自的时钟,此时{CLKA, clk0, clk1, clk2}与{CLKB, clka, clkb, clkc}是异步的,从而相应的约束变为:

XILINX FPGA VAVADO设计要点
create_clock–name CLKA –period 10.0 [get_ports CLKA]
create_clock–name CLKB –period 5.0 [get_ports CLKB]
set_clock_groups–async
-group[get_clocks –include_generated_clocks CLKA]
-group[get_clocks –include_generated_clocks CLKB]

Clk50与clk100为同步时钟,clk33和clk66为同步时钟,而两组同步时钟之间均为异步时钟,相应的约束该如何描述呢?
set_clock_groups–async –group {clk50 clk100} -group {clk33 clk66}
在set_clock_groups中-asynchronous可简写为-async。