加速器卡中时钟的处理方式已演变为支持多个平台时钟和多个时钟频率。内核可包含的独立时钟和边缘对齐时钟数量不存在限制,平台可包含多个内核,这些内核以不同时钟频率运行并受用户控制。平台可包含可缩放时钟和固定时钟。
- 可缩放时钟
-
Alveo™ 平台可提供频率可缩放的内核时钟 (ID 0),用于驱动所有 XRT 管理的内核。XRT 可在加载 xclbin 文件时,根据其中包含的元数据来设置此时钟的时钟频率。Alveo 平台还提供了另一个可缩放时钟 (ID 1),XRT 同样可根据 xclbin 元数据来控制该时钟。您无需提供选项以连接到可缩放时钟,但可在
v++
链接期间使用--kernel_frequency
命令指定时钟频率,如 Vitis 编译器常规选项 中所述。例如,v++
连接器将自动把内核时钟ap_clk
连线到时钟 ID 0,并把ap_clk2
连接到 ID 1。提示: 实际上,由于 Vitis HLS 不生成含多个时钟的内核,因此ap_clk2
主要用于 RTL 内核。 - 固定时钟
-
您可生成任意数量的衍生时钟,这些衍生时钟不受 XRT 控制。
v++
连接器可提供 --clock 选项 供用户用于指定各内核时钟管脚应连接到的对应时钟,并用于定义平台上未定义的时钟频率。固定时钟更常用于嵌入式平台和 RTL 内核。指定
--clock
选项即可指令v++
使用平台的固定时钟,而不是可缩放时钟。对于 HLS 内核,始终使用时钟 ID 0。对于含单个时钟的 RTL 内核,默认使用时钟 ID 0,但您也可以选择其它时钟。
可缩放时钟可用于对时钟本身进行缩放,而固定时钟则用于添加 MMCM 以生成与平台上定义的频率不同的频率。例如,如果您选择指定时钟频率 60、200 和 450,那么 Vitis 将添加所有必要的逻辑以生成所需时钟。
如果 Vivado 布局布线工具无法满足频率规格的要求,那么已使用可缩放时钟 (--kernel_frequency
) 的前提下,这些工具可将时钟频率缩放至可满足规格的频率。如果使用固定时钟 (--clock
),则将需要重新运行实现才能更新频率目标。
platforminfo
命令判定目标平台中可用的时钟。例如,以下命令可返回与 U250 平台的新 shell 相关的详细信息:platforminfo -v -p xilinx_u250_gen3x16_xdma_3_1_202020_1 -o pfmClocks.txt
=================
Clock Information
=================
Default Clock Index: 0
Default Clock Frequency: 300.000000
Default Clock Pretty Name: PL 0
Clock Index: 0
Frequency: 300.000000
Name: ss_ucs_aclk_kernel_00
Pretty Name: PL 0
Inst Ref: ss_ucs
Comp Ref: shell_ucs_subsystem
Period: 3.333333
Normalized Period: .003333
Status: scalable
Clock Index: 1
Frequency: 500.000000
Name: ss_ucs_aclk_kernel_01
Pretty Name: PL 1
Inst Ref: ss_ucs
Comp Ref: shell_ucs_subsystem
Period: 2.000000
Normalized Period: .002000
Status: scalable
Clock Index: 2
Frequency: 50.000000
Name: ii_level1_wire_ulp_m_aclk_ctrl_00
Pretty Name: PL 2
Inst Ref: ii_level1_wire
Comp Ref: ii_level1_wire
Period: 20.000000
Normalized Period: .020000
Status: fixed
Clock Index: 3
Frequency: 250.000000
Name: ii_level1_wire_ulp_m_aclk_pcie_user_00
Pretty Name: PL 3
Inst Ref: ii_level1_wire
Comp Ref: ii_level1_wire
Period: 4.000000
Normalized Period: .004000
Status: fixed
Clock Index: 4
Frequency: 100.000000
Name: ii_level1_wire_ulp_m_aclk_freerun_ref_00
Pretty Name: PL 4
Inst Ref: ii_level1_wire
Comp Ref: ii_level1_wire
Period: 10.000000
Normalized Period: .010000
Status: fixed
以下是按优先顺序由低到高使用 --clock 选项 进行时钟管理的部分示例:
- 如无任何
--clock
选项,则将应用可缩放默认时钟。对于含两个时钟的内核,将为 ap_clk 分配时钟 ID 0,为 ap_clk_2 分配时钟 ID 1。 - 指定
--clock.defaultId=<id>
即可覆盖平台默认设置。除非指定额外--clock
选项,否则指定的时钟 <id> 将用作为所有 CU 上的所有管脚的参考时钟。 - 指定
--clock.defaultFreq=<Hz>
即可覆盖含有指定频率的时钟的平台默认设置。除非指定额外--clock
选项,否则将向所有 CU 上的所有管脚分配默认时钟。 - 指定
--clock.id=<id>:<cu>
即可向指定 CU 上的所有时钟管脚分配指定 ID。 - 指定
--clock.id=<id>:<cu>.<clk0>
即可向指定 CU 上的指定时钟管脚分配指定 ID。
实际上有多个高层次注意事项需要考量。可缩放时钟允许工具按需缩放时钟以达成特定频率或者满足时序,因此无需重新生成 .xclbin 文件即可帮助您满足时序。
如果设计要求不同内核以不同时钟速率运行(例如,为了达成时序收敛或者满足性能目标),就需要使用 --clock
指令来确定固定时钟目标。同样,如果 RTL 内核需要多个时钟,那么通常需要使用 --clock
指令。大部分严肃设计都期望用户在某个时间点能明确自己可达成的频率目标,并且在超出可缩放时钟频率时需指定这些固定时钟(缩放不会将已缩放的时钟频率增至超过平台默认设置)。