跳转至

实验五-Extra AI-Coder:四位全加器

概述

本指导书以实验五 四位全加器为例,介绍如何借助 AI-Coder 插件完成从工程创建、代码编写、功能仿真到综合实现的完整 FPGA 开发流程。AI-Coder 是一个集成在 VS Code 网页版中的智能助手插件,它提供了:

  • Vivado 操作按钮:一键执行创建工程、仿真、综合、实现、生成 bitstream 等常用操作
  • AI 辅助功能:通过自然语言对话,让 AI 根据实验需求自动生成 RTL 代码、testbench
  • 日志粘贴与纠错:将 Tcl Console 的最近日志粘贴到输入框,由 AI 分析错误并给出修复建议。

本次实验你将掌握:

  • AI-Coder 插件的完整操作流程,能借助 AI 完成 FPGA 开发全链路
  • 四位全加器的代码实现、仿真验证与硬件下板测试
  • 用 AI 自动分析 Vivado 报错、快速定位问题的方法

前置准备与提醒

目前实验在VS Code网页端进行完成,每位同学都会分配独立的容器,按照网络学堂分发的网站进行登录测试,请制定好工作目录,确保Vivado正常运行。

点击左侧边栏的 AI-Coder 图标,打开插件面板,可以看到如下界面:

AI-Coder 界面

建议右键点击左侧边栏的AI-Coder图标,选择移动到右侧边栏,避免切换代码 / 波形页面时插件会话被自动回收。

碰到问题

这是我们首次引入AI辅助硬件实验,如果遇到问题,请查FAQ或联系解决,也欢迎积极提供新功能建议。

完整流程预览与速查

步骤 操作 使用的按钮 / 功能 注意事项
1 创建 / 打开工程 创建工程 + 工程名输入框 提前打开对应实验文件夹
2 确认实验需求与约束规则 打开实验文档 + 实验下拉 本次选择四位全加器
3 编写 RTL/Testbench AI 编写代码 或自然语言对话 不要直接使用 AI 生成的约束文件
4 行为级仿真验证功能 仿真 + 时间输入框 Testbench 需符合命名规则
5 导入官方 XDC 约束 导入约束 + XDC 路径输入 使用实验文档提供的约束
6 综合 综合 耗时 1-3 分钟,勿重复点击
7 实现 实现 耗时 2-5 分钟,勿重复点击
8 生成 Bitstream 生成 bit 生成后核对文件存在
9 硬件烧写测试 OpenOCD 命令 / 烧写工具 提前连接实验箱并上电
手动执行命令 执行 Tcl 用于高级诊断
错误排查 粘贴日志 + 自然语言对话 补充问题描述再发送

实验步骤

第一步:创建 / 打开 Vivado 工程

插件默认在当前 VS Code 打开的工作区下创建工程,若需新建工程请确保当前目录不存在对应工程;若已存在同名工程,插件会直接打开旧工程,如需覆盖请先手动删除旧工程文件夹。

  1. 在 AI-Coder 面板顶部找到 “创建工程” 按钮,旁边有工程名输入框
  2. 将输入框改为你想要的工程名,例如 Lab5 ,注意所有工程目录、文件名、模块名、路径仅可使用英文、数字、下划线,不要出现中文、空格、特殊字符(如 @/ 中文括号 / 空格),否则会出现各类无法定位的编译 / 运行错误。
  3. 点击 “创建工程” 按钮。

如下,可以看到已经创建Lab5工程:

AI-Coder 界面

默认芯片型号

插件默认使用 xc7a35tfgg484-2,与实验箱 FPGA 型号一致。

持久化存储目录

只有在 ~//home/coder/ 内的文件会被持久化存储,其他路径下的文件会随着 Docker 重启而消失。建议在 ~/VivadoProjects

下创建新工程。


第二步:切换到对应的工程目录并阅读实验文档

  1. 每个实验对应独立子文件夹(如Lab5),实验前需先打开对应子文件夹作为 VS Code 工作区,再进行后续操作。请在 VS code 菜单选择“文件 -> 打开文件夹...”,打开最新工程目录(例如下图打开了Lab5)

AI-Coder 界面

AI-Coder 界面

AI-Coder 界面

  1. 在 Vivado 操作区点击 “打开实验文档”,在下拉框直接选择四位全加器即可跳转对应实验说明。

  2. 从下拉框选择实验(点亮数码管 / 四位全加器 / 计数器 / 串行密码锁 / 静态存储器访问)

  3. 浏览器会打开对应实验页面


