这一篇在干嘛?

这一篇把 Design Integrator(DI)的完整使用流程一次讲透:它是什么、怎么启动、界面怎么认、design 怎么建怎么生成,以及画布上最核心的那些操作——导入 IP、重配置、连线、导出端口、导入 RTL 和子 design,最后还有地址空间编辑、Design 检查和快捷键速查。同系列目录页见 /移远FPGA竞赛安路/设计集成器/index。如果你还没写过几行 Verilog 顶层,这篇正好帮你把”手写例化”这件事彻底自动化掉。

DI 是什么:为什么不用手写 wrapper

启动 DI 与界面布局

管理 design:新建、打开、生成

构建 design:IP 导入、重配置与连线

端口导出、删除与属性修改

导入 RTL 与子 design:复用你自己的代码

地址空间编辑与 Design 检查

快捷键速查

DI 是什么:为什么不用手写 wrapper

Design Integrator(下称 DI)是 TD 软件里自带的一个图形化设计工具,它的出发点很简单:当工程里要用到多个 IP 时,你需要手写顶层模块,把每个 IP 的端口一个一个例化、连线,重复劳动多、还特别容易连错。DI 解决这个问题的思路是——你只负责在画布上”摆 IP + 拉连线”,它根据你定制的 IP 以及 IP 间的连接关系,自动生成对应的 RTL 代码(一个 wrapper,也就是顶层包装模块)。

几个关键概念先掰清楚:

  • DI 和 TD 的关系:DI 是 TD 里的一个工具,不能独立运行,它的程序入口和返回出口都在 TD。也就是说,你从 TD 进 DI 干活,干完生成结果后又回到 TD。
  • 什么是 design:使用 DI 创建、导出的工程叫做 design。它的本质是一个包含了很多 IP 的大型工程,最终功能是根据所有 IP 的连接关系,生成一个 RTL wrapper。design 里最重要的元素就两个:被例化的 IP,和 IP 间的连接——你在 DI 里的所有操作都是围绕这两样东西进行的。
  • design 存在哪:design 工程源文件默认放在 TD 工程目录下(也可以保存到自定义的其他目录),每一个 design 拥有独立的文件夹,文件夹名就是 design 名。

DI 工作流程:入口和出口都在 TD

design 目录结构示意图

在一个 design 的文件夹里,对用户真正有用的目录有两个:

  • hdl:存放生成的 wrapper 的 RTL 代码——这是你最终要的东西;
  • ip:存放该 design 中例化的各个 IP 的源文件。

常见坑:找不到生成的代码?

很多初学者生成完 design 后到处找 RTL 文件。记住去 TD 工程目录下的 design/<你的design名>/hdl/ 里找 wrapper 代码;IP 的定制产物则在同级的 ip/ 目录里。路径中不要出现中文、空格和特殊字符,否则后面Generate 时可能出问题。

启动 DI 与界面布局

DI 的所有入口都由 TD 统一提供,新建、打开、导出 design 的操作都在 DI 中进行。启动步骤:

  1. 在 TD 菜单中选择 Tools,打开工具列表;
  2. 选择 Design Integrator,进入 DI 页面。

常见坑:Design Integrator 是灰色的点不了?

使用 DI 功能的前提是 TD 工程已经创建。如果你还没在 TD 里新建工程,Design Integrator 菜单项会显示为灰色、无法选择。先回 TD 把工程建好(选对 EG4S20 器件型号),再进 DI。

进入 DI 后,页面由多个独立窗口组成,每个窗口都可以在 View 菜单中选择显示或隐藏。整体布局如下:

DI 页面布局示意图

各个区域的作用:

  1. 菜单栏:包括 File、Edit、Flow、Tools、View、Help 等功能入口;
  2. Design Resource 页:显示 design 中的 IP、信号等内容。同一个 DI 里可以同时打开多个 design,不同的 design 也在这个页面中切换,当前工作区的 design 会用颜色标识;
  3. Design Properties 页:显示(或修改)被选中的 IP、连线、外部 Port 的属性;
  4. Design Diagram 页:design 的主页面,你在画布上做 IP 定制和连线都在这里;
  5. 工具栏窗口:提供 diagram 的放大、缩小、加入 IP、验证、重新布局布线等常用按钮;
  6. Design Address Editor 页:用于编辑 design 中 AXI Slave IP 的地址;
  7. 违例信息显示页:显示 Design 检查功能的结果。

其中 2、3、4、7 这几个页面都可以按需在 View 菜单里隐藏或显示。注意 DI 的页面布局以实际版本为准,不同版本的布局可能有微小差异。

菜单栏六大项速览:

