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


在一个 design 的文件夹里,对用户真正有用的目录有两个:
hdl:存放生成的 wrapper 的 RTL 代码——这是你最终要的东西;ip:存放该 design 中例化的各个 IP 的源文件。
常见坑:找不到生成的代码?
很多初学者生成完 design 后到处找 RTL 文件。记住去 TD 工程目录下的
design/<你的design名>/hdl/里找 wrapper 代码;IP 的定制产物则在同级的ip/目录里。路径中不要出现中文、空格和特殊字符,否则后面Generate 时可能出问题。
启动 DI 与界面布局
DI 的所有入口都由 TD 统一提供,新建、打开、导出 design 的操作都在 DI 中进行。启动步骤:
- 在 TD 菜单中选择 Tools,打开工具列表;
- 选择 Design Integrator,进入 DI 页面。
常见坑:Design Integrator 是灰色的点不了?
使用 DI 功能的前提是 TD 工程已经创建。如果你还没在 TD 里新建工程,Design Integrator 菜单项会显示为灰色、无法选择。先回 TD 把工程建好(选对 EG4S20 器件型号),再进 DI。
进入 DI 后,页面由多个独立窗口组成,每个窗口都可以在 View 菜单中选择显示或隐藏。整体布局如下:

各个区域的作用:
- 菜单栏:包括 File、Edit、Flow、Tools、View、Help 等功能入口;
- Design Resource 页:显示 design 中的 IP、信号等内容。同一个 DI 里可以同时打开多个 design,不同的 design 也在这个页面中切换,当前工作区的 design 会用颜色标识;
- Design Properties 页:显示(或修改)被选中的 IP、连线、外部 Port 的属性;
- Design Diagram 页:design 的主页面,你在画布上做 IP 定制和连线都在这里;
- 工具栏窗口:提供 diagram 的放大、缩小、加入 IP、验证、重新布局布线等常用按钮;
- Design Address Editor 页:用于编辑 design 中 AXI Slave IP 的地址;
- 违例信息显示页:显示 Design 检查功能的结果。
其中 2、3、4、7 这几个页面都可以按需在 View 菜单里隐藏或显示。注意 DI 的页面布局以实际版本为准,不同版本的布局可能有微小差异。
菜单栏六大项速览:
| 菜单 | 提供的功能 |
|---|---|
| File | Save Design(保存当前 design 的所有操作,如例化的 IP、IP 间的连线)、Save Design As(另存,用于保存当前工作状态避免被后续操作修改)、Close Design(关闭当前 design,有提醒)、Export Design(以 tcl 方式导出 design,方便用 tcl 恢复;早期版本可能未开放)、Exit(退出 DI) |
| Edit | Undo(撤销,可多次使用)、Redo(恢复被撤销的操作)、Copy(复制选中的 IP)、Paste(粘贴 IP,参数与被复制的完全一样)、Delete(删除选中的 IP 或连线) |
| Flow | Create Design(新建 design)、Open Design(打开 design)、Generate Design(生成 design 中所有 IP 的 Wrapper RTL) |
| Tools | Validate Design(检查 design 中是否有违例信息)、Run Tcl Script(运行 export design 导出的脚本) |
| View | 切换各页面视图的显示/隐藏 |
| Help | 查看 DI 的版本信息 |
管理 design:新建、打开、生成
Design 的管理包含三个操作:新建、打开、生成。
新建 design

操作步骤:
- 依次点击 Flow —> Create Design,进入新建 Design 页面;
- 输入 design 名称并选择保存位置。命名有严格规范:仅限英文字母(大小写均可)、数字、下划线,且只能以英文字母起始,不能使用特殊字符。保存路径默认为当前 TD 工程,也可以选择其他位置,但路径中不能有中文、空格、其他特殊字符;
- 点击 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(布局布线)等操作时,使用生成功能:
- 在菜单栏依次点击 Flow —> Generate Design,打开生成页面;
- 点击 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+ 图标,打开添加 IP 界面;
- 鼠标左键双击需要添加的 IP 名称即可添加;也可以直接把 IP 从列表拖拽到 design 页面;
- 添加后,DI 会使用 IP 的默认参数例化该 IP 并放到 diagram 页面中。实例命名规则是
designName_ipName_index,index 从 0 开始编号。
在画布上,IP 实例的顶部显示实例名称,底部显示 IP 名称,别搞混这两行字。

Add IP 窗口还提供模糊搜索:在搜索框输入关键字,IP 列表会自动筛选。另外注意,Add IP 窗口不会自动关闭,这是为了方便你连续添加多个 IP,用完要点 close 才会关掉。
IP 重配置
导入的 IP 默认是默认参数,实际用的时候几乎都要重新定制:
- 在画布上双击 IP 模块,被选中的 IP 会高亮显示,同时进入该 IP 的重配置界面;
- 改好参数后点击右下角的 OK 按钮完成重配置。此时会生成新的 IP 文件,并更新 design 页面中的 IP。
每个 IP 的重配置页面都不一样,具体情况参照该 IP 的 IPUG 文档,但相同点是右下角一定有 OK 按钮。某些 IP 在点 OK 后还会弹出 options 和 summary 提示,直接点 Generate 和 OK 即可。
Port 连接
普通端口连线的操作手感是”双击起点、单击终点”:
- 双击 IP 的端口名称(或端口标识),该端口进入连线状态,此时会跟随鼠标有一条直线;
- 能与它连接的其他端口会以蓝色特殊标记,把鼠标移到目标端口上,单击端口名称(或标识)完成连接。连接后两端口间生成一条连线,并自动退出连线状态。
连线规则必须记牢:
- 输出 port 可以与任意输入 port 连接;
- 输入 port 可以与任意 port 连接,但输入 port 只能被一个其他 port 连接(也就是说一个输入端口不能接多个驱动源)。

