如果您是通过 PLL 输出连接 PLL 参考时钟,或者在 Arria® 10 设计中连接 PLL 参考时钟,则会引入额外的抖动。这种抖动可以通过在设计中的下游 PLL 输出时钟添加 100ps 时钟不确定性约束来获得补偿。
有关应用时钟不确定性限制的详细信息,请参阅以下文档。
Arria® 10 PLL Cascading 或非专用时钟路径变通方法指南
在将设计升级到 Quartus Prime 软件 v17.1 或更高版本时,需要修改之前添加的限制:
a) 如果现有的时钟不确定性仅来自 derive_clock_uncertainty set_clock_uncertainty-add -to -来自0.1
b) 如果当前的时钟不确定性来自derive_clock_uncertainty额外的"set_clock_uncertainty -add"v17.0:set_clock_uncertainty -add - 到 - 来自 0.1] v17.1 或更高版本:set_clock_uncertainty-add -to -来自
c) 如果derive_clock_uncertainty被"set_clock_uncertainty"(无-add)覆盖;无变化,需要保持现有限制set_clock_uncertainty -到 -来自 [expr 0.1]
如果受影响的下游 PLL Arria 10 PHYLite IOPLL,请按照以下步骤详细了解应用时钟不确定性限制的细节。
从 Quartus Prime 软件版本 17.0 开始,Arria 10 Altera PHYLite IP 参数编辑器中不再可见"使用内核 PLL 参考时钟连接"。建议的方法是使用专用时钟引脚将其连接到 PHYLite IOPLL 参考时钟。如果您的设计需要使用此特性,请仔细阅读以下指南,并遵守这些指南。
要启用"使用内核 PLL 参考时钟连接"(Quartus Prime 软件版本 17.0 及更高版本),请在 quartus.ini 文件中添加下面的 INI。
ip_altera_phylite_en_pll_core_ref_ck = 开启
a2t_allow_cascaded_pll_in_cpa_compensation=开启
当从 PLL 输出或非专用时钟引脚连接 PLL 参考时钟时,将引入额外的抖动。
对于使用 Arria 10 Altera PHYLite 版本 17.0 及之前实施的设计,可以通过在设计中下游 PLL 的输出时钟添加 100ps 时钟不确定性约束来补偿这种抖动。
针对 Quartus Prime 软件 17.0 版以及更早版本的 PHYLite 生成的 SDC 文件添加以下限制以消除时钟的不确定性。每次重新生成Altera PHYLite IP 时,您都需要做出以下更改。
1. 将 100ps 值分配到可变名称额外抖动。
设置additional_jitter 0.000
# 首先确定是否已创建参考时钟(即参考时钟共享)
如果 {$var(PLL_USE_CORE_REF_CLK)=="false"} {
设置ref_clock_exists [ phy_altera_phylite_arch_nf_171_flagyzi_does_ref_clk_exist $pins (pll_ref_clock)]
如果 { $ref_clock_exists == 0 } {
# 这是 PLL 用来在内核中派生任何其他时钟的参考时钟
create_clock - period $ref_period -waveform [ list 0 $ref_half_period ] $pins(pll_ref_clock) -add -name ${inst}_ref_clock
}
} 其他 {
设置additional_jitter 0.100
}
2. 在写入 FIFO 时钟上增加时钟的不确定性:
设置i_wf_clock 0
foreach_in_collection wf_clock $write_fifo_clk_neg {
设置vco_clock_id [phy_altera_phylite_arch_nf_171_flagyzi_get_vco_clk_id $wf_clock var]
如果 {$vco_clock_id == -1} {
post_message 型critical_warning"找不到 VCO 时钟"
} 其他 {
设置local_wf_clk_grp_${i_grp_idx}_${i_wf_clock} [ phy_altera_phylite_arch_nf_171_flagyzi_get_or_add_generated_clock \
-target [get_node_info -name $wf_clock] \
-名"${inst}_wf_clk_grp_${i_grp_idx}_$i_wf_clock}_neg" \
-source [get_node_info -name $vco_clock_id] \
-multiply_by 1 \
-divide_by [expr $var(PLL_VCO_TO_MEM_CLK_FREQ_RATIO)]
-第 180 相 ]
}
incr i_wf_clock
}
#new限制:
如果 {$additional_jitter != 0} {
set_clock_uncertainty -to [get_clocks ${inst}_wf_clk_grp_*] - 添加 $additional_jitter
}
3. 在写入路径上增加更多时钟不确定性:
如果 {[llength $write_clocks]>0} {
# 我们不需要derive_clock_uncertainty数字,因为我们已将 FLS JITTER 包含在set_output_delay
set_clock_uncertainty -to [get_clocks $write_clocks] [phy_altera_phylite_arch_nf_170_zul23qq_round_3dp [expr 0.5*($var(WR_SSO) $var(WR_JITTER_SCALED)) $additional_jitter ]]
}
4. read_clocks无变化
如果 {[llength $read_clocks]>0} {
# 我们不需要derive_clock_uncertainty数字,因为我们已将 FLS JITTER 包含在 set_input_delay
set_clock_uncertainty -到 [get_clocks $read_clocks] 0.0
}
5. 增加 c2p/p2c 传输的时钟不确定性 (phy_clk usr_clock)
如果 {$i_phy_clock > $same_tile_index} {
# C2P/P2C,其中外设块 != CPA 区块。
# 对于这些传输,SDC 明确覆盖时钟不确定性值。
因此,在超限时我们不得使用"添加"选项。
设置add_to_derived"
设置c2p_su [expr {$p 2c_c2p_multi_tile_clock_uncertainty [lindex $periphery_overconstraints 0] [lindex $periphery_clock_uncertainty 0]} additional_jitter]
设置c2p_h [expr {$p 2c_c2p_multi_tile_clock_uncertainty [lindex $periphery_overconstraints 1] [lindex $periphery_clock_uncertainty 1]} additional_jitter]
设置p2c_su [expr {$p 2c_c2p_multi_tile_clock_uncertainty [lindex $periphery_overconstraints 2] [lindex $periphery_clock_uncertainty 2]} additional_jitter]
设置p2c_h [expr {$p 2c_c2p_multi_tile_clock_uncertainty [lindex $periphery_overconstraints 3] [lindex $periphery_clock_uncertainty 3]} additional_jitter]
} 其他 {
# C2P/P2C,其中外设块 == CPA 块
# 对于这些传输,安全地使用-添加选项,因为我们依赖
derive_clock_uncertainty为基本值。
设置add_to_derived"-添加"
设置c2p_su [expr [lindex $periphery_overconstraints 0] [lindex $periphery_clock_uncertainty 0] additional_jitter/2]
设置c2p_h [expr [lindex $periphery_overconstraints 1] [lindex $periphery_clock_uncertainty 1] additional_jitter/2]
设置p2c_su [expr [lindex $periphery_overconstraints 2] [lindex $periphery_clock_uncertainty 2] additional_jitter/2]
设置p2c_h [expr [lindex $periphery_overconstraints 3] [lindex $periphery_clock_uncertainty 3] additional_jitter/2]
}
6. 在内核传输(usr_clock/额外内核时钟usr_clock/额外内核时钟)内增加时钟不确定性
设置c2c_same_su [expr [lindex $core_overconstraints 0] [lindex $core_clock_uncertainty 0] additional_jitter]
设置c2c_same_h [expr [lindex $core_overconstraints 1] [lindex $core_clock_uncertainty 1]]
设置c2c_diff_su [expr [lindex $core_overconstraints 2] [lindex $core_clock_uncertainty 2] additional_jitter]
设置c2c_diff_h [expr [lindex $core_overconstraints 3] [lindex $core_clock_uncertainty 3] additional_jitter]
foreach src_core_clock_local $core_clocks_local {
如果 {$src_core_clock_local != ""} {
foreach dst_core_clock_local $core_clocks_local {
如果 {$dst_core_clock_local != "} {
如果 {$src_core_clock_local == $dst_core_clock_local} {
# 相同的时钟网络传输
set_clock_uncertainty -从 $src_core_clock_local -到 $dst_core_clock_local -setup -add $c 2c_same_su
set_clock_uncertainty -从 $src_core_clock_local -到 $dst_core_clock_local -hold -enable_same_physical_edge -add $c 2c_same_h
} 其他 {
# 不同内核时钟网络之间的传输
set_clock_uncertainty -从 $src_core_clock_local -到 $dst_core_clock_local -setup -add $c 2c_diff_su
set_clock_uncertainty -从 $src_core_clock_local - 到 $dst_core_clock_local -hold -add $c 2c_diff_h
}
}
}
}
}
7. 对于涉及user_created_clock和 PHYLite 输出时钟的用户逻辑,用户需要在用户 sdc 文件中的时钟传输路径上添加额外的 100ps 时钟不确定性。
8. 报告 SDC 并查看 SDC 分配>Set 时钟不确定性报告,确保在受影响的时钟传输路径中添加额外的 100ps
9. 重新定时或重新编译设计,并确保时序收敛
10. 执行严格的硬件测试,以确保设计在投入生产之前正常工作
将设计升级到 Quartus Prime 软件 v17.1 或更高版本时:
a) 启动 IP 升级工具,将Arria 10 Altera PHYLite IP 升级到 v17.1
b) 使用内核 PLL 参考时钟时,生成的 PHYLite SDC 文件将添加所有必要的时钟不确定性。
c) 之前涉及user_created_clock和 PHYLite 输出时钟的用户逻辑路径添加了额外的 100ps 时钟不确定性,需要保留在用户 sdc 文件中。
d) 对设计执行完整编译,并确保时序收敛。