“Schedule Viewer”(调度查看器)可提供已综合 RTL 的详细视图,用于展示功能的每个操作和控制步骤,以及执行步骤的时钟周期。它有助于您识别阻碍并行化的任意循环依赖关系、时序违例以及数据依赖关系。
默认情况下,“Schedule Viewer”显示在“Analysis”(分析)透视图中。您可在“Module Hierarchy”(模块层级)窗口中右键单击模块并从菜单中选择Open Schedule Viewer来将其打开。
在“Schedule Viewer”中:
- 左侧纵轴显示的是 RTL 层级中的操作和循环的名称。操作按拓扑顺序执行,这暗示行
n
上的操作只能由前一行的操作驱动,并且只能驱动后一行中的操作。根据发现的违例类型,“Schedule Viewer”会显示每项操作的额外信息。- Resource limitation:即“资源限制”;显示操作类型(读/写)、使用的存储器类型(RAM_1p 或 RAM_2p)。在下图中,
vecIn
对应双端口 RAM 存储器,它正在单次迭代内尝试执行 3 次读取。这导致由于资源限制而出现 II 违例,并且工具当前会高亮显示在加载操作的下一个周期内调度的操作。 - Dependency:即“依赖关系”;显示有关迭代的信息,这些迭代中包含循环进位依赖关系。例如,某项读取传输事务可能与前一个写入值之间存在依赖关系。
- Resource limitation:即“资源限制”;显示操作类型(读/写)、使用的存储器类型(RAM_1p 或 RAM_2p)。在下图中,
- 顶部横轴显示连续的时钟周期。
- 每个时钟周期内的竖轴虚线显示由于时钟不确定性而保留的时钟周期部分。此时间即工具保留用于 Vivado 后端进程(如布局布线)的时间。
- 每项操作在表中均显示为灰框。根据操作延迟占总时钟周期百分比来设置此框的横向大小。对于函数调用,提供的周期信息与操作时延相等。
- 多周期操作显示为灰框,框中间有一条水平线贯穿。
- “Schedule Viewer”还会将常规运算符数据依赖关系显示为蓝色实线。如下图所示,选择操作时,您可看到实体蓝色箭头高亮特定的运算符依赖关系。这使您能够对数据依赖关系执行详细分析。绿色虚线表示相互迭代数据依赖关系。
- 存储器依赖关系则以金色线条来显示。
- 此外,源代码行与“Schedule Viewer”报告中的每项操作相关联。右键单击操作即可使用Goto Source命令打开与操作关联的输入源代码。
在下图中,选中名为 RD_Loop_Row
的循环。这是经流水打拍的循环,在循环栏中已显式声明启动时间间隔 (II)。所有流水打拍循环均处于以可视化方式展开状态,这表示在调度查看器中显示 1 次完整迭代。II 定义的重叠以循环标记上加粗的时钟边界来标记。
单次迭代的总时延等同于循环标记所覆盖的周期数。在此情况下,总时延为 3 个周期。
“Schedule Viewer”会在报告右上角显示一个菜单栏,其中包含以下功能特性:
- 一个下拉菜单,初始以Focus Off标记,允许您在报告中指定要选中的操作或事件。
- 一个文本搜索框,用于搜索特定操作或步骤 (),并使用Scroll Up或Scroll Down在与搜索文本匹配的对象列表中上下滚动。
- Zoom In、Zoom Out和Zoom Fit命令 ()。
-
Filter命令 () 允许您动态筛选该查看器中显示的操作。您可按类型或者按分群的操作来进行筛选。
- 按类型筛选可根据操作的功能来限制显示的操作。例如,仅将加法器、乘法器和函数调用可视化会移除“和”与“或”之类的所有小操作。
- 按集群筛选的作用是充分利用调度程序的功能对基本操作进行分组,然后将其作为单个组件来调度。可启用集群筛选设置来为集群上色,甚至可在查看器内将集群折叠为单一大型操作。这样即可提供更简洁的调度视图。
您可使用Schedule Viewer中的下拉菜单快速定位 II 违例,如上图所示。您也可以通过Module Hierarchy视图中的上下文菜单来选中该违例。
要定位导致源代码中出现违例的操作,请右键单击此操作并使用Goto Source命令或者双击该操作,这样将显示源码查看器,并识别源码中的对象的根源。
在Module Hierarchy视图上下文菜单中或者使用Schedule Viewer菜单中的下拉菜单也可以快速找到时序违例。时序违例是一条操作路径,其所需时间超过可用时钟周期。为便于直观显示,在Schedule Viewer中会以红色框显示存在问题的操作。
默认情况下,其中可显示关键时序路径中的每项操作之间的所有依赖关系(蓝色线条)。
属性视图
如上图所示,在Schedule Viewer的底部有一个Properties视图,该属性视图可显示Schedule Viewer中当前选中的对象的属性。它可便于您查看Schedule Viewer中选中的特定函数、循环或操作的详细信息。可选中的元素类型以及显示的属性包括:
- 函数或循环
- Initiation Interval (II)
- 即“启动时间间隔”;表示函数或循环可接受新输入数据之前的时钟周期数。
- Loop Iteration Latency
- 即“循环迭代时延”;表示完成循环的单次迭代所需的时钟周期数。
- Latency
- 即“时延”;表示函数计算所有输出值或者循环完成所有迭代所需的时钟周期数。
- Pipelined
- 即“流水打拍”;表示在 RTL 设计中对函数或循环进行流水打拍。
- Slack
- 即“裕量”;表示函数或循环的时序裕量。
- Tripcount
- 即“循环次数”;表示循环完成的迭代数。
- Resource Utilization
- 即“资源利用率”;显示用于实现函数或循环的 BRAM、DSP、LUT 或 FF 的数量。
- 运算和存储映射
- Name
- 即“名称”;对应包含代码的位置。
- Op Code
- 即“运算码”;表示调度的运算,例如,
add
、sub
和mult
。如需了解更多信息,请参阅 BIND_OP 或 BIND_STORAGE 编译指示或指令。 - Op Latency
- 即“运算时延”;显示运算或存储的绑定的默认时延或指定时延。
- Bitwidth
- 即“位宽”;对应运算的位宽。
- Impl
- 即“实现”;定义用于指定运算或存储的实现。