Vivado FPGA开发中的XDC约束入门

Vivado FPGA开发中的XDC约束入门

XDCXilinx Design Constraints)是 Xilinx 公司提供的一种用于 FPGA 设计的约束文件格式,它允许设计者定义时序约束、I/O 约束和其它多种类型的约束。这些约束对于 FPGA 综合和布局布线过程至关重要,确保设计满足性能和功能要求。

  1. 时序约束:定义了设计中的时钟域和时序要求,如设置时钟周期、建立时间、保持时间等。
  2. I/O 约束:指定了 FPGA 芯片的 I/O 引脚与设计中信号的对应关系,包括引脚速度等级、输入延迟、输出延迟等。
  3. 电源和地引脚约束:定义了 FPGA 芯片的电源和地引脚,确保正确供电。
  4. 特殊功能约束:如 RAM 初始化、异步复位等,这些约束帮助 Vivado 工具更好地优化设计。

Vivado常用的XDC大致包括时序约束和物理约束(IO)两大类。时序约束的目的就是告诉工具当前的时序状态,让工具尽量优化时序并给出详细的分析报告。一般在行为仿真后、综合前即创建基本的时序约束。Vivado使用SDC基础上的XDC脚本以tcl文本形式约束;物理约束的目的是告诉工具这个模块的位置,输入输出端口分别是哪些;下面讲解最基本的约束相关脚本。

时序约束timing constraints:

1 时序约束首要任务是创建主时钟,主时钟即为时钟引脚进入时钟信号或高速收发器生成时钟。[create_clock]

create_clock -name clk_name -period N -waveform {pos_time neg_time} [get_ports port_name]

1.create_clock -period 10.000 -waveform {0.000 5.000} [get_ports clk]

2.create_clock -name sys_clk -period 10.0 -waveform {5.0 5.0} [get_ports clk]

  创建两个异步的主时钟:

  create_clock -name clk_a -period 10 [get_ports clk_a]

  create_clock -name clk_b -period 15 [get_ports clk_b]

  set_clock_groups -asynchronous -group clk_a -group clk_b

  当两个主时钟是异步关系,它们生成时钟同样是异步关系:

  set_clock_groups -asynchronous -group [get_clocks clk_a -include_generated_clocks] \

  -group [get_clocks clk_b -include_generated_clocks]

  差分时钟仅约束P端口:

create_clock -name clk -period 10 [get_ports clk_p]

对于差分时钟,一定会用到IBUFGDS(差分转单端,xilinx FPGA原语),因此只用约束P端。工具会据此自动将此约束传播到IBUFGDS的输出端口。如果既约束P端又约束N端,工具会认为这是两个独立的时钟,进而分析相应的内部路径,最终导致错误的时序需求。

  高速收发器生成时钟作为主时钟:

  create_clock -name gt0_txclk -period 8  [get_pins GT0/.../TXOUTCLK]

  有一种特殊情况无需与具体引脚绑定,即创建虚拟时钟。该约束用于设定输入/输出延迟。需要创建虚拟时钟的场景是输入FPGA的数据由FPGA内部产生时钟采样,如串口通信。虚拟时钟是一种在FPGA设计中使用的时钟约束,它不对应任何物理引脚,而是用于描述 FPGA 内部的时钟逻辑。这种时钟通常用于管理和约束那些不涉及外部信号交互的内部操作。虚拟时钟的一个重要用途是设定输入/输出延迟的约束。在 FPGA 中,输入信号可能需要一定的时间才能被 FPGA 内部逻辑识别,而输出信号也可能有一定的延迟。通过虚拟时钟,可以对这些延迟进行建模和约束,以确保信号的时序正确性。

  create_clock -name clk_v -period 5

2 创建主时钟后,需要约束生成时钟:[create_generated_clock]

  生成时钟分为两种。由PLL MMCM等专用时钟单元生成产生的时钟信号,Vivado会自动产生相关约束。还有一种是自定义生成时钟,一般为逻辑分频得到。

  时钟源是时钟端口:

  create_generated_clock -name clk_div -source [get_ports clk] -divide_by 2 [get_pins rega/Q] 意思是在rega单元的Q引脚上的时钟信号clk_div是由clk经过2分频得到的生成时钟。

  时钟源是引脚:

  create_generated_clock -name clk_div -source [get_pins rega/C] -divide_by 2 [get_pins rega/Q]

  除了使用-divide_by -multiply_by表示主时钟和生成时钟的频率关系,也可以用 -edges实现更精确的表达:

  create_generated_clock -name clk_div -source [get_pins rega/C] -edges {1 3 5} [get_pins rega/Q]

  相移关系使用-edge_shift命令描述。

  该约束命令还常用于重命名时钟信号:

  create_generated_clock -name clk_rename [get_pins clk_gen/.../CLKOUT0]

