FPGA_动态功能切换_DFX RTL工程流程
接上一篇UltraScale DFX流程,本篇为RTL project流程
需要注意的是例程面向
- KCU116 (Kintex® UltraScale+™)
- VCU118 (Virtex® UltraScale+™)
- KCU105 (Kintex UltraScale)
- VCU108 (Virtex UltraScale)
- KC705 (Kintex-7)
- VC707 (Virtex-7)
- VC709 (Virtex-7)
这几块开发板,跑完之后看看能不能改到手上的板子。
一、解压例程
根据ug947文档提示在赛灵思官网下载例程压缩包,解压定位到 \dfx_project 文件夹。
二、加载初始源设计
任何 DFX 设计流程(基于项目或其他)的第一个唯一步骤是定义将被标记为可重新配置的设计部分。这是通过项目模式下分层源视图中的上下文菜单完成的。这些步骤将通过在简单设计中定义分区来完成初始项目创建。
-
从档案中提取设计。 dfx_project 数据目录在本教程中称为 <Extract_Dir>。
-
打开 Vivado® IDE 并选择 Create Project,然后单击 Next。
-
选择 <Extract_Dir> 作为项目位置。将项目名称保留为 project_1,并选中创建项目子目录选项。点击下一步。
-
选择 RTL 项目并确保此时不指定源复选框未选中,然后单击下一步。
-
单击 Add Directories 按钮并选择要添加到设计中的这些 Sources 目录:
- <Extract_Dir>\Sources\hdl\top
- <Extract_Dir>\Sources\hdl\shift_right
-
单击下一步进入添加约束页面,然后选择这些文件:
- <Extract_Dir>\Sources\xdc\top_io_<board>.xdc
- <Extract_Dir>\Sources\xdc\pblocks_<board>.xdc
请注意,这些约束文件是完整的设计约束,仅限于顶层设计。如果您想执行自己的布局规划,只需选择 top_io xdc,省略 Pblocks XDC。综合后停止流程以创建您自己的平面图。
-
单击下一步选择部件。在 Default Part 页面中,单击 Boards 并选择与您选择的约束文件匹配的目标板。然后单击下一步,然后单击完成以完成项目创建。 Sources 窗口显示设计的标准分层视图。
此时,打开了一个标准项目。没有针对 Dynamic Function eXchange 做任何事情。 -
选择工具 → 启用动态函数交换。
这为 DFX 设计流程准备了项目。一旦设置,就无法撤消,因此请在选择此选项之前存档您的项目。
在随后出现的对话框中,单击转换以将此项目转换为 DFX 项目。
完成后左侧会出现DFX向导,但是还没有创建分区定义,暂时无法使用。 -
右键单击“shift”实例之一并选择“创建分区定义”选项。
此操作会将两个 shift 实例定义为设计中的可重新配置分区。由于每个实例都来自相同的 RTL 源,因此它们在逻辑上是相同的。将运行上下文外综合以使该模块与顶部分离,并且一个综合后检查点将用于两个 shift 实例。
提示:如果设计中有同一模块的多个实例化,但并非所有实例都需要重新配置,则必须手动修改模块以使其成为唯一的。然后,您可以将所需的实例单独标记为可重新配置的分区。
-
在出现的对话框中,为 Partition Definition 和 Reconfigurable Module 命名。分区定义是所有可重新配置模块都将插入其中的工作区的一般参考,因此请给它一个适当的名称,例如 shifter。 Reconfigurable Module 引用这个特定的 RTL 实例,因此给它一个引用其功能的名称,例如 shift_right,然后单击 OK。
Sources 窗口现在略有变化,两个 shift 实例现在都显示为黄色菱形,表示它们是 Partitions。您还将在此窗口中看到一个分区定义选项卡,其中显示了设计中所有分区定义(此时为一个)的列表和内容。此外,还创建了一个脱离上下文的模块运行,用于合成 shift_right 模块。
此时,可能会添加更多 Reconfigurable Module 源。这是通过动态函数交换向导完成的。
重要!定义分区后,必须通过 DFX 向导添加所有其他 RM,并且还必须通过此向导完成对 RM 源、配置和运行的任何管理。
三、使用动态函数切换(DFX)向导完成设计
-
通过在工具菜单下或Flow Navigator中选择此选项来启动Dynamic Function eXchange Wizard。
-
单击 Next 进入 Edit Reconfigurable Modules 页面。在这里您可以看到 shift_right RM 已经存在,并且在窗口左侧的 RM 上方有添加、删除和编辑按钮。单击蓝色 + 图标以添加新的 RM。
-
单击添加目录按钮选择 shift_left 文件夹:
<Extract_Dir>\Sources\hdl\shift_left
或者使用 Add Files 按钮选择驻留在此目录中的 shift_left.v 文件。如果需要模块级约束,将在此处添加它们。请注意,它们需要限定在此分区的层次结构级别。
将 Reconfigurable Module 字段填写为 shift_left。将 Partition Definition 设置为 shifter,将 Top Module 字段留空,并且 Sources are already综合复选框未选中。单击确定以创建新模块。
现在有两个可重构模块可用于移位器可重构分区。
在下一页上,定义了配置。配置是由静态设计和每个 RP 一个 RM 组成的完整设计图像。您可以创建任何所需的配置集,也可以让向导为您选择它们。 -
让向导通过选择自动创建配置链接来创建配置。
选择此选项后,已创建最小的两个配置集。每个 shift 实例在第一个配置中被赋予 shift_right,在第二个配置中被赋予 shift_left。请注意,配置名称是可编辑的——在下面的示例中,名称已更新为 config_right 和 config_left 以反映每个模块中包含的可重新配置模块。
使用这两个可重配置模块可以创建其他配置,但是创建此版本设计所需的所有部分比特流只需要两个,因为任何 RP 的最大 RM 数量是两个。 -
单击下一步进入编辑配置运行页面。
与配置本身一样,用于实现每个配置的运行可以自动或手动创建。父子关系将定义运行如何交互——父运行实现静态设计和该配置中的所有 RM,然后子运行重用锁定的静态设计,同时在已建立的上下文中实现该配置中的 RM。 -
单击automatically create configuration run链接以使用最少的运行集填充配置运行页面。
这将创建两个运行,由一个父配置 (config_right) 和一个子配置 (config_left) 组成。可以在此向导中创建任意数量的独立或相关运行,并可选择为其中任何一个使用不同的策略或约束集。现在,将此设置保留为此处设置的两次运行。请注意,运行的名称不可编辑。 -
单击 Next 以查看 Summary 页面,然后单击 Finish 完成设计设置并退出向导。
重要!在您单击完成退出 DFX 向导之前,不会创建或修改任何内容。在最后一次单击之前,所有操作都会排队,因此可以根据需要前进和后退,而无需实施更改,直到您准备好为止。
回到 Vivado® IDE,您将看到 Design Runs 窗口已更新。为 shift_left RM 添加了第二个上下文外综合运行,并在父 (impl_1) 下创建了子实现运行 (child_0_impl_1)。您现在已准备好处理设计。
四、综合和实现当前设计
在 Vivado® IDE 中打开上述设计后,检查 Design Runs 窗口。顶层设计综合运行 (synth_1) 和父实现运行 (impl_1) 标记为“active”。 Flow Navigator 操作适用于这些活动运行及其子运行,因此单击 Run Synthesis 或 Run Implementation 将仅通过这些运行以及完成它们所需的 OOC 综合运行来拉动设计。您可以选择特定的父或子实现运行,右键单击并选择启动运行以拉动该最终目标的整个流程。
-
在 Flow Navigator 中,单击 Run Synthesis → Open Synthesized Design。
注意!!!!
我在这一步综合出错,无法继续,报错信息已提交赛灵思中文论坛:https://support.xilinx.com/s/question/0D54U00005WboT1SAJ/在跑ug947文档dfx-rtl-project-flow例程时第四步综合报错报错信息如detail中图文档版本为20221目标版选择为kcu105?language=en_US。
改用2020版本文件后正常综合,然后我又重新下载2022版本例程文件,并且用一样的流程到综合这里,仍然报相同的错误,因此本文接下来均以2020版例程文件为基础。该动作将综合所有OOC模块,然后综合顶层设计。
这与任何带有 OOC 模块(IP 或其他)的设计没有什么不同。
在打开的综合后设计中,请注意已经定义了两个 Pblock。这些在 pblocks_<board>.xdc 中提供,并映射到顶部的两个shift实例。如果设计源中不存在任何 Pblock,则可以在流程中的这一步创建它们。这可以通过右键单击设计层次结构中的 inst_shift 实例来选择 Floorplanning → Draw Pblock 来完成。每个实例都需要自己独特的 Pblock(在上一篇文章中UltraScale flow中有创建pblock这一步骤)。
-
在平面图中选择两个 Pblock 之一并注意其属性。列出的最后两个属性是 RESET_AFTER_RECONFIG(仅限 7 系列)和 SNAPPING_MODE,这是 DFX 特有的两个属性。请注意,这两个选项都已在 Pblocks xdc 中启用。
-
通过选择 Reports → Report DRC 运行 DFX 特定的设计规则检查。为了节省时间,您可以取消选择除 Dynamic Function eXchange 之外的所有复选框。
DRC 检查将报告提供的源和约束没有错误。可能会为某些设备提供咨询消息,并提供有关如何提高给定 Pblock 质量的建议。对于这个简单的设计,这些可以忽略不计。
如果您创建了自己的平面图并且报告了 DRC,请在继续之前解决问题。请注意,这两个模块都需要 BRAM 资源,并记住 SNAPPING_MODE 将解决与水平或垂直对齐相关的任何错误。提示:尽早并经常运行 DFX 设计规则检查。
-
在 Flow Navigator 中,选择 Run Implementation 以在所有配置上运行布局布线。
此操作首先为 impl_1 运行实现,然后为 child_0_impl_1 运行。在幕后,Vivado 负责处理所有细节。除了在满足所有 DFX 要求的情况下为两次运行运行布局和布线之外,它还执行了一些特定于 DFX 的任务。 impl_1 完成后,Vivado 自动:- 为每个路由 shift_right RM 写入模块级 (OOC) 检查点。
- 在每个 RP 中挖掘逻辑,为顶部创建仅静态的设计图像。这是通过为每个实例调用 update_design -black_box 来完成的。
- 锁定设计中纯静态部分的所有布局和布线。这是通过调用 lock_design 级路由来完成的。
- 保存锁定的静态父图像以供所有子运行重复使用。
此外,当子运行完成时,会为路由的 shift_left RM 创建模块级检查点。锁定的静态设计图像将与父图像相同,因此不需要此步骤。
如果只需要特定的配置运行,则可以在“Design Runs”窗口中单独选择这些配置。请注意,必须先成功完成父运行,然后才能启动子运行,因为子运行从父运行锁定静态设计开始。
-
实施完成后,在弹出的对话框中单击取消。
警告!即使设计已经处理到子实现运行,默认情况下,选择 Open Implemented Design 会打开父运行。使用下拉选项选择所需的实施运行。
此时,还剩下两个步骤。首先是运行 PR 验证来比较两种配置,以确保设计图像的静态部分的一致性。强烈建议执行此步骤,并将在 Vivado 项目中自动执行。第二步是自己生成比特流。 -
在Flow Navigator中,单击Generate Bitstream。此操作在活动父运行上启动比特流生成,并启动 PR 验证,然后在所有实现的子运行上启动比特流生成。
对于每次配置运行,默认情况下都会生成完整和部分比特流。
整个 Dynamic Function eXchange 流程可以在项目环境中运行。从模块级综合到比特流生成的所有步骤都可以在不离开 GUI 的情况下完成。
五、添加额外的可重构模型和相应的配置
-
在 Vivado IDE 中打开设计后,打开 Dynamic Function eXchange Wizard。
-
在 Edit Reconfigurable Modules 页面上,单击 + 按钮添加新 RM。
-
选择 <Extract_Dir>\Sources\hdl\shift_right_slow 中的 shift_right_slow.v 文件,然后单击 OK。
-
输入 shift_right_slow 作为 Reconfigurable Module 名称,然后单击 OK 和 Next。
请注意,在“编辑配置”页面上,不再有自动创建配置的选项,因为您已经有两个现有配置。您可以通过删除所有现有配置重新启用此选项,但这将重新创建所有配置并删除所有现有结果。 -
单击 + 按钮创建新配置,输入名称 config_right_slow,然后按 ENTER。为每个 Reconfigurable Partition 实例选择 shift_right_slow。
-
单击下一步进入配置运行。使用 + 按钮创建具有以下属性的新配置:
- 运行:child_1_impl_1 - 这与现有约定简单匹配
- 父级:impl_1 - 这使此配置成为现有父级运行的子运行
- 配置:config_right_slow - 这是一个使用刚刚定义的新 RM
-
单击ok添加新的配置运行。
这个新配置作为现有 impl_1 的子项,将重用静态设计实现结果,就像 config_left 一样。现在存在三个运行,其中两个作为初始父级的子级。绿色复选标记表示其中两个运行当前已完成。
-
单击下一步,然后单击完成以构建这个新的配置运行。
-
选择这个新的子实现运行,右键单击并选择 Launch Runs。这将在 shift_right_slow 模块上运行 OOC 综合,然后在锁定静态设计的上下文中实现该模块。
六、创建和实现灰盒模块
对于某些设计,所需的设备初始配置可能是在可重配置分区中没有驻留功能的映像。或者也许还没有可重新配置的模块可以实现。灰盒配置可用于仅实现静态设计,而无需提供真正的 RM 网表。
灰盒是一个以黑盒开始的模块,但随后会为所有端口自动插入 LUT。输出端口被驱动为逻辑 0(默认情况下,1 可通过属性选择),因此它们不会浮动。即使没有可用的 RM,该模块也允许处理设计。培训脚本可用于为该灰盒图像创建时序预算,优化静态设计的实现结果。具有灰盒 RM 的配置可以作为父运行,但仅在不存在其他 RM 和/或使用预算约束来优化 RP 接口布局时才建议这样做。
- 打开动态功能交换 (DFX) 向导并移动到配置页面——在这种情况下不需要定义新的可重新配置模块,因为这是一个专用功能。创建一个名为 config_greybox 的新配置,并为每个 Reconfigurable Partition 实例输入 <greybox>。
- 单击下一步进入配置运行页面,然后创建另一个新配置运行,这次是灰盒配置。
- 父级:synth_1 – 这使得该配置成为新的父级,从综合顶层设计开始
- 配置:config_greybox – RM 仅包含 LUT 绑定
- 运行:impl_greybox
- 单击下一步,然后单击完成以创建此新运行。
现在,Design Runs 窗口中显示了四个实现运行和三个脱离上下文的运行。请注意,灰盒模块不需要综合——它是 DFX 解决方案中的嵌入式功能。
此时可以实现灰盒配置。 - 选择 impl_greybox 设计运行,右键单击并选择 Launch Runs。 Flow Navigator 不会启动此运行,因为它不是活动父级。
重要!因为 impl_1 和 impl_greybox 都是双亲,所以它们的静态设计结果会有所不同,并且它们生成的比特流在硬件上将不兼容。只有从单个父级派生的比特流(随后使用 PR 验证进行确认)才能通过动态功能交换 (DFX) 传送到设备。
七、修改设计源或选项
Vivado IDE 跟踪设计运行之间的依赖关系。考虑到配置的相互依赖性,这是 Dynamic Function eXchange 的一个关键特性。如果修改了父配置或实现结果的任何方面,则必须重新编译它和所有子代。
- 选择 impl_1 design run。
- 在 Run Properties 窗口的 Options 选项卡中,将 Strategy 更改为 Performance_Explore。
一个弹出对话框将提醒您,如果您继续,impl_1 将被强制过期。 - 单击是。
多个运行现在被标记为过期:impl_1 和依赖它的两个子运行。生成的文件仍然存在于它们各自的文件夹中,但会在父运行启动后立即删除。另一方面,impl_greybox 设计运行仍然完成,因为它不依赖于 impl_1 作为父代。
请注意,每个子运行的 Strategy 选项保持在 Vivado Implementation
Defaults;子运行不继承父运行的选项。但是,子运行中的任何策略或选项只会对 Reconfigurable Module 实施产生影响,因为静态设计已经路由并锁定。 - 在 Flow Navigator 中,单击 Run Implementation。
将出现一个对话框,确认您是否要在继续之前重置运行。因为过时的步骤是父运行的第一步,所以第一个选项将父运行和所有子运行完全重置到执行的开始。单击重置并重新运行或从步骤运行:phys_opt_design 继续。
这实现了所有三个运行。首先,父 impl_1 运行将完成,然后两个子运行将并行运行。
总结
Dynamic Function eXchange Project Flow 具有很大的灵活性,使用户能够管理他们的设计环境并探索不同的选项。用户必须仔细跟踪实现结果和比特流,以确保只有从单个固定静态图像构建的兼容比特流被下载到目标设备。
参考:ug947-2022.1