第三步:使用 AI 编写代码与testbench

方式一:一键生成(推荐)

  1. 在底部输入框中粘贴本次实验的设计需求以及 实验五 四位全加器 中给定的参考代码,例如以下需求与源码( 也可以直接粘贴需求):
实验五:四位全加器。
用元件例化的方式设计实现一个四位全加器。
先编写一位全加器 full_adder(输入 A、B、Cin,输出 F、Cout),
再用 4 个 full_adder 例化组成四位全加器 Adder(输入 A[3:0]、B[3:0]、Cin,输出 F[3:0]、Cout)。
同时编写 Testbench 进行功能验证。
管脚约束:A[3:0] 对应 IO1~IO4,B[3:0] 对应 IO6~IO9,Cin 对应 IO5,
F[3:0] 对应 IO17~IO20,Cout 对应 IO16。

此外,如果要检测代码是否生成正确可让AI生成testbench,可以通过第四步仿真生成的波形图或test cases检测其是否正确,

以下为生成代码后的示意图:

AI-Coder 界面

  1. 点击 "AI 编写代码" 按钮,或直接点击 "发送"

AI 会根据你的描述,自动生成以下文件并写入工作目录:

文件 说明
full_adder.sv 一位全加器模块
Adder.sv 四位全加器顶层模块(例化 4 个 full_adder)
Adder_tb.sv 仿真测试文件
Adder.xdc 管脚约束文件

testbench 名称限制

当前实现检测将 testbench 加入仿真 sim_1 有名称要求:前缀匹配 tb*.v 或后缀匹配 *_tb.v。建议让 AI 生成前先约定好文件名。

方式二:对话式逐步生成

你也可以通过多轮对话逐步完善设计:

  1. 先发送:请帮我编写一位全加器 full_adder
  2. 确认无误后,再发送:用 4 个 full_adder 例化组成四位全加器 Adder
  3. 接着发送:为 Adder 编写 Testbench,覆盖多组输入组合
  4. 最后发送:生成 XDC 约束文件,A[3:0] 对应 IO1~IO4,B[3:0] 对应 IO6~IO9……

AI 自动写文件

AI 回复中如果包含文件块,插件会自动将文件内容写入你的工作目录。你可以在 VS Code 的文件浏览器中看到新生成的文件。

补充:使用“设置顶层”按钮

为减少工程设置错误,第三步生成代码和 testbench 后,建议顺手设置一次顶层,而不要只依赖手动执行 Tcl。