bus 连接
bus(总线接口)的连接规则比普通端口严格:当且仅当两个相同类型的 bus 才能连接,例如都为 AXI。如果 bus 类型不同,需要使用对应协议转换的 IP 进行转换(比如 AXI 转 APB 的桥)。
bus 连上之后,其内部对应的 port 都会被一并连接。想看细节的话:
- 点击展开 bus 中的 port;
- 左键按住要查看的端口不松,有连接关系的部分会以粉红色高亮显示。
bus 展开后,里面的 port 和普通 port 待遇一样,可以断开、重新连接:
- 断开:右键单击要断开的端口,单击 Disconnect Port 删除连接;
- 重连:双击 bus 中的端口,该端口进入连接状态,可将其与其他满足连接规则的端口连接。
端口导出、删除与属性修改
端口导出
端口导出会把 IP 的端口导出到 wrapper 上,成为 design 对外的端口,以便 wrapper 与其他 RTL 模块连接。流程:
- 右键单击要导出的端口;
- 点击 Create Design Port,打开导出端口界面;
- 端口名称可以不改——DI 会自动生成名称,方向和位宽也会自动识别(改名不是必要项);
- 单击 Add 完成导出。导出完成后,连线会自动连上。
对于 bus,导出操作相同,DI 会把 bus 内的所有 port 都导出。
删除 IP 和删除连线
- 删除 IP:右键单击要删除的 IP(选中后粉红色高亮),单击 Delete Module;
- 删除连线:右键单击要删除的连线(粉红色高亮),点击 Delete Connection,在弹出的选项中单击 Yes 确认删除。
这里有个容易混淆的点:Disconnect Port 和 Delete Connection 都能删连接,但粒度不同——前者只断开该 port 与现有连接网络的连接关系,后者会删除整个连接关系(牵连到这条网络上的所有连线)。
属性修改
DI 中仅支持修改两类属性:IP 的显示名称、导出到 design 的端口的名称和位宽。操作都是一样的套路:
- 鼠标左键单击选中要修改的 IP(或端口名称);
- 在 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 工程。
- 在 TD 的 Hierarchy 选项卡上右键,选择 Add Sources;
- 选择 Add Files,进入选择文件页面;
- 选中需要的源文件,点 Open,回到前一页面后点 OK。
添加时 TD 会对 RTL 做语法解析,有语法错误会直接报错提醒——所以这一步也相当于免费的语法检查。
第二步:在 design 中添加 module。
- 在 design 页面(画布空白处)单击右键,选择 Add module;
- module 类型选择 RTL,在列表中选中要添加的 module 名称,点 OK 完成。
导入后,RTL module 在画布上的显示与其他 IP 没有任何区别。它同样支持重配置:在画布上双击该 module 进入重定制页面,按需修改参数后点 OK。但注意,这里的重配置只修改传入 module 的参数,不会改动 RTL 源文件本身。因此,如果你后来改了 RTL 源文件里的端口(增减端口、改位宽等),需要在 DI 里重新定制一次,以便更新画布上的端口信息。
导入 design
DI 支持把同一 TD 工程目录中的其他 design 作为子模块导入到当前 design——这就是”多工程集成”的核心玩法:把大系统拆成几个 design 分别搭好,再层层嵌套组装。限制条件只有一条:只能导入同一 TD 工程目录下的其他 design。
操作步骤:
- 在 design 页面右键,选择 Add module;
- 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。
自测:DI 生成的 wrapper RTL 代码存放在哪里?后续综合在哪个软件里做?
wrapper 代码存放在 TD 工程目录下 design 文件夹内的
hdl目录(IP 源文件在同级ip目录)。DI 只负责生成 RTL,综合(syn)和布局布线(phy)等后续流程仍要回到 TD 中完成——DI 的入口和出口都在 TD。
自测:普通 port 连接的规则是什么?为什么一个输入端口不能接两个输出?
规则:输出 port 可以与任意输入 port 连接;输入 port 可以与任意 port 连接,但输入 port 只能被一个其他 port 连接。一个输入端口接两个输出意味着两个驱动源同时驱动一根线,硬件上会产生冲突(多驱动短路),所以 DI 直接禁止。要分发信号,应从一个输出分别连到多个输入。
自测:bus 连接的前提条件是什么?类型不同的 bus 怎么办?
当且仅当两个相同类型的 bus 才能直接连接(例如都为 AXI)。类型不同的 bus 需要使用对应协议转换的 IP 进行转换,例如各种 AXI-to-APB 之类的桥接 IP。
自测:导入 RTL 到 design 有哪些限制?重配置会修改你的源文件吗?
限制有四条:仅支持 Verilog(不支持 VHDL);仅支持已添加到 TD 工程中的 RTL 文件;仅支持单个文件中的单个 module(依赖文件需提前导入);重定制只改传入参数,不改源文件中的宏定义。重配置不会修改 RTL 源文件本身——只修改传入 module 的参数;如果你改了源文件的端口,需要在 DI 里重新定制以更新端口信息。
自测:时钟或复位端口悬空,Design 检查会阻止生成 RTL 吗?实际后果是什么?
不会阻止。时钟/复位检查的悬空结果不影响 RTL 生成,悬空端口会被强制拉到”0”。但这意味着上板后电路大概率不工作,所以 Warning 也要当回事,把时钟复位都接好再生成。