一个基于大语言模型(LLM)的自动化硬件验证框架,面向 RISC-V 处理器与相关硬件项目,通过智能生成测试用例来提升代码覆盖率。
ChipFuzzer 是一个创新的硬件验证框架,它结合了:
- 大语言模型(LLM):智能生成 RISC-V 汇编测试用例
- 代码覆盖率分析:实时追踪和提升代码覆盖率
- 自动化测试流程:从生成到编译、执行、分析的完整自动化
- Web 可视化界面:实时监控测试进度和覆盖率统计
该框架旨在解决传统硬件验证中测试用例生成效率低、覆盖率提升困难的问题,通过 LLM 的智能分析能力,自动生成针对性的测试用例。
- LLM 驱动:支持多种 LLM 模型(OpenAI API、本地模型等)
- 上下文感知:基于未覆盖代码和 SPEC 文件生成针对性测试用例
- 自动修复:编译失败时自动调用 LLM 修复代码
- 策略多样化:支持边界测试、CSR 测试、内存测试等多种策略
- 全局覆盖率追踪:实时统计和更新代码覆盖率
- 模块级分析:支持按模块进行覆盖率测试和分析
- 增量覆盖:只保留真正提升覆盖率的测试用例
- L2 模块组统计:专门针对 L2Cache、L2TLB 等关键模块的覆盖率统计
- 历史记录:记录每次 LLM 交互的成功/失败经验
- 上下文复用:利用历史成功案例指导新测试用例生成
- 策略学习:从失败中学习,避免重复错误
- 自动解析:解析项目中的 SPEC 文件(
*spec*.sv) - 信号提取:提取模块接口、信号宽度等关键信息
- 智能匹配:将 SPEC 信息整合到 LLM prompt 中
- 测试建议:基于 SPEC 生成针对性的测试策略
- 实时监控:SSE/轮询方式实时显示测试日志
- 覆盖率可视化:图表展示覆盖率增长趋势
- 统计信息:LLM 生成次数、编译成功率、模拟器执行成功率等
- 成功案例管理:查看和管理成功提升覆盖率的测试用例
┌─────────────────────────────────────────────────────────────┐
│ ChipFuzzer 框架 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ LLM 模块 │───▶│ 代码生成 │───▶│ 编译验证 │ │
│ │ (OpenAI/本地)│ │ (RISC-V ASM)│ │ (GCC/工具链)│ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ │ ▼ ▼ │
│ │ ┌──────────────┐ ┌──────────────┐ │
│ └───────────▶│ Agent Memory │ │ 模拟器执行 │ │
│ │ (历史记录) │ │ (Emulator) │ │
│ └──────────────┘ └──────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────┐ │
│ │ 覆盖率分析与管理 │ │
│ │ (GlobalCoverageManager) │ │
│ └──────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ Web UI (FastAPI) │ │
│ │ (实时监控/可视化) │ │
│ └──────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
- Python 3.8+
- RISC-V 工具链(GCC、objdump 等)
- Verilator(用于覆盖率分析)
- 目标硬件项目环境
- LLM API 访问权限(OpenAI API 或本地模型)
- 克隆仓库
git clone https://github.com/fireceW/ChipFuzzer.git
cd ChipFuzzer- 安装 Python 依赖
pip install -r chipfuzz/server/requirements.txt- 配置路径
编辑
config.py或通过命令行参数设置:
- 目标项目路径
- 覆盖率文件路径
- LLM API 配置
- 启动 Web 服务(可选)
cd chipfuzz/server
python3 -m uvicorn app:app --host 0.0.0.0 --port 8080# 测试单个模块
python <backend-script>.py \
--module Bku \
--model qwen3:235b \
--mode continue \
--max_iterations 20
# 自动模式(测试多个模块)
python <backend-script>.py \
--module auto \
--num 5 \
--model qwen3:235b \
--mode fresh \
--auto_switch
# 使用 SPEC 文件增强
python <backend-script>.py \
--module L2TLB \
--model qwen3:235b \
--use_spec \
--max_iterations 30| 参数 | 说明 | 默认值 |
|---|---|---|
--module |
要测试的模块名,或 auto 自动选择 |
必需 |
--model |
LLM 模型名称 | 必需 |
--mode |
运行模式:continue(继续)或 fresh(重置) |
continue |
--max_iterations |
每个模块最大尝试次数 | 20 |
--num |
自动模式下测试的模块数量 | 1 |
--auto_switch |
自动切换模块(达到条件后) | False |
--use_spec |
启用 SPEC 文件分析 | False |
--run_existing_seeds |
运行已有成功用例 | False |
- 继续使用已有的覆盖率文件(
sum_gj.dat) - 在现有基础上提升覆盖率
- 适合持续测试和增量改进
- 创建全新的覆盖率基线
- 清空之前的覆盖率数据
- 适合重新开始或基准测试
- 启动后端 API
cd chipfuzz/server
python3 -m uvicorn app:app --host 0.0.0.0 --port 8080- 配置 Nginx(可选,用于生产环境)
location /api/ {
proxy_pass http://127.0.0.1:8080/api/;
proxy_http_version 1.1;
proxy_buffering off;
}- 打开 Web 界面
- 直接打开
chipfuzz/index.html - 或通过 Web 服务器访问
-
连接配置
- API Base:
http://localhost或你的服务器地址 - Run ID: 从启动任务后获取
- API Base:
-
实时监控
- 实时日志流(SSE/轮询)
- 任务状态显示
- 覆盖率实时更新
-
统计信息
- LLM 生成次数
- 编译成功率
- 模拟器执行成功率
- 覆盖率增长曲线图
-
成功案例
- 查看成功提升覆盖率的测试用例
- 下载
.S、.bin和报告文件
主要路径在 config.py 中定义:
project_root = "/path/to/target_project/"
testcase_dir = "/path/to/testcases"
global_annotated_dir = "/path/to/annotated"
sum_dat_file = "/path/to/sum_gj.dat"在 LLM_API.py 中配置:
OPENAI_API_KEY = "your-api-key"
OPENAI_API_BASE = "https://api.openai.com/v1"在 LLM_API_KJY.py 中配置本地模型接口。
覆盖率相关路径:
--coverage_filename_origin: 原始覆盖率文件路径--coverage_filename_later: 后续覆盖率文件路径--global_annotated_dir: 全局 annotated 目录
ChipFuzzer/
├── 主后端脚本 # 主程序入口
├── global_coverage.py # 全局覆盖率管理
├── agent_memory.py # Agent 记忆系统
├── code_analyzer.py # 代码分析器
├── asm_validator.py # 汇编代码验证器
├── spec_analyzer.py # SPEC 文件分析器
├── prompt.py # LLM prompt 模板
├── LLM_API.py # OpenAI API 接口
├── LLM_API_KJY.py # 本地模型 API 接口
├── config.py # 配置文件
│
├── chipfuzz/ # Web UI
│ ├── index.html # 前端页面
│ ├── assets/ # 静态资源
│ │ ├── main.js # 前端逻辑
│ │ └── style.css # 样式文件
│ └── server/ # 后端服务
│ ├── app.py # FastAPI 应用
│ └── requirements.txt # Python 依赖
│
├── GJ_Success_Seed/ # 成功测试用例
│ ├── *.S # 汇编文件
│ ├── *.bin # 二进制文件
│ └── *.txt # 用例报告
│
├── GJ_log/ # 日志和统计
│ ├── *.log # 运行日志
│ ├── statistics_*.json # 统计数据
│ └── module_report_*.txt # 模块报告
│
└── agent_memory/ # Agent 记忆数据
└── *_memory.json # 各模块的记忆文件
- Python 3.8+: 主要开发语言
- FastAPI: Web 后端框架
- Verilator: 硬件仿真和覆盖率分析
- Chart.js: 前端图表可视化
- RISC-V 工具链: 编译和链接
- LLM APIs: OpenAI / 本地模型接口
-
初始化
- 读取未覆盖代码
- 初始化 Agent Memory
- 加载 SPEC 文件(如果启用)
-
生成阶段
- LLM 分析未覆盖代码
- 生成 RISC-V 汇编测试用例
- 验证汇编语法
-
编译阶段
- 使用 RISC-V 工具链编译
- 如果失败,调用 LLM 修复
-
执行阶段
- 运行模拟器执行测试用例
- 收集覆盖率数据(
.dat文件)
-
分析阶段
- 合并覆盖率数据
- 更新全局覆盖率统计
- 判断是否提升覆盖率
-
保存阶段
- 如果提升覆盖率,保存为成功用例
- 更新 Agent Memory
- 生成用例报告
GJ_Success_Seed/{module}_asm_{timestamp}_{hash}.S: 汇编源代码GJ_Success_Seed/{module}_asm_{timestamp}_{hash}.bin: 编译后的二进制GJ_Success_Seed/{module}_asm_{timestamp}_{hash}.txt: 用例报告
GJ_log/statistics_{timestamp}.json: 统计数据(LLM 次数、成功率等)GJ_log/module_report_{timestamp}.txt: 模块测试报告
sum_gj.dat: 累积覆盖率数据coverage.info: 覆盖率信息文件annotated/: 带注释的源代码
A: 框架会自动调用 LLM 修复代码,最多尝试 3 次。如果仍然失败,会跳过该用例。
A: 使用 genhtml 工具:
cd /path/to/target_project
genhtml coverage.info --output-directory coverage_reportA: 确保统计数据文件正常生成,检查 GJ_log/statistics_*.json 文件。
A: 检查:
- 后端服务是否运行(
ps aux | grep uvicorn) - API Base 配置是否正确(不要包含
/api后缀) - Nginx 配置(如果使用)是否正确
A: Fresh 模式会重置基线,首次运行后基线会自动设置为第一次测试的结果。
欢迎贡献代码!请遵循以下步骤:
- Fork 本仓库
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
- ✅ 初始版本发布
- ✅ 完整的 LLM 驱动测试用例生成
- ✅ 全局覆盖率管理系统
- ✅ Web UI 实时监控
- ✅ Agent Memory 系统
- ✅ SPEC 文件集成
- ✅ 统计数据和可视化
本项目采用 MIT 许可证。详情请参阅 LICENSE 文件。
- GitHub: @fireceW
- 项目地址: https://github.com/fireceW/ChipFuzzer
注意: 本项目仍在积极开发中,API 和功能可能会有变化。建议在生产环境使用前充分测试。