FPGA中的各种约束

13 篇文章 6 订阅

约束

约束时FPGA设计中所不可缺少的,通过它可以指定设计各方面的设计要求,一般常见的是包括引脚位置约束、区域约束、时序约束、电平约束等几个方面。

引脚约束

这个比较好理解,就是要把程序中使用的引脚和FPGA时间的引脚关联起来。在vivado中通过IO plan非常好设计。

电平约束

我的理解就是把相应的引脚设置成不同的电平标准,会对应到不同的bank中,我觉得这应该就是电平约束吧。

区域约束

可以选定在fpga的那个位置定义基本设计单元,众所周知,fpga中有很多门级结构,在编程后,进行综合和布局布线是按vivado提供的逻辑进行的,具体放在哪可能是随机的,但若加了区域约束起码那限定一下。

方法的话:我知道的一个是通过写约束文件(LOC命令),其次可以通过vivado的可视化步骤进行约束,我目前还没怎么用区域约束,后续用到的时候再补充。

时序约束

这一部分的东西就比较多了,使用的时候也比较频繁。
时序约束的目的就是告诉工具当前的时序状态,以让工具尽量优化时序并给出详细的分析报告。一般在行为仿真后、综合前即创建基本的时序约束。下面这部分参考的
时序约束部分

Vivado使用SDC基础上的XDC脚本以文本形式约束。以下讨论如何进行最基本时序约束相关脚本。

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

create_clock -name clk_name -period N -waveform {pos_time neg_time} [get_ports port_name] (划线部分可选)

创建两个异步的主时钟:

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]

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

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

有一种特殊情况无需与具体引脚绑定,即创建虚拟时钟。该约束用于设定输入/输出延迟。需要创建虚拟时钟的场景是输入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_a和clk_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 8ns和5ns时,时序是否收敛。因此这三个时钟物理上不同时存在。

c. 逻辑互斥情况:

set_clock_groups -logically_exclusive\

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

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

特殊用法:当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。

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值