让 AI 逆向 NVIDIA SASS 指令并用 RTL 实现 Verilator 仿真
-
- 一、背景与动机
-
- 我们想解决什么问题?
- [测试的 AI 工具](#测试的 AI 工具)
- 实验的大致思路
- 二、测试小结:只有一个工具完成了任务
- [三、提示词设计:分阶段引导 AI](#三、提示词设计:分阶段引导 AI)
- [四、提供给 AI 的工程文件](#四、提供给 AI 的工程文件)
-
- [`wmma_demo.cu` 核心逻辑](#
wmma_demo.cu核心逻辑) - [`Makefile` 作用](#
Makefile作用)
- [`wmma_demo.cu` 核心逻辑](#
- 五、环境搭建:一步步准备好实验场
-
- [1. 创建基础容器](#1. 创建基础容器)
- [2. 安装必要工具](#2. 安装必要工具)
- [3. 安装并配置 Codex](#3. 安装并配置 Codex)
- [4. 安装并配置 Claude Code](#4. 安装并配置 Claude Code)
- [5. 安装并配置 CodeBuddy Code](#5. 安装并配置 CodeBuddy Code)
- [6. 提交镜像,便于复用](#6. 提交镜像,便于复用)
- [7. 为不同工具创建独立容器](#7. 为不同工具创建独立容器)
- 六、总结与思考
本文记录了一次有趣的尝试:让主流 AI 编程助手阅读 NVIDIA GPU 的底层汇编(SASS),自动推导指令功能,并用硬件描述语言(RTL)实现一个微型的 GPGPU 核心,最后通过 Verilator 仿真验证结果。实验对比了 Claude Code、Codex 和 CodeBuddy Code 三个工具的表现。
一、背景与动机
我们想解决什么问题?
现代 GPU 的核心计算能力来自高度优化的硬件单元,例如 Tensor Core 可以高效执行矩阵乘加运算。NVIDIA 的 CUDA 编程模型允许开发者通过 WMMA(Warp Matrix Multiply Accumulate)等 API 调用这些硬件,但底层到底发生了什么?编译器将 CUDA C++ 代码编译成一种叫做 SASS(Shader Assembly)的指令集,这是 GPU 真正执行的机器码的人类可读形式。
如果我们能够逆向分析这些 SASS 指令,并用 RTL(寄存器传输级,一种描述数字电路行为的抽象层次)语言(如 Verilog)重新实现它们的功能,就可以:
- 深入理解 GPU 微架构的工作方式;
- 为专用加速器设计提供参考;
- 探索 AI 在硬件逆向与设计自动化中的潜力。
测试的 AI 工具
我们选择了三款主流的 AI 编程助手进行对比:
- Claude Code(Anthropic 出品)
- Codex(OpenAI 出品)
- CodeBuddy Code(腾讯云出品)
它们都支持在命令行环境下与代码仓库交互,理论上可以阅读文件、编写代码、运行命令。但面对"逆向 SASS 指令并实现 RTL"这样极具挑战性的任务,它们的表现会有多大差异?
实验设计说明 :为了公平比较工具本身的优劣,我们特意让三个 AI 工具都使用同一规模的 27B 开源模型 (qwen3.8-27b ,只是不同工具连接了不同服务端点)。这样,底层模型的智能水平基本一致,实验结果的差异主要来源于各工具的框架设计、上下文管理、任务分解和代码生成策略,而非模型能力。如果直接使用各工具的原生顶级模型(如 Claude 3.5 Sonnet、GPT-4o 等),则无法区分是模型强还是工具设计好。
实验的大致思路
- 编写一个使用 WMMA 的 CUDA 演示程序(
wmma_demo.cu); - 编译并提取其 SASS 指令文本(
kernel_sass.txt); - 让 AI 分析每一条 SASS 指令的功能,并用 Verilog 实现等价逻辑;
- 构建一个简单的取指-译码-发射-执行流水线,形成一个微型 GPGPU;
- 使用 Verilator(一款将 Verilog 转换为 C++ 的高性能仿真器)进行仿真,将输出与 GPU 实际计算结果对比,误差应小于 1e-6。
二、测试小结:只有一个工具完成了任务
经过反复尝试,结果非常明确:
- Claude Code 是唯一一个成功完成了整个流程的工具。
- Codex 和 CodeBuddy Code 均未能独立完成全部步骤,主要表现为:
- 无法正确理解 SASS 指令的语义;
- 生成的 Verilog 代码存在大量逻辑错误;
- 在环境配置或指令转换环节反复卡住。
这一结果令人深思:当前的 AI 编程工具在处理常规软件开发时表现不错,但一旦面对底层硬件逆向这样需要深度领域知识和多步骤推理的任务,差距就非常明显。由于三个工具使用的底层模型规模相同,Claude Code 的成功更多地归功于其更好的任务规划能力、更长的有效上下文管理以及更稳健的代码生成与迭代机制。
三、提示词设计:分阶段引导 AI
为了让 AI 能够逐步完成任务,我们将提示词拆分为两个阶段。
第一阶段:明确目标与已知条件
这段提示词为 AI 设定了清晰的路径:从已有的 SASS 文本出发,先转换指令流,再逆向实现 RTL,最后用仿真验证。
txt
# 目标:
1、用RTL执行CUDA SASS指令流
# 已知:
1、当前目录下是CUDA MMA指令的Demo,kernel_sass.txt是这个cuda kernel DUMP出来的SASS指令文本文件
# 思路:
1、基于wmma_demo.cu,生成该kernel的输入(input.bin)和输出Golden数据(output_gt.bin)
2、用一个python脚本将kernel_sass.txt转换成RTL方便解析的指令流(kernel.bin)
3、逆向分析每一条SASS指令的功能,用RTL实现
4、增加一个SASS指令取指、译码、发射等模块,最后形成一个完备的微型GPGPU的RTL
5、用verilator对RTL仿真,输入input.bin,将输出的结果跟output_gt.bin对比误差,MSE应该小于1e-6
解释:这里要求 AI 不仅要读懂 SASS,还要完成从软件到硬件的转换,并且给出可量化的验证标准。
第二阶段:要求输出文档
在技术实现的基础上,让 AI 用通俗语言总结思路,方便更多人理解。
bash
用中文写一篇Markdown文章 介绍你解决问题的详细思路 增加必要的解释 让更多的人能看懂
这一阶段其实是对整个过程的复盘,也帮助 AI 梳理自己的思考路径。
四、提供给 AI 的工程文件
为了让 AI 有明确的起点,我们准备了一个完整的 CUDA 工程,包括:
wmma_demo.cu:主程序,使用 WMMA API 完成 16×16×16 的矩阵乘加,并调用 CPU 参考实现验证结果;Makefile:自动化编译和提取 SASS 的脚本。
wmma_demo.cu 核心逻辑
该程序做了以下几件事:
- 初始化矩阵 :随机生成半精度浮点数(
half)矩阵 A 和 B,以及单精度浮点数矩阵 C; - 在 GPU 上执行 WMMA 矩阵乘加 :
D = A×B + C; - 使用 CPU 计算参考结果:用简单的三重循环实现同样的运算,用于验证 GPU 结果的正确性;
- 输出最大误差,如果误差小于 1e-6 则认为通过。
此外,代码还通过 clock64() 测量了 WMMA 指令的执行周期数,方便观察硬件性能。
注意:B 矩阵以列主序存储,这是 WMMA API 的约定,也是后续 SASS 逆向时需要关注的点。
Makefile 作用
makefile
all:
nvcc -arch=sm_86 -o wmma_demo wmma_demo.cu
nvcc -arch=sm_86 -cubin -o wmma_kernel.cubin wmma_demo.cu
cuobjdump -sass wmma_kernel.cubin > kernel_sass.txt
它完成了三个步骤:
- 编译 CUDA 程序为可执行文件;
- 生成 CUDA 二进制文件(
.cubin); - 使用
cuobjdump反汇编出 SASS 指令文本。
最终得到的 kernel_sass.txt 就是 AI 需要逆向的对象。
五、环境搭建:一步步准备好实验场
实验在 Docker 容器中进行,以确保环境一致性。我们使用了 NVIDIA 官方 PyTorch 镜像(nvcr.io/nvidia/pytorch:26.03-py3),其中已经包含了 CUDA 工具链和驱动支持。
1. 创建基础容器
bash
mkdir /ext/ai_sass_rtl
cd /ext/ai_sass_rtl/
tmux new -s ai_sass_rtl
docker run --gpus all --shm-size=128g -it -e NVIDIA_VISIBLE_DEVICES=all \
--privileged --net=host \
-v $PWD:/home -w /home \
--name=ai_sass_rtl nvcr.io/nvidia/pytorch:26.03-py3 /bin/bash
--gpus all:允许容器使用所有 GPU;--shm-size=128g:扩大共享内存,避免 WMMA 操作因内存不足失败;-v $PWD:/home:将当前目录挂载到容器内,方便文件共享。
2. 安装必要工具
bash
apt update
apt-get install verilator # Verilator 仿真器
apt install curl -y
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 24
- Verilator:用于将 Verilog 代码编译为 C++ 仿真程序;
- nvm 和 Node.js 24:因为多个 AI 工具基于 Node.js 运行。
3. 安装并配置 Codex
bash
npm install -g @openai/codex
mkdir -p ~/.codex/
cat > ~/.codex/config.toml << 'EOF'
model_provider = "ollama-launch"
model = "qwen3.8-27b-2"
model_catalog_json = "~/.codex/model-catalog.local.json"
[model_providers.ollama-launch]
name = "Ollama"
base_url = "http://192.168.1.100:8082/v1/"
wire_api = "responses"
requires_openai_auth = false
supports_websockets = false
env_key = "XAI_API_KEY"
EOF
cat > ~/.codex/model-catalog.local.json << 'EOF'
{
"models": [
{
"slug": "qwen3.8-27b-2",
"display_name": "qwen3.8-27b-2",
"description": null,
"supported_reasoning_levels": [],
"default_reasoning_level": "medium",
"shell_type": "shell_command",
"visibility": "list",
"supported_in_api": true,
"priority": 1,
"availability_nux": null,
"upgrade": null,
"base_instructions": "You are a helpful coding agent.",
"supports_reasoning_summaries": false,
"support_verbosity": false,
"default_verbosity": null,
"apply_patch_tool_type": null,
"truncation_policy": { "mode": "bytes", "limit": 10000 },
"supports_parallel_tool_calls": false,
"experimental_supported_tools": [],
"effective_context_window_percent": 95,
"context_window": 262144
}
]
}
EOF
codex --sandbox danger-full-access --ask-for-approval never
这里将 Codex 连接到一个自定义的 Ollama 推理服务(提供 Qwen 模型),并通过配置文件指定模型参数和上下文窗口大小。
4. 安装并配置 Claude Code
bash
export AI_MODEL=qwen3.8-27b-3
export AI_AUTH_TOKEN="ollama"
export AI_BASE_URL=http://192.168.1.100:8083
cat > ~/.claude.json << EOF
{
"firstStartTime": "2026-04-17T07:13:49.158Z",
"opusProMigrationComplete": true,
"sonnet1m45MigrationComplete": true,
"migrationVersion": 11,
"changelogLastFetched": 1776410045295,
"hasCompletedOnboarding": true,
"env": {
"IS_SANDBOX": "1",
"ANTHROPIC_AUTH_TOKEN": "$AI_AUTH_TOKEN",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
"ANTHROPIC_BASE_URL": "$AI_BASE_URL",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "$AI_MODEL",
"ANTHROPIC_REASONING_MODEL": "$AI_MODEL",
"ANTHROPIC_MODEL": "$AI_MODEL",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "$AI_MODEL",
"ANTHROPIC_API_KEY": "",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "$AI_MODEL",
"ANTHROPIC_SMALL_FAST_MODEL": "$AI_MODEL",
"CLAUDE_CODE_MAX_CONTEXT_TOKENS":"262144"
}
}
EOF
claude --dangerously-skip-permissions
Claude Code 的配置同样指向自定义模型服务,并设置了最大上下文 token 数,以支持处理长 SASS 文件。
5. 安装并配置 CodeBuddy Code
bash
npm install -g @tencent-ai/codebuddy-code
mkdir -p ~/.codebuddy/
cat > ~/.codebuddy/models.json << EOF
{
"models": [
{
"id": "qwen3.8-27b-1",
"name": "Auto-2",
"vendor": "Tencent Cloud",
"apiKey": "",
"url": "http://192.168.1.100:8081/v1/"
}
],
"availableModels": ["qwen3.8-27b-1"]
}
EOF
codebuddy-code
6. 提交镜像,便于复用
bash
docker commit ai_sass_rtl ai_sass_rtl:dev
7. 为不同工具创建独立容器
为了避免工具之间相互干扰,我们基于同一个镜像创建了三个独立容器,分别运行不同的 AI 助手。
- Codex 容器:
bash
docker run --gpus all --shm-size=128g -it -e NVIDIA_VISIBLE_DEVICES=all \
--privileged --net=host \
-v $PWD:/home -w /home \
--name=ai_sass_rtl_codex ai_sass_rtl:dev /bin/bash
- CodeBuddy Code 容器:
bash
docker run --gpus all --shm-size=128g -it -e NVIDIA_VISIBLE_DEVICES=all \
--privileged --net=host \
-v $PWD:/home -w /home \
--name=ai_sass_rtl_codebuddy ai_sass_rtl:dev /bin/bash
六、总结与思考
这次实验虽然技术门槛较高,但揭示了一些有趣的现象:
- AI 编程工具的能力边界远比我们想象的清晰。在常规 Web 开发、脚本编写等任务上,它们可能难分高下;但一旦进入需要硬件、体系结构、编译器等多领域交叉知识的深水区,差距立刻显现。而且由于模型相同,这种差距完全归因于工具自身的工程化设计。
- 提示词的设计至关重要。我们采用的分阶段、目标明确的提示方式,很可能也是 Claude Code 能够成功的原因之一。把复杂任务拆解成可验证的步骤,同时提供足够的上下文,是引导 AI 完成高难度任务的关键。
- 硬件设计自动化仍有很长的路要走。虽然 Claude Code 完成了任务,但整个过程仍然需要人工大量干预和调试,距离真正的"一键逆向"还有很大距离。
对于对 GPU 架构、硬件设计或 AI 辅助开发感兴趣的读者,这个实验提供了一个可复现的起点。希望未来会有更强大的 AI 工具,能够更轻松地跨越软件与硬件之间的鸿沟。