菜单提供的功能
FileSave Design(保存当前 design 的所有操作,如例化的 IP、IP 间的连线)、Save Design As(另存,用于保存当前工作状态避免被后续操作修改)、Close Design(关闭当前 design,有提醒)、Export Design(以 tcl 方式导出 design,方便用 tcl 恢复;早期版本可能未开放)、Exit(退出 DI)
EditUndo(撤销,可多次使用)、Redo(恢复被撤销的操作)、Copy(复制选中的 IP)、Paste(粘贴 IP,参数与被复制的完全一样)、Delete(删除选中的 IP 或连线)
FlowCreate Design(新建 design)、Open Design(打开 design)、Generate Design(生成 design 中所有 IP 的 Wrapper RTL)
ToolsValidate Design(检查 design 中是否有违例信息)、Run Tcl Script(运行 export design 导出的脚本)
View切换各页面视图的显示/隐藏
Help查看 DI 的版本信息

管理 design:新建、打开、生成

Design 的管理包含三个操作:新建、打开、生成。

新建 design

新建 design 流程

操作步骤:

  1. 依次点击 Flow —> Create Design,进入新建 Design 页面;
  2. 输入 design 名称并选择保存位置。命名有严格规范:仅限英文字母(大小写均可)、数字、下划线,且只能以英文字母起始,不能使用特殊字符。保存路径默认为当前 TD 工程,也可以选择其他位置,但路径中不能有中文、空格、其他特殊字符
  3. 点击 OK,完成新建,进入 design 的 diagram 页面。

打开 design

打开已有 design 有两种方式:

  • 方式一:在 TD 中双击 design 的名称,直接打开;
  • 方式二:在 DI 中点击 Flow —> Open Design,在选择窗口里选 design 名称(列表会显示当前 TD 工程中包含的有效 design,选好后窗口下方会显示其路径),或者点 Choose 按钮选择 design 所在路径,然后点 OK 进入该 design 页面。

常见坑:列表里找不到我的 design?

Open Design 的列表只列出当前 TD 工程中包含的有效 design。如果你的 design 源文件被删掉了,或者它不在当前 TD 工程下,列表里就不会出现它——此时只能用 Choose 手动指定路径。

生成 design

当 design 中的 IP 连接已经全部完成,需要生成 wrapper 以便回到 TD 做后续的 syn(综合)、phy(布局布线)等操作时,使用生成功能:

  1. 在菜单栏依次点击 Flow —> Generate Design,打开生成页面;
  2. 点击 Generate,导出 design 到 TD 工程。此时 DI 会自动关闭退出,并回到 TD 的工程页面。

某些情况下,导出的文件并不能被 TD 自动识别到,需要在 TD 中刷新文件树:右键单击 Hierarchy,点击 Refresh Hierarchy,完成刷新后 wrapper 就会出现在工程里了。

通关标准:

  • 能不看文档独立完成:新建一个命名合规的 design,打开它,再把生成的 wrapper 刷新到 TD 的 Hierarchy 里。

构建 design:IP 导入、重配置与连线

构建 design 的本质是操作三样东西:IP、IP 间的连接、外部端口,全部操作都在 diagram 区域进行。常见操作包括:导入 IP、删除 IP、IP 端口间连线、IP 端口导出、地址空间编辑(仅当 design 中例化了带 bus 的 IP 时)、导入 RTL、导入 design。

IP 导入

导入 IP 操作示意图

  1. 点击画布上的 IP+ 图标,打开添加 IP 界面;
  2. 鼠标左键双击需要添加的 IP 名称即可添加;也可以直接把 IP 从列表拖拽到 design 页面;
  3. 添加后,DI 会使用 IP 的默认参数例化该 IP 并放到 diagram 页面中。实例命名规则是 designName_ipName_index,index 从 0 开始编号。

在画布上,IP 实例的顶部显示实例名称,底部显示 IP 名称,别搞混这两行字。

被例化的 IP 实例

Add IP 窗口还提供模糊搜索:在搜索框输入关键字,IP 列表会自动筛选。另外注意,Add IP 窗口不会自动关闭,这是为了方便你连续添加多个 IP,用完要点 close 才会关掉。

IP 重配置

导入的 IP 默认是默认参数,实际用的时候几乎都要重新定制:

  1. 在画布上双击 IP 模块,被选中的 IP 会高亮显示,同时进入该 IP 的重配置界面;
  2. 改好参数后点击右下角的 OK 按钮完成重配置。此时会生成新的 IP 文件,并更新 design 页面中的 IP。

每个 IP 的重配置页面都不一样,具体情况参照该 IP 的 IPUG 文档,但相同点是右下角一定有 OK 按钮。某些 IP 在点 OK 后还会弹出 options 和 summary 提示,直接点 GenerateOK 即可。

