Vivado中时钟约束的基本概念及用法

整理一些 Vivado 中时钟约束的基本概念及用法。

一、时钟周期约束

基础时钟

周期为 10ns 的基础时钟:

create_clock -period 10 [get_ports sys_clk]

生成时钟

生成时钟为通过组合逻辑自己生成的时钟驱动。MMCM、PLL、BUFR 输出的时钟不是生成时钟,vivado 会自动识别,不需要额外约束。

Vivado中时钟约束的基本概念及用法

如图是经典二分频生成时钟,其输出的时钟约束应当为:

create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 [get_pins REGA/Q]

-name 为该输出时钟的命名;-source 为源时钟;-divide_by 2 表示二分频;之后为生成时钟的输出端口。

重命名时钟

只有 auto-derived 的时钟,才可以根据需要重命名这些时钟。例如,MMCM、PLL 等 IP 核自动生成的时钟可以重命名,下面是重命名的示例:

create_generated_clock -name mmcm_clk_12m [get_pins design_1_i/clk_wiz_0/inst/mmcm_adv_inst/CLKOUT0]

异步时钟组

当两个异步时钟生成各自的相关时钟后,若不加约束,vivado 会认为所有时钟都是相关的

Vivado中时钟约束的基本概念及用法
set_clock_groups -name async_clk0_clk1 -asynchronous \
-group [get_clocks -include_generated_clocks clk0] \
-group [get_clocks -include_generated_clocks clk1]

-nama 为所有时钟组命名;-asynchronous 表示以下时钟组为异步;-group 表示一个时钟组;-include_generated_clocks 表示包含该时钟及该始终的生成时钟。

独立时钟

当两个时钟同一时刻有且只能有一个时钟工作时,这两个时钟相互独立,例如正常工作时钟和 DFT 时钟。

Vivado中时钟约束的基本概念及用法
set_clock_groups -name exclusive_clk0_clk1 -physically_exclusive -group clk0 -group clk1

二、输入延时约束

当外部芯片向 FPGA 发送数据时,从时钟上升沿到有效数据进入 FPGA 端口之间的延迟为输入延迟。

Vivado中时钟约束的基本概念及用法

计算方法:

input delay_max = Tco_max + TD_max

input delay_min = Tco_min + TD_min

set_input_delay -clock sysclk -max 4 [get_ports din]
set_input_delay -clock sysclk -min 2 [get_ports din]

-clock 为参考时钟;-min,-max 为输入延迟范围。

DDR 输入时延约束

在 DDR 情况下,上升沿和下降沿都需要输入时延约束。

Vivado中时钟约束的基本概念及用法
set_input_delay -min 1 -clock clk [get_ports data_in]
set_input_delay -max 2 -clock clk [get_ports data_in]
set_input_delay -min 1 -clock clk [get_ports data_in] -clock_fall -add_delay
set_input_delay -max 2 -clock clk [get_ports data_in] -clock_fall -add_delay

在正常上升沿时钟输入时延约束后,-clock_fall 表示在下降沿约束;-add_delay 为避免下降沿约束覆盖上升沿约束。

三、输出延时约束

当 FPGA 向外部芯片发送数据时,从时钟上升沿有效数据进入下游芯片寄存器之间的延迟为输出延迟。(即在下游芯片寄存器时钟上升沿之前 x 时间内数据应当稳定存在)

Vivado中时钟约束的基本概念及用法

计算方法:

output delay_max = TD_max + Tsu

output delay_min = TD_min – Th

set_output_delay -clock sysclk - max 2 [get_ports dout]
set_output_delay -clock sysclk - min -1 [get_ports dout]

DDR 输出时延约束

在 DDR 情况下,上升沿和下降沿都需要输出时延约束。

Vivado中时钟约束的基本概念及用法
set_output_delay -min -1 -clock clk [get_ports data_in]
set_output_delay -max 3 -clock clk [get_ports data_in]
set_output_delay -min -1 -clock clk [get_ports data_in] -clock_fall -add_delay
set_output_delay -max 3 -clock clk [get_ports data_in] -clock_fall -add_delay

四、纯组合逻辑延迟

FPGA 从入口到出口只有纯组合逻辑时,也需要对延迟进行约束。

Vivado中时钟约束的基本概念及用法
set_max_delay 15 -from [get_ports din] -to [get_ports dout]

五、虚拟时钟

只有在 FPGA 输入、输出(IO)时才会用到虚拟时钟。

外部芯片时钟与 FPGA 的原始时钟不同

Vivado中时钟约束的基本概念及用法

外部时钟为 internal_clock 频率时