3 创建时钟组:[set_clock_groups]

  a. 异步时钟情况:

  set_clock_groups -asynchronous -group clk_a -group clk_b  clk_aclk_b是异步时钟。

  b. 物理互斥情况:

  create_clock -name clk_a -period 10 [get_ports clk]

  create_clock -name clk_b -period 8 [get_ports clk] -add

  create_clock -name clk_c -period 5 [get_ports clk] -add

  set_clock_groups -physically_exclusive -group clk_a -group clk_b -group clk_c

  该种情况仅是为了观察clk引脚时钟信号周期依次为10ns 8ns5ns时,时序是否收敛。因此这三个时钟物理上不同时存在。

  c. 逻辑互斥情况:

  set_clock_groups -logically_exclusive\

  -group [get_clocks -of [get_pins clk_core/.../CLKOUT0]] -group [get_clocks -of [get_pins clk_core/.../CLKOUT1]]

  clkout0clkout1送入到BUFGMUX中,后续根据sel信号确定选择哪一个作为工作时钟。此时clkout0clkout1同时存在电路中,但仅有一个会作为后续电路工作时钟,因此逻辑上互斥。

  特殊用法:当asynchronous group只有一个,说明该组内时钟是同步的,但与其他所有时钟异步。

4 设置伪路径:[set_false_path]

  设置伪路径后,不再对特殊路径进行时序分析。特殊路径如测试逻辑、添加同步电路后的跨时钟域路径等。在两个时钟域之间应该相互设置为set_false

  set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b]

  set_false_path -from [get_clocks clk_b] -to [get_clocks clk_a]

5 常用时钟相关命令:

  report_clocks:查看创建的所有时钟

   report_property [get_clocks <clk_name>]:查看时钟clk_name的属性

  report_clock_network:查看时钟的生成关系网络

  report_clock_interaction:查看时钟交互关系

其中最后一项非常重要,经常被用于查看异步时钟域之间的路径是否安全。若存在不安全路径,需要添加同步、握手或FIFO后,设置为异步时钟组或false_path

IO约束 pin constrints:

方法1:可通过综合完成后的IO planning进行管脚约束,对输入输出信号进行芯片引脚约束和I/O 电气标准约束。

方法2:直接创建XDC文件,选择“add or create cconstraints”,点击next,如果添加已有xdc文件,可以点击“add files”。如果创建新xdc文件,可以点击“create files”。

(1)引脚分配设置

“pin name”是芯片的引脚,ports是工程中定义的模块名

set_property PACKAGE_PIN <pin name> [get_ports <ports>]

(2)引脚电气标准设置

“IOSTANDARD”是电气标准,如LVCMOS18、LVCMOS12、LVCMOS33

set_property IOSTANDARD <IO standard> [get_ports <ports>]

(3)引脚驱动能力设置

set_property DRIVE <2 4 6 8 12 16 24> [get_ports <ports>]

(4)引脚抖动设置

set_property SLEW <SLOW|FAST> [get_ports <ports>]

(5)引脚上拉设置

set_property PULLUP true [get_ports <ports>]

(6)引脚下拉设置

set_property PULLDOWN true [get_ports <ports>]

约束的进阶理解:

Vivado IP 有时会自带约束,包括时序约束与位置约束,常见的比如GT,PLL这类约束不必再额外添加。如果设计不合理或工具自带bug,有时候会出现critical warning,如果IPLOC的约束GT物理位置修改了,可以尝试以下命令进行修改:强制解约束后重新约束。

set_property PACKAGE_PIN {}  [get_ports gt_common_rxn_in]

set_property PACKAGE_PIN {}  [get_ports gt_common_rxp_in]

set_property PACKAGE_PIN AJ3 [get_ports gt_common_rxn_in]

set_property PACKAGE_PIN AJ4 [get_ports gt_common_rxp_in]

vivado 覆盖ip核生成的xdc约束_vivado的ip核的xdc约束与顶层约束发生冲突-CSDN博客

Vivado 12-2285位置约束冲突 如何解决? (xilinx.com)

Widget (xilinx.com)

值得注意的是:默认IP xdc文件在用户xdc文件前执行,即用户xdc可覆盖IP自带的约束。

【 Vivado 】XDC文件的约束顺序_xdc文件 约束 顺序-CSDN博客

建议:无论是设计使用一个还是多个XDC文件,都按以下顺序组织约束。
## Timing Assertions Section
# Primary clocks
# Virtual clocks
# Generated clocks
# Clock Groups
# Bus Skew constraints
# Input and output delay constraints

## Timing Exceptions Section
# False Paths
# Max Delay / Min Delay
# Multicycle Paths
# Case Analysis
# Disable Timing

## Physical Constraints Section
# located anywhere in the file, preferably before or after the timing constraints
# or stored in a separate constraint file

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值