Port 连接

普通端口连线的操作手感是”双击起点、单击终点”:

  1. 双击 IP 的端口名称(或端口标识),该端口进入连线状态,此时会跟随鼠标有一条直线;
  2. 能与它连接的其他端口会以蓝色特殊标记,把鼠标移到目标端口上,单击端口名称(或标识)完成连接。连接后两端口间生成一条连线,并自动退出连线状态。

连线规则必须记牢:

  • 输出 port 可以与任意输入 port 连接;
  • 输入 port 可以与任意 port 连接,但输入 port 只能被一个其他 port 连接(也就是说一个输入端口不能接多个驱动源)。

选择连线端口:双击后可连端口变蓝

bus 连接

bus(总线接口)的连接规则比普通端口严格:当且仅当两个相同类型的 bus 才能连接,例如都为 AXI。如果 bus 类型不同,需要使用对应协议转换的 IP 进行转换(比如 AXI 转 APB 的桥)。

bus 连上之后,其内部对应的 port 都会被一并连接。想看细节的话:

  1. 点击展开 bus 中的 port;
  2. 左键按住要查看的端口不松,有连接关系的部分会以粉红色高亮显示。

bus 展开后,里面的 port 和普通 port 待遇一样,可以断开、重新连接:

  • 断开:右键单击要断开的端口,单击 Disconnect Port 删除连接;
  • 重连:双击 bus 中的端口,该端口进入连接状态,可将其与其他满足连接规则的端口连接。

端口导出、删除与属性修改

端口导出

端口导出会把 IP 的端口导出到 wrapper 上,成为 design 对外的端口,以便 wrapper 与其他 RTL 模块连接。流程:

  1. 右键单击要导出的端口;
  2. 点击 Create Design Port,打开导出端口界面;
  3. 端口名称可以不改——DI 会自动生成名称,方向和位宽也会自动识别(改名不是必要项);
  4. 单击 Add 完成导出。导出完成后,连线会自动连上。

对于 bus,导出操作相同,DI 会把 bus 内的所有 port 都导出。

删除 IP 和删除连线

  • 删除 IP:右键单击要删除的 IP(选中后粉红色高亮),单击 Delete Module
  • 删除连线:右键单击要删除的连线(粉红色高亮),点击 Delete Connection,在弹出的选项中单击 Yes 确认删除。

这里有个容易混淆的点:Disconnect PortDelete Connection 都能删连接,但粒度不同——前者只断开该 port 与现有连接网络的连接关系,后者会删除整个连接关系(牵连到这条网络上的所有连线)。

属性修改

DI 中仅支持修改两类属性:IP 的显示名称、导出到 design 的端口的名称和位宽。操作都是一样的套路:

  1. 鼠标左键单击选中要修改的 IP(或端口名称);
  2. Module Properties 页面中修改名称。

常见坑:一个输入端口接了多个驱动?

普通连线规则要求输入 port 只能被一个 port 连接。如果你想把一个信号分发给多个模块的输入,正确做法是从同一个输出端口分别连到各个输入端口(一对多没问题),而不是把多个输出怼到同一个输入上。报错时优先检查这个。

通关标准:

  • 能完成一次”导入 IP → 双击重配置 → 双击连线 → 右键导出端口”的完整闭环,并且分得清 Disconnect Port 与 Delete Connection 的区别。

导入 RTL 与子 design:复用你自己的代码

DI 不只能放官方 IP——你可以把自己写的 Verilog 模块,甚至别人做好的 design,作为一个”积木”放进画布。

导入 RTL

导入 RTL 源文件到 design 有明确的限制条件,务必先看:

  • 仅支持 Verilog,不支持 VHDL;
  • 仅支持导入已经添加到 TD 工程中的 RTL 源文件;
  • 仅支持导入单个 RTL 文件中的单个 module;如果该 module 例化了其他 RTL 文件中的 module,需要提前把依赖的 RTL 文件也导入到 TD 工程(当然,也支持从同一个 RTL 文件中选择不同的 module 分别导入);
  • 重定制功能仅修改 module 的传入参数,不会修改源文件中的宏定义。

使用步骤分两步:

第一步:把 RTL 源文件(以及依赖文件)添加到 TD 工程。

  1. 在 TD 的 Hierarchy 选项卡上右键,选择 Add Sources
  2. 选择 Add Files,进入选择文件页面;
  3. 选中需要的源文件,点 Open,回到前一页面后点 OK

添加时 TD 会对 RTL 做语法解析,有语法错误会直接报错提醒——所以这一步也相当于免费的语法检查。

第二步:在 design 中添加 module。

  1. 在 design 页面(画布空白处)单击右键,选择 Add module
  2. module 类型选择 RTL,在列表中选中要添加的 module 名称,点 OK 完成。