“设置顶层”区域位于 “仿真” 按钮附近,包含:

  • 顶层名输入框
  • fileset 选择框(sources_1 / sim_1
  • “设置顶层” 按钮

使用方法如下:

  1. 在输入框填写模块名,不要填写文件名;例如填 tb_adder不要填 tb_adder.v
  2. 若设置设计顶层,选择 sources_1;若设置仿真顶层,选择 sim_1
  3. 点击 “设置顶层”,系统会自动执行设置并回读确认结果

输入框中已提供示例占位文案:例如 tb_adder(不带 .v)

推荐用法

综合前可将 Adder 设为 sources_1 的顶层;仿真前可将 tb_adderAdder_tb 设为 sim_1 的顶层。若仿真识别不到 testbench,可优先使用此按钮修正,而不是手动输入 Tcl。


第四步:功能仿真

  1. “仿真” 按钮旁设置时间(默认 100,单位 us)
  2. 点击 “仿真”

当前仿真流程已升级,自动做以下事情:

  • 确保工程已打开
  • 扫描当前目录 Verilog 文件并分类加入 sources_1 / sim_1
  • 自动更新编译顺序
  • 自动检查/尝试设置 sim_1 top
  • 执行仿真命令序列: launch_simulation -> open_vcd -> restart -> log_vcd -> run xxxus -> close_vcd -> close_sim

仿真启动后,会生成dump.vcd文件,你可以利用VaporView插件打开,加入信号再在其中观察 ABCinFCout 各信号的变化,验证全加器的功能是否正确。标准的testbench应该还会有cases test,你也可以读取其在Vivado中的输出进行debug。

以下为仿真成功的提示。一是输出部分没有报Error,且testbench的cases均通过,二是Lab5_sim1目录下出现了dump.vcd波形图文件,我们可以借助 VaporView查看。

AI-Coder 界面

previous response id

与 AI 交互时,系统会展示 prid,将其完整复制(连带prid前缀)到输入框中并发送,可以返回到以前对话的状态。

常见失败原因

如果提示 sim_1 top is empty,通常是 testbench 未识别或命名不匹配,请检查 tb 文件名与模块名。


第五步:导入约束文件到工程

  1. 在第二步打开的实验文档中,在页面中找到管脚约束(XDC)部分,复制并保存为本地目录 .xdc 文件(例如 lab5.xdc)。
  2. “导入约束” 旁输入你的 XDC 文件路径(可直接用默认 labX.xdc
  3. 点击 “导入约束”

插件会执行类似:

set xdc_path "lab5.xdc"
if {[file exists $xdc_path]} {
    catch {remove_files [get_files $xdc_path]}
    catch {add_files -fileset constrs_1 -norecurse $xdc_path}
    update_compile_order -fileset constrs_1
}

若路径错误,会提示 xdc file not found

以下展示了一个添加Adder.xdc的例子,可以看到输出端无Error且报INFO: constraint imported: Adder.xdc,则说明顺利添加约束。

AI-Coder 界面

务必核对管脚映射

如果让AI生成,其生成的管脚约束应与 实验五 四位全加器 中给出的约束及实际硬件接线一致,请仔细核对后再进行综合。AI 生成的约束很可能有错误,因此生成代码后,建议直接使用实验文档的官方版本覆盖 AI 生成的 xdc 文件。


第六步:综合

点击 “综合” 按钮,插件会在确保工程打开后执行:

reset_run synth_1
launch_runs synth_1
wait_on_run synth_1

等待 Tcl Console 中出现 synth_1 complete 字样,表示综合完成,这一步将Verilog代码转换成FPGA真正能实现的硬件逻辑结构。

以下为成功展示: AI-Coder 界面


第七步:实现

点击 “实现” 按钮,执行:

reset_run impl_1
launch_runs impl_1
wait_on_run impl_1

等待 Tcl Console 显示 impl_1 complete,这一步将综合后的逻辑网表真正映射到FPGA芯片的物理资源。

以下为成功展示:

AI-Coder 界面


第八步:生成 Bitstream

点击 “生成bit” 按钮,执行:

open_run impl_1
write_bitstream -force [get_property DIRECTORY [current_run]]/[get_property TOP [current_fileset]].bit

生成完成后,.bit 文件会出现在工程目录的 impl_1 运行目录中,可用于下载到 FPGA。如下图所示:

AI-Coder 界面

若报 NSTD-1 / UCIO-1,说明约束未正确导入或端口名不匹配,请回到第二、五步检查。


烧板子

需要先安装 OpenOCD,参考 OpenOCD官网,例如 Mac 用户可以通过如下命令安装:

brew install openocd

WinUSB驱动

Windows 用户可能需要配置WinUSB驱动,步骤如下 1. 插入 FT2232HL 模块,打开 Zadig 软件,点击选项→ 勾选List All Devices。 2. 在设备列表中选择FT2232HL 的 Channel A(注意:仅替换 Channel A 驱动,保留 Channel B 的串口功能)。 3. 右侧驱动选择WinUSB,点击Replace Driver,等待驱动安装完成。 4. 验证:设备管理器中通用串行总线设备下能看到 WinUSB 设备,无黄色感叹号。

还需要一个对应于板子型号的配置文件:openocd_xc7a35t.cfg

随后下载第八步生成的 .bit 文件,并将其与下载的 .cfg 文件放置在同一目录。之后在此目录下打开终端,运行以下命令即可烧板并进行硬件测试:

openocd -f openocd_xc7a35t.cfg -c "init; pld load 0 YOUR_DESIGN.bit; exit"

如图 openocd.png

注意在命令中使用你生成的 .bit 文件。

手动在命令行输入 Tcl 执行

由于Vivado输出和终端不是同一个Vivado,无法在终端直接输入命令。在 Vivado 操作区最后有 “执行 Tcl” 输入框与按钮:

  1. 输入一条 Tcl 指令(例如 report_timing_summary
  2. 点击 “执行 Tcl”,命令会直接发送到 Vivado Tcl Console。

适用于临时诊断、手动修复和高级操作。


错误排查与纠正

出现错误时可用 “粘贴日志”

  1. 点击 “粘贴日志”,自动把最近 Tcl Console 输出放入输入框
  2. 在日志前/后补一句问题描述(如“实现失败,帮我定位”)
  3. 点击 “发送” 让 AI 分析。

FAQ

  1. Q:AI-Coder插件在侧边栏找不到了/打开后空白怎么办?\ A:① 快捷键快速唤醒:Windows/Linux按Ctrl+Alt+B,Mac按Command+Option+B;② 若仍空白,刷新网页等待1-2分钟让容器和Vivado后台进程加载完成,不要反复点击按钮导致进程卡死。

  2. Q:关闭页面重进后,AI的对话历史不见了怎么办?\ A:目前插件暂不支持会话持久化,建议提前右键点击左侧边栏的AI-Coder图标→选择「移动到右侧边栏」,避免切换代码/波形页面时会话被自动回收;若会话丢失,可重新描述需求或粘贴 prid 继续交互即可。

  3. Q:重启容器后之前写的代码/工程不见了怎么办?\ A:仅~/(即/home/coder/)目录下的文件会持久化存储,其他路径(如/opt、/tmp等)的文件会随容器重启丢失。建议所有实验统一存放在~/VivadoProjects/[实验名]路径下,例如本次实验为~/VivadoProjects/Lab5

  4. Q:刷新页面后需要重新创建工程吗?\ A:不需要,只要工程存放在持久化存储目录下,重进后打开对应实验文件夹,插件会自动打开已有工程,不会覆盖原有代码。

  5. Q:登录后卡顿/操作无响应怎么办?\ A:登录后等待5-10秒钟让Vivado后台进程启动完成再操作;若仍卡顿可刷新页面,或联系助教重置容器。

  6. Q:为什么创建完工程,AI生成的文件找不到/插件识别不到工程?\ A:创建完工程后,必须打开工作文件夹:① 先在~/VivadoProjects下创建Lab5工程;② 菜单选「文件→打开文件夹」选中Lab5作为当前工作区。

  7. Q:路径/文件名带中文/空格,编译报错怎么办?\ A:所有工程目录、文件名、模块名仅可使用英文、数字、下划线,禁止出现中文、空格、特殊字符(如@、中文括号等),否则会出现不可定位的编译错误。请将路径中的中文/特殊字符修改为英文后重试。

  8. Q:想重新做实验,怎么删除旧工程?\ A:在左侧文件浏览器找到旧工程文件夹,右键删除即可,再输入新的工程名点击「创建工程」即可创建全新工程。

  9. Q:怎么让AI生成的代码更符合要求?\ A:提需求时明确约束即可,比如本次实验可以直接说:\ 用元件例化方式实现四位全加器,要求:① 一位全加器模块名为full_adder;② 四位顶层模块名为Adder;③ Testbench文件名为Adder_tb.sv,符合*_tb命名规则,覆盖进位为0、进位为1、溢出等边界用例。\ 若AI生成的代码有错误,直接指出问题即可修改,无需重发全部需求,比如“刚才生成的全加器进位逻辑错误,应改为(A&B)|(A&Cin)|(B&Cin),请修正”。

  10. Q:可以手动修改AI生成的代码吗?还是必须用AI生成的内容?\ A:完全可以手动修改,AI仅作为辅助工具,你可以根据设计需求任意调整代码,修改后保存再重新执行仿真/综合即可。

  11. Q:AI回复了代码,但没有自动写入到文件里怎么办?\ A:① 确认你已经打开了实验文件夹作为工作区,文件有写入权限;② 可以手动复制AI输出的代码块,新建对应名称的文件粘贴保存即可。

  12. Q:testbench命名符合要求,但还是识别不到怎么办?\ A:testbench需要同时满足两个规则:① 文件名符合tb_*.v/*_tb.v/tb_*.sv/*_tb.sv规则;② 文件内的模块名和文件名完全一致(Linux大小写敏感,比如adder_tbAdder_tb会被识别为不同文件)。若仍识别不到,可手动执行Tcl命令指定仿真顶层(替换为你的testbench模块名):\ set_property top Adder_tb [get_filesets sim_1]

  13. Q:仿真报错sim_1 top is empty怎么办?\ A:① 先检查testbench文件名和模块名是否符合命名规则;② 若符合仍报错,执行问题12中的Tcl命令手动指定仿真顶层,再重新点击仿真。

  14. Q:仿真生成的波形全是X/没有信号变化怎么办?\ A:① 检查testbench是否对输入信号进行了初始化(比如在initial块中给A、B、Cin赋初值);② 确认仿真时间足够长(默认100us不够可调整为200us或1ms);③ 检查RTL代码是否存在位宽不匹配、信号未赋值等逻辑错误。

  15. Q:找不到仿真生成的dump.vcd文件怎么办?\ A:仿真成功后dump.vcd会生成在lab5.sim/sim_1/behav/xsim/dump.vcd下(以lab5为例),若没有则说明仿真失败,可查看AI-Coder输出的报错日志排查问题。

  16. Q:怎么查看仿真波形?\ A:打开dump.vcd文件→点击Netlist View,在VaporView左侧信号栏选中需要观察的信号(如A[3:0]F[3:0]Cout),拖拽到波形区即可查看时序。testbench的打印信息会直接显示在AI-Coder输出日志中,可直接查看测试用例是否全部通过。

  17. Q:点击综合/实现后卡住不动,长时间没有输出怎么办?\ A:综合通常耗时1-3分钟,实现耗时2-5分钟,若超过10分钟仍无输出,可能是Vivado出错,可刷新页面重进后重试。

  18. Q:生成Bitstream时报NSTD-1/UCIO-1错误怎么办?\ A:这是约束不匹配导致的,按以下步骤排查:① 执行Tcl命令get_ports *,查看输出是否包含顶层模块的所有端口,若没有则重新导入约束文件;② 对比XDC文件中get_ports后的端口名与get_ports *的输出是否完全一致(大小写、下划线均需匹配);③ 确认你使用的是实验文档提供的官方约束,而非AI生成的错误约束;④ 执行Tcl命令get_files -fileset constrs_1确认约束文件已被正确加入工程。

  19. Q:生成完Bitstream找不到.bit文件怎么办?\ A:生成的bit文件默认路径为./Lab5.runs/impl_1/Adder.bit(对应你的工程名和顶层模块名),也可执行Tcl命令get_property DIRECTORY [current_run]查看输出目录。

  20. Q:综合/实现失败了怎么办?\ A:直接点击AI-Coder的「粘贴日志」按钮,补充问题描述(如“综合失败,帮我定位原因”)发送给AI即可自动分析报错,无需手动翻日志。

  21. Q:烧写命令里的YOUR_DESIGN.bit要怎么改?\ A:替换为你实际生成的bit文件名,例如本次实验生成的顶层模块是Adder,则bit文件名为Adder.bit,修改后的命令为: openocd -f openocd_xc7a35t.cfg -c "init; pld load 0 Adder.bit; exit"

  22. Q:烧写时报错Error: libusb_open() failed with LIBUSB_ERROR_ACCESS怎么办?\ A:① Linux/Mac系统:在烧写命令前加sudo执行,或执行sudo usermod -aG dialout $USER将用户加入串口组,重启终端后即可无需sudo烧写;② Windows系统:确认已按照指导书要求安装了WinUSB驱动,且选择的是FT2232HL的Channel A(不要选错Channel B,否则串口功能会失效)。

  23. Q:烧写成功后,实验箱没有输出/功能不对怎么办?\ A:可排查:① 确认仿真时功能完全正确;② 核对XDC约束的端口名、管脚号与实验文档要求完全一致,确认没有错误约束;③ 确认实验箱已上电,拨码开关、LED等外设接线正确;④ 重新生成Bitstream后再次烧写。

  24. Q:Windows系统安装WinUSB驱动后仍识别不到设备怎么办?\ A:① 打开设备管理器,确认FT2232HL Channel A 无黄色感叹号;② 若仍有感叹号,重启电脑后重新用Zadig替换驱动,注意不要选错Channel B。

  25. Q:怎么手动执行Vivado命令?\ A:在AI-Coder面板的「执行Tcl」输入框输入需要执行的命令(如report_timing_summary),点击按钮即可直接发送到Vivado Tcl Console执行,适用于高级诊断和手动修复。

  26. Q:遇到报错怎么高效反馈给助教?\ A:请提供以下信息:① 你操作到哪一步出现的问题;② 完整的报错日志;③ 你已经尝试过哪些解决方法,助教可以更快帮你定位问题。

作者:j0ey-yu (58.77%), yingqi-z20 (41.23%)