Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 11 additions & 3 deletions .github/workflows/arty-a7-toy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,20 @@ jobs:
working-directory: platforms/arty-a7-toy
run: |
python3 scripts/verify_target.py
python3 scripts/verify_pr10_evidence.py
python3 scripts/verify_rob_evidence.py
python3 scripts/verify_rob_pr10_full.py
python3 scripts/verify_linux_gemmini_archive.py
python3 scripts/verify_linux_gemmini.py --build-record evidence/2026-10-12/linux-gemmini/build/LINUX_GEMMINI_BUILD.json --hardware-result evidence/2026-10-12/linux-gemmini/hardware/RESULT.json
python3 -m compileall -q scripts tests host software
bash -n scripts/elaborate.sh scripts/build_test_programs.sh software/build.sh
bash -n scripts/elaborate.sh scripts/elaborate_rob_candidate.sh scripts/build_test_programs.sh software/build.sh
- name: Install interface simulator
run: sudo apt-get update && sudo apt-get install -y iverilog
run: sudo apt-get update && sudo apt-get install -y iverilog tcl
- name: AXI, UART/SCU and DDR loader interface tests
working-directory: platforms/arty-a7-toy
run: timeout --signal=TERM --kill-after=15s 180s python3 scripts/check_board.py
run: |
timeout --signal=TERM --kill-after=15s 180s python3 scripts/check_board.py
python3 scripts/check_programming_scripts.py
python3 scripts/check_flash_guards.py
python3 scripts/check_runner_status.py
python3 scripts/check_platform_mutations.py
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,19 @@ The Arty A7 platforms have their own pinned Chisel build, serial loader, firmwar
constraints and verification record. Follow its guide directly; the setup and
demo below describe the existing Kintex-7 flow.

### Arty A7-100T 队友实板入口

Windows 克隆后进入 `platforms/arty-a7-toy`,安装
`python -m pip install -r host/requirements-hardware.txt`,再执行:

```powershell
.\run_hardware.ps1 -Port COM5 -Vivado 'D:\Xilinx\2025.1\Vivado\bin\vivado.bat'
```

入口自动下载固定 ROB/PR10 工程预发布、核验摘要,再复用原 Linux/Gemmini 验证器。
无需重建位流或 Linux;没有接板可加 `-PrepareOnly`。
请先阅读[中文准备与日志说明](platforms/arty-a7-toy/HARDWARE_TEST.md)。

The Toy/Linux target passes complete board implementation, Linux RTL checks and
a physical Arty A7-100T boot with full image readback and five Linux checks.
Its PCB revision remains unconfirmed and physical Gemmini testing is pending;
Expand Down
17 changes: 17 additions & 0 deletions platforms/arty-a7-toy/HARDWARE_RELEASE.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"tag": "arty-a7-rob-pr10-2026-10-13",
"url": "https://github.com/DangoSys/fpga/releases/download/arty-a7-rob-pr10-2026-10-13/arty-a7-rob-pr10-uart.zip",
"archive_bytes": 9666180,
"archive_sha256": "97ac0e4f624f77f40c60351279f80457c9ac21de95c81bf952ffbc2ca31dad92",
"manifest_sha256": "786d18edfa027a3e994792ee0d963ba99b3543f52eb9e71de7d175803e880d2d",
"source_commit": "9eaa67668a0db8b05653023722c3ec03f765e8d0",
"validation_input_commit": "5d20e94e6c85cce7f09424749cb9d0117023e000",
"flow": "ROB_PR10_UART",
"profile": "ROB_OPERAND_BRAM_WITH_PR10_FIXES",
"target": "xc7a100tcsg324-1",
"bitstream_sha256": "9f6f684361c049527fda09818cc8aa464f1067b75f3762305a27c5c738295942",
"payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0",
"payload_bytes": 25797640,
"test_count": 15,
"timeout_seconds": 3600
}
72 changes: 72 additions & 0 deletions platforms/arty-a7-toy/HARDWARE_TEST.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# 从仓库直接运行实板验证