导入后,RTL module 在画布上的显示与其他 IP 没有任何区别。它同样支持重配置:在画布上双击该 module 进入重定制页面,按需修改参数后点 OK。但注意,这里的重配置只修改传入 module 的参数,不会改动 RTL 源文件本身。因此,如果你后来改了 RTL 源文件里的端口(增减端口、改位宽等),需要在 DI 里重新定制一次,以便更新画布上的端口信息。

导入 design

DI 支持把同一 TD 工程目录中的其他 design 作为子模块导入到当前 design——这就是”多工程集成”的核心玩法:把大系统拆成几个 design 分别搭好,再层层嵌套组装。限制条件只有一条:只能导入同一 TD 工程目录下的其他 design。

操作步骤:

  1. 在 design 页面右键,选择 Add module
  2. module 类型选择 design,在列表中选择需要添加的 design 名称,点 OK

导入后的子 design 在画布上与其他 IP 没有任何区别,它的端口就来自原 design 的端口。要改子 design 的话,双击它会跳转到原 design 页面,在原 design 里完成更改后,点击 Generate Design,子 design 就会更新。

通关标准:

  • 能把自己的一个 Verilog 模块加进 TD 工程,再通过 Add module(RTL 类型)导入 design 并重配置参数;
  • 能把另一个 design 作为子模块导入当前 design,并说出”改子 design 要回原 design 改完再 Generate Design”这条规矩。

地址空间编辑与 Design 检查

地址空间编辑

当 design 中例化的 IP 包含总线时(典型场景:ARM 核或 RISC-V 核通过 AXI 挂了若干外设),可以用地址空间编辑功能修改 Slave 的地址和范围。设计好 design 后,点击 Address Editor 进入编辑页面,页面按 Master 通路显示(有多个 Master 时会分开显示):

  • Master 一侧:显示总线中 Master 所在 IP 的名称、Master 的总线名称、总线位宽、地址空间大小。注意这些信息依赖于 Master 总线对应 IP 提供的数据,如果该 IP 没提供信息或信息不准确,显示可能有误;
  • Slave 一侧:显示 Slave 的总线名称、Slave Segment、Base Address、Range、High Address。其中 Base Address 和 Range 是可修改项——Base Address 是 CPU(ARM 核、RISC-V 核)视角中地址空间的绝对地址。

另外,当 design 中有 AXI Matrix 这类总线桥 IP 时,也可以直接在该 IP 中修改总线网络中 slave 的地址。

Design 检查

DI 会对 design 自动做检查并提醒错误信息,减少设计错误、提升开发效率。当前支持四类检查:

检查项检查内容未通过时的后果
时钟检查被绑定为 Clock bus 的端口(或 bus 协议中标记为时钟的端口)是否连接不影响 RTL 生成;未连接则该端口被强制拉到”0”
复位信号检查被绑定为 Reset bus 的端口(或协议中标记为复位的端口)是否连接不影响 RTL 生成;未连接则强制拉到”0”(暂不支持复位极性检查)
IP 兼容性检查打开已有 design 时,检查其中 IP 是否兼容当前器件不影响 RTL 生成;不兼容会在后续 syn、phy 阶段报错,画布上用特别颜色标记
地址空间检查Address editor 检查同一 master 下分配的 slave 地址是否有重复不影响 RTL 生成

操作方式:设计完成后,点击菜单栏的 check 按钮(快捷键 F6)执行检查。结果显示在 design 页面底部,分为 Error、Warning、Info 三个等级。

地址空间编辑页面示意图

常见坑:检查通过就万事大吉?

四类检查结果都不会阻止 RTL 生成——时钟悬空被拉到”0”后,wrapper 照样能生成,但你的电路在上板时一定不工作。所以 Error 和 Warning 都要认真处理,尤其是时钟和复位悬空,别指望综合工具替你兜底。

快捷键速查

熟练使用快捷键能大幅提高画布操作效率,当前支持的快捷键如下:

快捷键功能
Ctrl + I新增 IP
Ctrl + C复制 IP
Ctrl + V粘贴 IP
Ctrl + K新增 Port
Ctrl + L创建 Bus Interface
Ctrl + F搜索
Ctrl + =展开 bus
Ctrl + -折叠 bus
F6检查 Design
Delete删除 IP、连线
Shift + D断开 Port 的连接

注意:快捷键仅支持键盘小写输入状态,如果 Caps Lock 被打开,快捷键不生效。

通关标准:

  • 能用 F6 对自己的 design 做一次完整检查,读懂 Error/Warning/Info 三级结果,并用 Address Editor 给至少一个 AXI Slave 分配了不冲突的 Base Address。