1. 设计约束
设计约束主要分为物理约束和时序约束。
物理约束主要包括I/O接口约束(如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束。
时序约束是FPGA内部的各种逻辑或走线的延时,反应系统的频率和速度的约束。
2. 物理约束
在Vivado中,物理约束通常是在*_pins.xdc文件实现,这也是推荐的使用方法。
FUXI软件有专用的IO GUI界面,暂不支持手动编译。点击IO Editor,如下图所示。
注意:和Vivado类似,需要先完成Systhesize。
软件会打开*.aoc文件,根据硬件设计选择Pin Name,IO Standard等。
*.aoc文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<aoc version="2.3" device="P2P50N0V324-M4H1C7">
<ioConstraint>
<IO signal_name="sys_osc_clk" pad_name="io16_dmux5_clk0" location="IO16_GCLK0_0" pin_no="L4" inst_name="io_sys_osc_clk_inst" direction="input" operation_mode="clock"/>
<IO signal_name="sys_rst_n" pad_name="io30_busyout" location="IO30_BUSYOUT_0" pin_no="R1" inst_name="io_sys_rst_n_inst" direction="input" operation_mode="normal"/>
<IO signal_name="uart0_rx" pad_name="io32_lcsn" location="IO32_LCSN_0" pin_no="R2" inst_name="io_uart0_rx_inst" direction="input" operation_mode="normal"/>
<IO signal_name="uart0_tx" pad_name="io36_d6_dmux10" location="IO36_D6_0" pin_no="V2" inst_name="io_uart0_tx_inst" direction="output" operation_mode="normal"/>
</ioConstraint>
</aoc>
IO Stanard默认值不在*.aoc文件中显示,修改为其它值时会显示。
Drive Stength(mA),input不能修改,output可以修改。
另外,假如信号没有分配管脚,软件会自动分配一个管脚,配置文件不会显示,过程文件会体现。这一点设计要注意,避免出现不必要影响。
3. 时序约束
在Vivado中,物理约束通常是在*_timing.xdc文件实现,这也是推荐的使用方法。
FUXI软件有专用的Timing Contrains GUI界面,不推荐手动编译。点击Timing Contrains Editor,如下图所示。
从上图可以看到,已经包含业界常使用的约束命令。
*.sdc文件内容:
create_clock -period 50 -name {sys_osc_clk} [get_ports {sys_osc_clk}]
create_clock -period 10 -name {u_pll_v1_pll_u0/CO0} [get_pins {u_pll_v1_pll_u0/CO0}]
create_clock -period 5 -name {u_pll_v1_pll_u0/CO1} [get_pins {u_pll_v1_pll_u0/CO1}]
set_false_path -from [get_clocks {sys_osc_clk}] -to [get_clocks {u_pll_v1_pll_u0/CO0}]
set_false_path -from [get_clocks {sys_osc_clk}] -to [get_clocks {u_pll_v1_pll_u0/CO1}]
set_false_path -from [get_clocks {u_pll_v1_pll_u0/CO0}] -to [get_clocks {sys_osc_clk}]
set_false_path -from [get_clocks {u_pll_v1_pll_u0/CO1}] -to [get_clocks {sys_osc_clk}]
4. 时序分析
先运行Run Timing,完成后点击Timing Analysis分析时序报告。
小结:
时序约束通常可以分为以下4个主要步骤:
始终约束(Create Clock)->输入/输出接口约束(Input/Output Delay,I/O约束)、时钟分组和跨时钟约束(Clock Group and CDC)、时钟例外约束(Timing Exceptions)。
注意:必选要正确的梳理时钟树。
时钟约束和输入/输出接口约束是设计中基本的时序要求;
跨时钟域的时序路径约束使用时钟分组约束,可以用于忽略不必要的跨时钟域路径之间的时序要求;
时序例外约束是在已有的时序也是基础上,忽略、放宽或缩紧某些路径的时序要求。
时序路径
典型的时序路径有4类,如下图所示,这4类路径可分为片间路径(标记①和标记③)和片内路径(标记②和标记④)。
对于所有的时序路径,要明确起点和终点,这4类时序路径的起点和终点分别如下表。
时序逻辑 | 起点 | 终点 | 应用约束 |
①输入端口到FPGA内部第一级触发器的路径 | ChipA/clk | rega/D | set_input_delay |
②FPGA内部触发器之间的路径 | rega/clk | regb/D | create_clock |
③FPGA内部末级触发器到输出端口的路径 | regb/clk | ChipB/D | set_output_delay |
④FPGA输入端口到输出端口的路径 | 输入端口 | 输出端口 | set_max_delay |
这4类路径中,最为关心是②的同步时序路径,也就是FPGA内部的时序逻辑。