目标:**Digilent Arty A7-100T / XC7A100T-CSG324-1**。入口固定到
`HARDWARE_RELEASE.json` 中的 ROB/PR10 UART 工程预发布,自动下载约 9.7 MB 的运行包,
核对 ZIP、清单、位流和软件摘要,再复用原 `host/check_linux_gemmini.py` 与烧录 Tcl。
无需重新编译硬件、构建 Linux、拉取子模块或登录研究服务器。
该位流目前通过实现和 RTL 验证,尚未取得本版实板验收结果。

## 首次准备

使用 Windows、64 位 Python 3.10+、Vivado Hardware Manager 与 Digilent/FTDI 驱动。
仅下载和烧录不要求安装 Artix-7 综合器件包。入口当前随 PR #10 提交;尚未合并时,
先在仓库根目录取得该 PR,然后进入平台目录:

```powershell
git fetch origin pull/10/head
git switch --detach FETCH_HEAD
cd platforms/arty-a7-toy
python -m pip install -r host/requirements-hardware.txt
```

连接板卡 **PROG/UART USB**,保持 **SW0=0**,关闭其他串口工具。设备管理器中的
USB Serial Port 对应 FT2232 的 **UART B**;请按实际端口修改 `COM5`。
驱动应提供 `C:\Windows\System32\ftd2xx.dll`。默认速率为 1,000,000,8N1。
PCB 修订号仍未确认,当前 DDR 使用官方 Rev E 参数;其他板卡不在这个入口的适用范围。

## 一条命令加载并验证

```powershell
.\run_hardware.ps1 -Port COM5 -Vivado 'D:\Xilinx\2025.1\Vivado\bin\vivado.bat'
```

Python 不在 PATH 时加 `-Python 'D:\python\python.exe'`。可以从任意工作目录以完整路径
调用脚本,包含空格的路径需加引号。入口先检查驱动、串口和 Vivado 路径,再配置 FPGA、
将约 25.8 MB 软件加载到 DDR 并完整读回、启动 Linux、执行 15 个程序。
覆盖五项 Linux 系统检查、原 13 项 Gemmini 测试及 16 项 OS/WS 矩阵对照。
DDR 传输与读回需要数分钟,进度直接显示,实板验证总超时一小时。

成功必须出现 `PASS_LINUX_AND_GEMMINI_HARDWARE`,15 个程序均返回 0,DDR 读回长度、
位流与镜像摘要一致。失败或超时返回非零;不复用旧 PASS,不把离线准备标成实板通过。

## 离线准备 / GitHub 下载不通

没有接板时,只准备文件:

```powershell
.\run_hardware.ps1 -PrepareOnly
```