create_clock -name sysclk -period 10 [get_ports clkin]
create_clock -name vclk -period 5
set_input_delay 6 -clock clk [get_ports dina]
set_input_delay 6 -clock vclk [get_ports dinb]

可见,虚拟时钟与普通时钟约束时唯一不同是没有给定端口。

外部芯片时钟相比 FPGA 时钟有较大延迟

Vivado中时钟约束的基本概念及用法
create_clock -name sysclk -period 10 [get_ports clkin]
create_clock -name vclk -period 10
set_clock_latency -source 1 [get_clocks vclk] //此处-source 指延迟来自于时钟源端
set_input_delay -clock vclk -max 4 [get_ports ain]
set_input_delay -clock vclk -min 2 [get_ports ain]

六、多周期路径约束

set_multicycle_path -from[get_cells rega] -to [get_cells rega] -setup/hold -end/start 2

分为发送时钟和接收时钟,EDA 在不约束时都默认为最差情况。

end 以发送边沿作为参考,计算接收时钟落后的于参考的边沿,setup 默认为接受时钟第一个落后于参考边沿的时钟边沿,hold 为 setup 边沿回退一个,即默认情况下为:-setup -end 1 和 -hold -end 0。

start 以接收边沿作为参考,计算发送时钟先的于参考的边沿,setup 默认为发送时钟第一个领先于参考边沿的时钟边沿,hold 为 setup 边沿回退一个,即默认情况下为:-setup -start 1 和 -hold -start 0。

多时钟周期约束主要包含以下几种情况:

6.1 发送、接收时钟相同

当接收寄存器接收数据变化频率不大时,与发送寄存器之间的组合逻辑约束可以放宽,以减少综合时间。

Vivado中时钟约束的基本概念及用法

在上图情况中,接收寄存器在发送寄存器变化后的第 2 周期接收。

set_multicycle_path -from[get_cells rega] -to [get_cells rega] -setup -end 2
set_multicycle_path -from[get_cells regb] -to [get_cells regb] -hold -end 1

语句中数字的含义:

  • -setup:表示该多周期路径所需要的时钟周期个数;
  • -hold:表示相对于缺省的捕获沿(图中的 dufault hold),实际捕获沿(图中 new hold)应回调的时钟周期个数;

参数时钟周期的选取:

  • -end 表示参数时钟为收端时钟,对于-setup 缺省为-end;
  • -start 表示参数时钟为发端时钟,对于-hold 缺省为-start;

6.2 发送、接收时钟周期相同,相位不同(跨时钟域)

6.2.1 接收时钟正相位差

Vivado中时钟约束的基本概念及用法

此时,建立时间仍是在发送寄存器发送上升沿后接收时钟第二个接收上升沿;保持时间为发送寄存器发送上升沿后接收时钟第一个上升沿;与同频同相情况约束相同。

set_multicycle_path -from[get_clocks clk1] -to[get_clocks clk2] -setup -end 2
set_multicycle_path -from[get_clocks clk1] -to[get_clocks clk2] -hold -end 1

6.2.2 接收时钟负相位差

Vivado中时钟约束的基本概念及用法

此时,建立时间仍为发送寄存器发送上升沿后接收时钟第一个接收上升沿;保持时间一定满足(为什么?);与正常周期情况情况约束相同,不再添加额外约束。

6.3 时钟频率不同

6.3.1 慢时钟向快时钟

Vivado中时钟约束的基本概念及用法

当发接收时钟频率是发送时钟整数倍时(此处以 2 倍为例),建立时间为接收时钟上升沿 2,建立时间为接收时钟上升沿 0。

set_multicycle_path -from[get_clocks clk1] -to[get_clocks clk2] -setup -end 2
set_multicycle_path -from[get_clocks clk1] -to[get_clocks clk2] -hold -end 1

5.3.2 快时钟向慢时钟

Vivado中时钟约束的基本概念及用法
set_multicycle_path -from[get_clocks clk1] -to[get_clocks clk2] -setup -start 2
set_multicycle_path -from[get_clocks clk1] -to[get_clocks clk2] -hold -start 1

七、设置伪路径

set_false_path -from -through -to

7.1 当路径不可能通时

Vivado中时钟约束的基本概念及用法

7.2 跨时钟域传输

Vivado中时钟约束的基本概念及用法

7.3 异步复位

Vivado中时钟约束的基本概念及用法

八、约束步骤

Vivado中时钟约束的基本概念及用法

注意:约束时尽量使用 port 和 cells,因为 net 可能会被优化。

扫码关注尚为网微信公众号

尚为网微信公众号
每天学习电路设计嵌入式系统的专业知识,关注一波,没准就用上了。

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/1278.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年9月12日 20:22
下一篇 2022年9月17日 21:50

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注