万众一芯黑客马拉松第一期:热身赛题(进行中)
用UCAgent验证参与黑客松,实战赢奖金
Created Nov 18, 2025 - Last updated: Nov 18, 2025
活动简介
欢迎参加本次黑客马拉松!本次黑客马拉松以“AI驱动开源芯片验证”为主题,聚焦基于大语言模型的硬件验证智能体UCAgent的实际应用。各位将在限定时间内,利用UCAgent人机协同进行模块验证,分析生成的fail case,找出题目当中的BUG或提升token效率。通过参与,您不仅能体验UCAgent工具在开源验证中的便利,还能作为开发者参与到开源芯片验证的生态中。
- 任务:本次活动提供了15个手工注入的bug供大家进行发现,共有两个赛道:找bug赛道/token效率赛道,,找出bug分析并提交结果。
- 难度分级:每个模块含有5个bug对应5个rtl文件,分为1、2题为简单难度;3题为中等难度;4、5题困难难度。
- 排名资格:各组需要至少找到一共5个Bug才能获得排名资格。
为使大家能够高效地找到bug,我们提供了UCAgent工具。下面将以VectorIdiv模块的第一个bug为例,演示如何使用UCAgent进行验证并提交结果。
热身演示
第一步 使用UCAgent快速寻找fail case
详细使用方法请参考UCAgent使用手册。 提示:建议先熟悉UCAgent的基本操作,再开始正式任务。
第二步 基于fail case进行bug分析
UCAgent会在output/unity_test/tests目录下生成一份VectorIdiv_bug_analysis.md 文档,列出所有检测到的bug并提供详细分析。例如:
## VectorIdiv 缺陷分析
### 边界与异常处理
<FG-BOUNDARY_EXCEPTION>
#### 边界值测试: <FC-BOUNDARY>
- <CK-DIV_BY_NEG_ONE> 检测点:有符号数除以-1
- <BG-DIV_BY_NEG_ONE-0> 当一个有符号数的最小负值(例如,对于8位整数是-128)除以-1时,预期的结果应该是该数的绝对值(128),但这超出了8位有符号数的表示范围(-128到127)。根据RISC-V向量规范,这种情况下商应保持为被除数(-128),余数应为0。然而,DUT的实现似乎未能正确处理此溢出情况。
- <TC-test_VectorIdiv_templates.py::test_boundary_conditions>
- **根因分析**:
在 `VectorIdiv_BUG1.v` 的 `I8DivNr4` 模块中,对于商的计算没有特殊处理溢出情况。
```verilog
// VectorIdiv_BUG1.v
150: assign io_div_out_q = Lkm7UANb3k7urrE;
```
`Lkm7UANb3k7urrE` 的计算逻辑未能考虑到 `-128 / -1` 的溢出。
- **修复建议**:
应在计算商的逻辑中增加一个检查,如果是有符号运算且除数为-1,并且被除数是最小负值,则商应等于被除数本身。
#### 异常处理: <FC-EXCEPTION>
- <CK-DIV_BY_ZERO> 检测点:除零异常
- <BG-DIV_BY_ZERO-0> 当除数为零时,DUT应产生一个除零异常。根据 `VectorIdiv_function_coverage_def.py` 中的定义,这要求 `io_d_zero` 信号不为零。然而,在测试中发现,即使除数为零,`io_d_zero` 信号仍然为零,表明异常没有被正确触发。
- <TC-test_VectorIdiv_templates.py::test_boundary_conditions>
- **根因分析**:
在 `VectorIdiv_BUG1.v` 的 `I8DivNr4` 模块中,`YOzhvk` 信号正确地识别了除数为零的情况 (`bO1Bf == 8'h0`)。但是,这个状态没有被用来驱动 `io_d_zero` 输出。
```verilog
// VectorIdiv_BUG1.v
90: wire YOzhvk = bO1Bf == 8'h0;
```
`io_d_zero` 信号没有在 `I8DivNr4` 模块中被赋值,因此它保持默认值0。
- **修复建议**:
应将 `YOzhvk` 信号连接到 `io_d_zero` 输出,或者使用 `YOzhvk` 来设置一个在除零时会置位的寄存器,并最终驱动 `io_d_zero`。
注意:bug报告中可能包含假阳性bug(即测试用例不符合要求导致的非源码类报错),因此需要结合阅读Spec文档分析失败的测试用例,以识别真正的bug。 例如:
- 第一个bug(-128除以-1)通过阅读Spec文档发现,这是由于结果超出RISC-V向量规范导致的报错,并非源码bug,可忽略。
- 第二个bug(除零异常)通过分析Spec文档(第12.2节)确认:整数除法在除零时应返回定义值(商为全1,余数为被除数),而不应触发硬件异常。但测试中io_d_zero信号未置位,这表明是真正的源码bug。
第三步 提交结果
找到Bug后,请提交以下内容:
| 所在文件名 | bug说明 | fail case文件相关 | Spec不一致的章节内容 |
|---|---|---|---|
| 例如VectorIdiv_bug_1.v | 说明触发bug的fail case、原因 | output文件夹打包 | 该Bug对应Spec当中要求不符的章节与内容 |
将以上文件上传到指定平台即可完成提交。
热身学习资源
为了帮助您快速上手,我们提供了以下资源: 无bug版本rtl:
- VectorFMA_origin.v:https://github.com/XS-MLVP/Hackathon/blob/main/origin_file/VectorFMA_origin.v
- VectorFloatAdder_origin.v:https://github.com/XS-MLVP/Hackathon/blob/main/origin_file/VectorFloatAdder_origin.v
- VectorIdiv_origin.v:https://github.com/XS-MLVP/Hackathon/blob/main/origin_file/VectorIdiv_origin.v
有bug版本rtl:
SPEC链接:
- 向量整数除法指令:https://docs.riscv.org/reference/isa/unpriv/v-st-ext.html#vector-integer-divide-instructions
- 向量浮点指令:https://docs.riscv.org/reference/isa/unpriv/v-st-ext.html#sec-vector-float
UCAgent链接:https://github.com/XS-MLVP/UCAgent
UCAgent使用手册:https://open-verify.cc/mlvp/docs/ucagent