它不访问串口、不调用 Vivado,结果为 `PREPARED_NOT_HARDWARE_TESTED`。
若自动下载失败,从[固定 Release](https://github.com/DangoSys/fpga/releases/tag/arty-a7-rob-pr10-2026-10-13)
下载 `arty-a7-rob-pr10-uart.zip`,无需手动解压,再执行:

```powershell
.\run_hardware.ps1 -PrepareOnly -BundleZip 'D:\Downloads\arty-a7-rob-pr10-uart.zip'
# 接板后仍可指定这个 ZIP,或者直接运行前面的一条命令,入口会复用已校验缓存。
```

缓存位于 `build/hardware-release/<tag>/`。每次复用均重新校验,摘要错误会终止,
请勿编辑缓存中的源码、清单或镜像;切换版本需更新固定发布信息并重新验证。

## 给队友检查的日志

每次入口记录独立写入 `build/hardware-entry/<时间-随机标识>/RUN.json`,包含发布版本、
摘要、状态以及本次原验证器 `RESULT.json` 的路径。
原始编程日志、Linux 串口输出和每个程序的退出码位于
`build/hardware-release/<tag>/bundle/build/hardware-gemmini-<日期-随机标识>/`。
分享本轮目录及入口记录即可;历史测试日志不覆盖。

此流程临时修改 FPGA SRAM 与 DDR,**不擦写 Flash**。掉电后需要重跑;它与已发布的
Flash 冷启动流程分别使用对应产物。完整能力和 MMIO 同步异常限制见
[完整验证报告](evidence/2026-10-13/rob-pr10-full/REPORT.md)。
28 changes: 28 additions & 0 deletions platforms/arty-a7-toy/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
# Toy/Linux on Arty A7-100T

## 队友直接跑实板验证

克隆后无需构建工具链或子模块,在 Windows 进入本目录:

```powershell
python -m pip install -r host/requirements-hardware.txt
.\run_hardware.ps1 -Port COM5 -Vivado 'D:\Xilinx\2025.1\Vivado\bin\vivado.bat'
```

替换真实串口与 Vivado 路径。入口自动获取固定 ROB/PR10 发布包、核对摘要,并调用原
Linux/Gemmini 实板验证器;没有接板可先运行 `.\run_hardware.ps1 -PrepareOnly`。
详细准备、离线 ZIP、超时和日志位置见[中文实板验证指南](HARDWARE_TEST.md)。

## 当前源码修复的验收范围

PR #10 修正了平台 AXI 写错误响应与烧录脚本校验,评估、回归和复现命令见
[修正说明](REVIEW_FIXES.md)。ROB 优化与本次修复已完成重新生成、整板实现及完整 RTL
回归,产物与原文报告见 [工程预发布下载](ROB_PR10_DOWNLOADS.md)。本轮没有连接板卡,
新位流尚无实物资格;下述历史实物记录仍属于其归档的旧源码/位流。

A Chisel-generated Toy platform for `xc7a100tcsg324-1`, with CPU, Sv39, full
FP16/32/64 support and Gemmini 8×8. Complete board implementation, timing, CDC
checks and Linux RTL tests pass. On 2026-10-12 the connected board was programmed,
Expand All @@ -15,6 +35,14 @@ it boots the original Linux image and passes all five system checks without
reloading from the host. See [Flash evidence](evidence/2026-10-12/flash/README.md).
Runtime DDR and changes to the initramfs remain volatile.

## 2026-10-12:可选 ROB 存储优化

新增 [ROB RAM 候选](ROB_RAM.md),整板布线后减少 484 LUT、1,657 FF 和
84 Slice,增加 2 BRAM tile。CPU/Gemmini/Linux RTL 回归周期数保持不变;
后续实物复测已通过完整镜像读回与两轮 Linux/Gemmini 回归,日志追加在
[PR #9](https://github.com/DangoSys/fpga/pull/9)。默认构建与既有发布版本保留
原寄存器路径;候选的 Flash 冷启动尚未验证。

## 2026-10-12:Linux/Gemmini 实物回归

按标准 rootfs/bbkernel 流程构建的新镜像已完成全部 DDR 读回和实物启动;
Expand Down
69 changes: 69 additions & 0 deletions platforms/arty-a7-toy/REVIEW_FIXES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# PR #10 评估与修正

先评估原提交 `f20b504`,再修正。本次保持已有芯片配置和公开验收记录,
不重新编程板卡、不修改 Flash,也不把旧位流认定为已包含新的 RTL 修复。

## 与当前版本的关系

#10 基于 main `4bdd4e4`。逐文件比较发现,它涉及的五个文件在当前 ROB 工作分支
`8f7bd63` 中仍与该基线逐字节相同,因此问题没有因 ROB 优化或新日志而消失。
五文件局部补丁对当前分支执行 `git apply --check` 通过。修正没有复制旧 chip
配置、恢复旧 RTL 核心或覆盖 #9/#11 的新资料。

## 逐项结论

| 原改动 | 评估 | 最终处理 |
|---|---|---|
| `scu_bresp` 去掉归约 OR | 正确;`10` 被压成 `01`,SLVERR 误变 EXOKAY | 保留;增加真实 SCU 到 CPU 输入端口的测试 |
| 预打包镜像的 `assert` 改显式异常 | 正确;`python -O` 会删除 assert | 保留;对四项记录字段做普通/-O 篡改检查 |
| 三个 Tcl 入口用 `!命令返回值` | 缺乏统一布尔返回值依据;可拒绝合法成功 | 改用原生 Tcl 异常处理,增加配置状态检查 |

本机 Vivado 2025.1 随附文档及
[UG835 设备命令](https://docs.amd.com/r/2025.1-English/ug835-vivado-tcl-commands/program_hw_devices)
描述硬件对象/执行记录返回值;
[Flash 命令](https://docs.amd.com/r/2025.1-English/ug835-vivado-tcl-commands/program_hw_cfgmem)
描述成功返回记录、失败报错。没有支持“这三个命令统一失败返回 0、不抛错”的依据。
离线按兼容返回值注入,原 #10 的三个脚本都在成功路径报布尔类型错误。
本机实际 `vivado.bat -mode batch` 执行只含 `error` 的离线脚本,退出码为 1。
这验证错误传播,不是一次真实编程失败实验。

最终 Tcl 通过 `catch` 的状态识别异常,保留原错误选项;JTAG/Flash bridge
编程后刷新并要求 DONE/EOS 为 1、CRC_ERROR 为 0。Flash 备份命令成功且完整
16 MiB 后才允许擦写;编程/verify 报异常就停止,不打印成功标志。

## 对原 PR 其他观察的评估

- `axi_fullwidth` 的 `addr + len×bytes_per_beat` 表示最后一拍起点,配合已有
对齐和大小检查可以判定范围;不能直接改成 `len+1`。跨 4 KiB 拒绝符合
[AXI 协议要求](https://docs.amd.com/r/en-US/pg101-axi-protocol-checker/AXI-Protocol-Checks-and-Descriptions)。
这部分 RTL 本次保留原值。
- Flash observer 对瞬时断连可能报假失败的观察有合理性;改变它可能影响真实
冷启动的断连语义,本次不改。
- 异步构建 worker 的退出码不足以表达任务最终状态,这个观察成立;现有
`RUN.json`/位流检查契约保留,本次不扩展到构建调度器。

## 验证与资格

- 原 #10 Tcl 的成功路径错误已离线复现;修正后 20 个返回值、异常、DONE/EOS/CRC
与短备份用例通过。fixture 不加载 Vivado,不连接硬件。
- Python 普通/-O 两种模式,各覆盖有效记录及四项篡改,共 10 项通过;使用
替代 Observer 在编程边界停止,测试不会访问串口或执行 Vivado。
- 接口回归四组通过:原 AXI fullwidth、SCU、DDR loader,加新增平台 B 响应。
新用例使用实际平台与 SCU,检查正常写、非法地址、非对齐和错误 burst,
从 CPU 输入端检查响应、ID 及背压稳定性。仅使用 Chisel 端口 fixture,未模拟 CPU 行为。
- 同一用例对当前旧平台反测,在 `0x60030000` 得到 `01` 而预期 `10`,按预期失败;
修正版本通过。日志在 `evidence/2026-10-12/pr10-review/`。

SOURCE_LOCK 更新当前源码摘要;历史 Tcl/位流/实物日志保持原字节。
历史验收校验绑定归档中的原脚本,当前脚本由新摘要与测试绑定,不继承原脚本实物资格。
核心生成摘要仍保留原值。板级 RTL 已变,新位流还需重新综合、布线和实物验收;
2026-10-12 的 ROB 实板记录使用 #11 的旧接口版本,未包含本次 AXI 修复。

## 2026-10-13:新版自检

自检发现并修正两处验证问题:复跑失败可能遗留旧 PASS 结果;原平台测试未直接检查
背压期间 BVALID 持续有效。新的离线入口启动即写 RUNNING,异常写 FAILED;平台用例
同时检查 BVALID/响应/ID,并检查响应握手后有效信号撤销。
原四组接口、20 项 Tcl 和 10 项镜像检查再次通过,新增实际入口失败注入和 RTL 错误
注入证明两个缺口已堵住。测试源码、日志与精确边界见
[自检报告](evidence/2026-10-13/pr10-selfcheck/REPORT.md)。原 10 月 12 日档案保持原字节。
34 changes: 34 additions & 0 deletions platforms/arty-a7-toy/ROB_PR10_DOWNLOADS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# ROB/PR10 工程预发布下载

目标为 **Digilent Arty A7-100T / XC7A100T-CSG324-1**。本版合并 ROB 操作数 BRAM 优化
和 PR10 修复,保持 CPU、Sv39、FP16/32/64、Gemmini 8×8 及既有接口。
通过完整实现和 RTL 回归;用户本轮无法连接板卡,**新位流尚未做实板验证**。
资源、原文报告、测试与已知 MMIO 限制见 [完整报告](evidence/2026-10-13/rob-pr10-full/REPORT.md)。

[GitHub 工程预发布](https://github.com/DangoSys/fpga/releases/tag/arty-a7-rob-pr10-2026-10-13)
提供以下文件;旧 2026-10-12 的 UART/Flash 附件保持原值。

| 文件 | 用途 |
|---|---|
| [UART 完整包](https://github.com/DangoSys/fpga/releases/download/arty-a7-rob-pr10-2026-10-13/arty-a7-rob-pr10-uart.zip) | 位流、配套软件、Tcl、板级/生成 RTL、中文说明和一键加载/测试入口 |
| [源码包](https://github.com/DangoSys/fpga/releases/download/arty-a7-rob-pr10-2026-10-13/arty-a7-rob-pr10-sources.zip) | 仓库快照、实际生成 RTL、原 FPU 基线、软件依赖源码/配置、许可证和验证证据 |
| [位流](https://github.com/DangoSys/fpga/releases/download/arty-a7-rob-pr10-2026-10-13/toy_a7_rob_pr10_uart.bit) | 单独临时 JTAG 配置;仍需加载软件到 DDR |
| [烧录 Tcl](https://github.com/DangoSys/fpga/releases/download/arty-a7-rob-pr10-2026-10-13/program_arty.tcl) | 原生异常和 DONE/EOS/CRC 检查,可从任意目录调用 |
| [实现 Tcl](https://github.com/DangoSys/fpga/releases/download/arty-a7-rob-pr10-2026-10-13/build_board.tcl) | 配合完整包的 board/ 和生成 RTL 重建,不是单文件构建环境 |

位流 SHA256 为 `9f6f684361c049527fda09818cc8aa464f1067b75f3762305a27c5c738295942`。
下载后用 Release 的 SHA256SUMS.txt 检查附件,ZIP 内 verify_bundle.py 检查全部内容。
RELEASE_MANIFEST.json 同时记录发布源码提交与实际验证输入提交,测试/文档追加不伪装成重新构建。

Windows 解压完整包后,按真实路径执行:

已克隆仓库的队友可以直接使用仓库的 `run_hardware.ps1` 自动下载并验证这个固定版本,
无需手动解压;见[仓库实板入口](HARDWARE_TEST.md)。下面的 `run_uart.ps1` 仍适用于已解压包。

```powershell
.\run_uart.ps1 -Port COM5 -Vivado 'D:\Xilinx\2025.1\Vivado\bin\vivado.bat'
```

入口读取包内的新位流摘要,不沿用旧位流的默认值。临时 JTAG→软件完整 DDR 读回→Linux/
Gemmini 测试,日志留在新 build/ 目录。仅用 Hardware Manager 即可烧录;重建需要 Artix-7
器件支持。本包不是 Flash 固化包,掉电后须重载,不能替换旧 Flash 包的配套 MCS。
Loading
Loading