原文
第 5 章:IP Integrator 中的协同设计
随着 AMD 硅片产品复杂度的提升,利用这些先进特性的设计也往往规模更大、复杂度更高。此外,随着不同领域设计能力的增加,通常会有更多团队成员参与设计过程。为了提高设计周期的生产率,软件设计工具必须具备支持协同设计、并尽可能缩短设计过程的能力,这一点变得愈发重要。
本章介绍 Vivado IP integrator 中的若干功能,它们使设计团队能够以切实有效的方式实现以下目标:
- 通过块设计容器(Block Design Container)的模块化设计提升生产率。
- 借助版本控制(Revision Control)实现设计源文件的高效维护。
- 通过更便捷的设计迭代与复用,改善性能和互操作性。
使用块设计容器(BDC)的模块化设计
IP integrator 支持模块化、层次化的系统设计方法,允许设计人员组合模块化的构建块,并在构建各种解决方案时有效地复用它们。这些块可以看作设计库中的可复用组件,使设计团队在协作项目时更加高效。
块设计容器简介
块设计容器(Block Design Container,BDC)扩展了 Vivado IP Integrator 中层次化块的能力。层次化块(hierarchical block)在块设计(BD)中创建一个新的层次级别,其中可以包含任意数量的用户选定 IP 块。而 BDC 功能则将层次化块连同其内部内容一起转变为一个块设计(BD)本身。生成的 BD 被定义为一个.bd设计源文件,也可以用作另一个块设计工程的一部分。
此功能提供了诸多实用的好处,包括:
- 将大型块设计划分为 BDC 子块,每个块设计可以独立开发。
- 在画布上复制 BDC 内容。
- 在不同的 IP integrator 工程之间复用
.bd设计源文件。
创建块设计容器
自顶向下设计流程(Top Down Design Flow)
在此流程中,首先创建顶层块设计的图面。然后,设计人员或团队负责人在顶层块设计中创建适当的层次,将一组 IP 块下推(push)到作为子块的块设计容器中。按顺序执行以下步骤,在图面中创建块设计容器:
在顶层块设计中创建一个层次级别。如"创建层次"一节所述,选中一个或多个 IP 块,右键点击并选择Create Hierarchy,在图面中创建一个层次化块。
创建层次化块并将所需的 IP 块包含其中后,运行Validate Design(验证设计)。
设计验证成功后,右键点击该层次化块,选择Create Block Design Container,如下图所示。
图 133:Create Block Design Container 命令(图略,见原文)
为该块设计容器指定名称。
IP integrator 随后会为该层次级别创建一个新的块设计容器(BDC),其中包含所选的块。请注意以下几点:
- 上一步指定的 BDC 名称会被赋予该 BDC 的
.bd源文件。例如,在下图中,BDC_0是为该 BDC 指定的名称,因此BDC_0.bd就是所创建.bd源文件的名称。
- 上一步指定的 BDC 名称会被赋予该 BDC 的
图 134:块设计容器(图略,见原文)
- BDC 的
.bd源文件会被添加到工程源文件中,如下图所示。
图 135:Sources 窗口中的 BDC(图略,见原文)
自底向上设计流程(Bottom Up Design Flow)
在此流程中,各子块设计是分别创建的,然后你需要在顶层块设计中将这些子块例化为 BDC。设计人员或团队负责人可以按以下步骤完成全部集成:
按照"添加已有块设计"一节所述,将现有子块的源文件添加到顶层 BD 工程中。
将添加的 BD 从 Sources 窗口拖放到顶层 BD 图面上。或者,在顶层 BD 图面上右键点击并选择Add Module。
使用块设计容器
在顶层 BD 内查看块设计容器的内容
子块设计层次的内容可以从顶层块设计的图面直接查看。你可以以只读模式打开并查看子块设计中任何 IP 的配置 GUI,但无法从顶层 BD 更改子块设计的内容。
将更改应用到块设计容器
将 BDC 添加到顶层块设计图面(或在其中创建)之后,无法从顶层块设计图面直接编辑 BDC。对块设计容器内容的所有后续更改都必须在该 BDC 的源块设计中进行:你必须打开 BDC 的.bd源文件,进行更改(如添加或移除 IP 块),验证设计,并保存该源块设计。
注:要修改某个 BDC,在 Sources 窗口中双击其 BD 源文件;或者,在顶层 BD 图面中右键点击该 BDC 实例并选择Open Source。BDC 的更改同步完成后,必须在顶层设计上生成输出产品,而不是在源块 BD 上。
在 BDC 与顶层 BD 之间同步更改
将 BDC 添加到顶层块设计图面(或在其中创建)之后,当 BDC 的源块设计保存了更改时,工具会自动检测到。此时顶层块设计中会弹出Refresh Changed Modules(刷新已更改模块)横幅,如下所示。你随后即可将 BDC 的更改同步到顶层块设计。
图 136:Refresh Changed Modules 横幅(图略,见原文)
注:仅在同一个 Vivado 进程内支持 BDC 与顶层 BD 之间的更改同步。
注:当父 BD 选择了 Freeze boundary(冻结边界)时,Refresh 对边界差异不起作用。
顶层 BD 内 BDC 的地址分配
BDC 源块设计中地址分配的任何更改都不会反映到顶层块设计中。由于子块设计会适配顶层块设计的地址分配规范,源 BD 的本地地址分配对顶层块设计而言会失效。
BDC 子块的所有地址分配都必须从顶层块设计进行。顶层块设计的地址编辑器(如下所示)提供了子块设计中所有 IP 的全部地址信息,并允许你查看和更改子块设计的地址。
图 137:顶层 BD 内 BDC 的地址分配(图略,见原文)
除了查看和更改子块设计的地址之外,你还可以:
- 在顶层块设计中,将主设备映射到子块设计内部的从设备,或反之。
- 修改子块设计的地址分配,使其适配顶层块设计的孔径(aperture)。
- 查看同一源块设计的多个例化——它们各自的主、从设备具有不同的地址集合。
从顶层 BD 配置块设计容器
你可以通过打开 Customize Block Design Container 对话框访问 BDC 的若干设置。打开方式:在顶层块设计图面中双击该 BDC,或右键点击所需 BDC 并选择Customize Block。BDC 选项如下图所示。
图 138:BDC 的 Customize Block Design Container 对话框(图略,见原文)
Freeze the Boundary of this Container(冻结此容器的边界)
此选项可阻止修改 BDC 边界的更改。边界包括 BDC 的端口、接口、端口映射(port map)、端口位宽和参数。选中此选项后,BDC 边界上的任何内容都不会改变:所有接口的端口映射都会保留,端口位宽不会变化,也没有参数(clk_domain属性除外)会在顶层块设计与 BDC 之间双向传递。
Enable Dynamic Function eXchange on this container(在此容器上启用 DFX)
BDC 在 IP integrator 中提供了一个以 IP 为中心、基于工程的环境,用于在 Vivado 中创建 DFX(Dynamic Function eXchange,动态功能交换)设计。BDC 代表可重配置分区(Reconfigurable Partition,RP);Enable Dynamic Function eXchange on this container选项可将 BDC 转换为 RP。BDC 转换后,其图标会变为显示 DFX 标签。
你可以为该 RP 实例向 BDC 添加多个变体(variant)作为可重配置模块(Reconfigurable Module,RM)。对于给定 RP 的每个 RM,其端口列表必须完全一致——即使并非每个 RM 都使用全部端口。
工程需要先通过选择Tools → Enable Dynamic Function eXchange转换为 DFX 工程,才能在 Vivado IDE 中启用 DFX 功能。
重要!当对包含 DFX BDC 的设计运行Generate Block Design时,此转换会自动发生,且在这种情况下不会就这一单向转换给出任何警告。不过,你仍然可以在生成块设计之前直接设置该 Tools 选项。
关于 DFX 设计中 NoC INI 用法的常见场景列表,以及更多细节与建议的修复方法,请参见《Vivado Design Suite 用户指南:Dynamic Function eXchange(UG909)》。
指定用于综合和/或仿真的 BDC 变体
你可以为块设计容器指定不同的源文件。不同的源文件可以看作一个 BDC 的变体(variant)。BDC 的各变体在 BDC 既定边界之内的 IP 块上可以不同。添加了变体源块设计后,你可以在这些源文件中为顶层 BD 选择活动变体(active variant)。此操作会实时更新 BDC,显示新活动变体的内容。此外,你还可以为 BDC 的综合和仿真分别指定不同的源文件。参见图 138 中的 Synthesis sources 和 Simulation sources。点击+可添加 BDC 的变体。
BDC 孔径(BDC Apertures)
孔径是限制或界定地址分配的范围。地址分配必须落在寻址路径上的孔径之内。通常你只需指定分配,而不需要指定孔径。但是,在 DFX 或非 DFX 设计中,BDC 孔径会像地址分配一样用于配置 SmartConnect 和 NoC 块。因此,BDC 孔径在同一网络内不能相互重叠,也不能与其他分配重叠。更改设计的 BDC 孔径会导致 SmartConnect 和/或 NoC 重新生成。
一般建议:非 DFX 设计将孔径设置保持为Auto,DFX 设计使用Manual设置。
- Auto:表示孔径被自动计算,以覆盖所有 RM 地址分配之和。BDC 自动孔径不限制分配,而是根据分配增大或缩小。自动孔径不保存到磁盘,始终根据分配计算得出,用户无法编辑。
- Manual:表示由用户输入,它会限制地址分配。手动孔径保存在 BD 文件中。
在非 DFX 设计中,Auto 设置对地址分配(活动变体的)和孔径使用相同的值。如有需要,你仍然可以覆盖并指定手动值。在非 DFX 设计中,SmartConnect 或 NoC 块不需要覆盖每个变体。
在 DFX 设计中,工具必须检查所有 RM 变体来计算孔径值,因为 RP BDC 中每个 RM(变体)的地址分配可能不同。因此,所有 RM 的边界地址分配都必须能容纳进顶层 BD(TopBD)。这意味着连接到每个 RM 边界的所有主设备和/或从设备,都必须能被 TopBD 中与其相连的主/从设备寻址。否则可能在下游流程中引发问题。连接到 BDC 边界(位于静态区)的 SmartConnect 和 NoC 块,始终按 DFX 块的边界孔径进行细化(elaborate)。
例如,如果在一个 DFX 设计中(如下所示)有两个偏移不同的 RM:
- RM1:分配
0x0、范围 1M - RM2:分配
0xC、范围 4M
那么,即使活动变体 RM1 只分配了0x0处的 1M,SmartConnect 也必须配置为同时译码两个地址。这通过在 BDC 边界上添加孔径来实现。
图 139:DFX 模式下的孔径示例(图略,见原文)
图 140:地址分配设置(图略,见原文)
在本例中,BDC 边界(RP)的 S_AXI 上需要两个孔径,因此建议手动添加这些孔径。有关 DFX 与 BDC 孔径的更多信息,请参见《Vivado Design Suite 用户指南:Dynamic Function eXchange(UG909)》。
观察在使用自动孔径与手动孔径时,validate_bd期间 SmartConnect 的路由情况。
图 141:使用自动孔径验证 BD(图略,见原文)
图 142:使用手动孔径验证 BD(图略,见原文)
块设计容器定制对话框的 Addressing 选项卡
Addressing 选项卡显示接口列表,孔径与接口显示在同一行。大多数接口只有一个孔径。如果某个接口有多个孔径,附加行会显示在该接口下方。
- 手动 BDC 孔径以黑色字体显示,可编辑。
- 自动 BDC 孔径以灰色字体显示,不可编辑。
提示:如果一个接口有多个手动孔径,只有带接口名称的那一行才有 Auto/Manual 滑块。
在非 DFX 设计中,自动孔径不显示任何值(无孔径)。如果在非 DFX 模式下切换到 Manual 模式,初始孔径会显示所有变体孔径之和——这与 DFX 模式下相同。
点击Show Detailed View按钮后,你可以清楚地看到每个变体中的地址段,以及它们能否容纳进设计所定义的孔径;无法容纳进孔径的地址段会显示为红色。你可以通过以下步骤,手动将所有变体的所有分配包含进孔径列表:
- 点击添加按钮(+)。
- 选择 BDC 接口。
- 指定地址基址(base)和范围(range)值。
图 143:孔径添加弹窗(图略,见原文)
注:在 IP integrator 中运行 DFX 设计规则检查(DRC)时可能产生一系列错误。这些是关于 DFX 设计中 NoC 用法的常见场景。更多细节和建议的修复方法,列于《Vivado Design Suite 用户指南:Dynamic Function eXchange(UG909)》中"IP integrator: Problems and Solutions"一节的 NoC DFX DRCs 部分。
对含多个 RM 的 DFX 设计的建议
- 使用 DFX 时始终使用手动孔径,以确保所有 RM 的地址分配都能容纳进 TopBD;否则 AMD Vivado™ 会给出警告。
- 在 IP integrator 中设计系统时,始终将具有最大地址分配规格(分配数量、主/从设备数量等)的 RM 设为活动变体。这有助于 IP integrator 以该 RM 为参照,为所有其他 RM 推定地址分配。
- 在顶层上下文中依次将每个 RM 设为活动状态,并重新分配(更改)地址,使该 RM 适配顶层。手动孔径会指导工具如何更改 RM 地址。
- 经过同一网络的接口上不允许孔径重叠。连接到这些接口的 SmartConnect 和 NoC 将无法细化(elaborate)。
- 在切换源 BD 之前先保存块设计,以确保任何地址编辑不会丢失。当某个 RM 仅包含直通桥接 IP(例如 NoC、SmartConnect 等)时,你会看到一条 DRC。
- 当某个 RM 仅包含直通桥接 IP(例如 NoC、SmartConnect 等)时,你可能会看到一条 DRC。
注:设备树生成器(device tree generator)不支持未使用 DFX 流程的块设计容器。
从顶层 BD 进行 BDC 的参数传递
子块设计级别的参数无法在顶层块设计中配置。但是,顶层块设计中各 IP 的所有参数会自动传递到子块设计 BDC 内与其相连的 IP。这也允许同一源块设计的多个例化各自接收不同的参数(属性)集合。
重要!工程模式的 OOC 综合 DCP 不包含 NoC 信息。当该 DCP 在非工程模式下使用时,工具会选取新的 NoC 位置。
如果你想在非工程模式下使用工程模式的 OOC 综合 DCP,可以使用以下任一方法:
write_checkpoint与read_checkpoint:打开顶层模块综合运行,使用write_checkpoint -cell <rm> <rm_ooc>.dcp。此 DCP 包含 NoC 信息,你可以在非工程模式下通过read_checkpoint -cell <rm_ooc>.dcp命令直接使用它。如果你想在非工程模式下使用工程模式生成的 RM OOC DCP,应在脚本中同时添加
.bd和.dcp文件,并使用link_design命令。
使用块设计容器进行设计复用
在模块化、层次化的设计流程中,BDC 使你能够独立于设计的其余部分开发并复用 IP 块设计。这些 IP 块设计可以作为.bd源文件在同一工程内或其他设计中复用。设计团队成员可以针对设计的特定部分迭代其 BD 工程以达成设计目标,并复用结果。
单一工程与多工程
团队可以使用自顶向下和自底向上两种流程进行设计复用。在自顶向下流程中,可以先构建并验证一个顶层 BD,其中包含外部接口和特定功能块的细节。然后,该顶层 BD 可被复用于设计团队成员的工程,供他们开发各自的 BDC 部分。这可以在复制给所有团队成员的单一工程中完成,也可以在面向同一器件的多个工程中完成。
在自底向上的设计复用流程中,团队成员各自的独立工程可以专注于开发所分配设计分区的 BD,以便稍后作为 BDC 复用于顶层 BD 中,或整体复用于另一个工程。
在 BD 内复制子块
借助 BDC,设计的不同部分也可以在顶层块图的上下文中被多次复制。此功能使你只需一次性创建包含所需 IP 的块设计,即可在多个不同上下文中使用同一个 BD。
BDC 的限制
- 如果你添加的 BDC 接口破坏了 AXI 互连级联(cascading),可能在验证期间导致参数传递错误。
- 在创建 BDC 之前,先在两个级联互连之间(层次之外)例化一个 AXI 时钟转换基础设施 IP(AXI register slice、AXI Data Width Converter、AXI Clock Converter 等);或者,将互连配置为在面向 BDC 边界的一侧使用内部寄存器切片(register slice)。
- 一旦你的 BDC 被锁定,请勿更改任何源 BD 的边界,以避免下游工具错误。
- 连接 CIPS 与 AXI NoC(或 AI Engine 与 NoC)的硬化连接(hardened connection)必须位于同一层次。BDC 边界不能横跨这一组合。
- 包含 BDC 的设计不支持 Global 综合模式。当在包含一个或多个 BDC 的设计中使用 Global 模式时,工具会自动回退到 OOC-per-BD 模式。OOC-per-IP 则完全支持。
块设计的版本控制(Revision Control)
版本控制系统可以在工程模式和非工程模式下管理与 Vivado IP integrator BD 关联的各种源文件。随着 BD 的开发和复杂度提升,跟踪设计的不同迭代、促进团队设计环境中的工程管理与协作变得至关重要。IP integrator 的目标是协助用户只签入(check in)重建工程所需的最少文件。
IP 与 IP Integrator 的目录结构
IP integrator 的新目录结构将 BD 中所有 IP 块的输出产品生成到单独的<project_name>.gen目录中。这将生成的输出产品与位于<project_name>.srcs目录中的当前源文件分离开来。
下图展示了 IP integrator 中一个示例工程的新目录结构。
图 144:Generate Design 之前(左)与之后(右)工程 IP 和 BD 文件的目录结构(图略,见原文)
新的<project_name>.gen目录包含所有子核 IP 和有作用域的 BD 文件。执行 generate block design 步骤后,生成的输出产品全部位于<project_name>.gen目录中。
无论执行 generate block design 步骤之前还是之后,IP 和 BD 源文件始终保留在<project_name>.srcs目录中。
这种目录结构带来以下好处:
- 在大多数版本控制使用场景中,将重建工程所需签入的文件数量降至最少。
- 提供更清晰的目录结构,以区分 BD/IP 源文件与输出产品。
此外,在许多版本控制场景中并不需要签入输出产品。
版本控制方法论
建议你(使用write_project_tcl命令)在最新版本中手动重建工程,以迁移到新的目录结构。
为更好地理解 BD 之间的差异,你可以使用 Vivado 中的diffbd命令行实用程序,以文本报告形式获得两个 BD 的比较结果。更多信息见"在块设计中交叉探查差异"一节。
框架搭建完成后,请遵循以下一般准则:
- 使用脚本化流程(scripted flow)进行版本控制。
- 将工程外部的源文件保存在受版本控制的仓库中。
- 创建一个用于重建工程的 Tcl 脚本,并将该脚本纳入版本控制。
有关将 Vivado Design Suite 与版本控制软件配合使用的更多信息,请参见《Vivado Design Suite 用户指南:设计流程概述(UG892)》。
第 6 章:交叉探查时序路径(Cross-Probing Timing Paths)
很多时候,你需要将实现(implementation)之后发现的时序问题追溯(probe)到 IP Integrator 设计中的源块。当你对从其他团队成员那里继承的设计不够熟悉时,这一功能尤其有用。要将某条时序路径定位到特定块,点击消息中的链接——它会指向块设计画布上相关时序问题的源块——以打开已实现的设计。下图为已实现设计中某个 IP 块上的警告示例。
图 145:方法学警告(Methodology Warning)(图略,见原文)
显示的消息如下:
CLKC #1 The MMCME3 cell config_mb_i/axi_ethernet_0/inst/pcs_pma/inst/ core_clocking_i/mmcme3_adv_inst has COMPENSATION value ZHOLD, but CLKOUT2 output drives sequential IO cells. In order to achieve insertion delay and phase-alignment for the IO sequential cells, CLKOUT0 must be used.(译文:MMCME3 单元config_mb_i/axi_ethernet_0/inst/pcs_pma/inst/core_clocking_i/mmcme3_adv_inst的 COMPENSATION 值为 ZHOLD,但其 CLKOUT2 输出驱动的是时序 IO 单元。为了对 IO 时序单元实现插入延迟和相位对齐,必须使用 CLKOUT0。)
如消息所示,路径单元config_mb_i/axi_ethernet_0/inst/pcs_pma/inst/core_clocking_i/mmcme3_adv_inst带有一个链接。点击此链接,会带你跳转到块设计画布,并高亮显示与该时序消息相关的块设计单元。
要在块设计画布上查看相关单元,点击 Flow Navigator 中的IP INTEGRATOR,将视图切换到块设计画布。
图 146:块设计画布上被消息高亮的单元(图略,见原文)
定位到有问题的单元或 IP 块之后,你可以查看源代码或约束文件来排查问题。