“万众一芯”是基于众包模式的芯片验证平台。支持使用Python/Java/Go编写芯片单元测试UT(Unit Test)用例,同时兼容传统UVM验证框架,旨在让软件工程师也可以参与芯片验证。
“万众一芯”汇聚软硬件工程师、高校学生与极客的力量,让“一万个人共同参与验证一款芯片”。开源高性能 RISC-V 处理器核“香山”是首批“万众一芯”平台的开源芯片项目。期待您与我们一起,为开源芯片的发展贡献力量。
“万众一芯”新手教程全面上线!现在可以在“万众一芯”官网,B站,以及视频号看到完整教程。
官网视频+文字教程链接:
https://open-verify.cc/beginner/course/
B站视频教程链接:
https://space.bilibili.com/1398574196/lists/2445557?type=season
本次新手教程一共分为5讲,从芯片验证基础知识开始入门,逐步讲解工具的安装与使用,最终带着大家完成一次实战案例。通过这5讲的学习,你将成功入门芯片验证!
(B站:万众一芯UnityChip)
为了让学习事半功倍,少走弯路,欢迎大家报名“新手任务”,将有导师全程指导学习,线上实时答疑,还可以与志同道合的伙伴探讨技术。只要完成课程内的实战任务,即可获得万众一芯周边礼包一份~
??新手任务参与方式??
Step1:扫码填写报名问卷
Step2:收到邮件,加入新手任务群
↓ 扫码填写报名问卷 ↓
??新手课程 内容介绍??
第一讲
芯片验证基础知识
这一讲将从基础概念入手,系统介绍验证的重要性、基本流程与方法、验证层次和评估指标,探讨实际项目流程中可能遇到的挑战与敏捷验证的应对思路。在本讲中,你将学习到:
芯片验证的基本概念:什么是芯片验证,为什么它对芯片设计至关重要,以及验证不足可能导致的严重后果。
验证流程与敏捷方法:完整的验证流程是如何开展的,敏捷验证的原则与实践,以及从计划到报告的完整验证步骤。
验证层次体系:从单元测试到系统测试的不同验证层次及其特点。
验证质量评估:如何通过功能正确性、代码/功能覆盖率、缺陷密度等关键指标来评估验证质量。
当前验证挑战与高级语言价值:验证面临的工作量、成本、人才等挑战,以及使用高级语言(如 Python)的优势及其对验证的推动作用。
芯片验证众包前景:作为应对挑战的创新方案,众包验证的可行性、技术路线,以及 Picker 等工具在其中的作用。
第二讲
Picker 的安装与使用
本讲会介绍芯片验证辅助工具 Picker,该工具可将 RTL 设计模块打包为动态库,并提供多语言编程接口。从这次课程开始,我们将使Python为芯片验证的高级语言,相关的示例也会用 Python 编写。
??Picker 具有两个主要功能:
打包RTL 设计验证模块: Picker 可以将 RTL 设计验证模块(.v/.scala/.sv)打包成动态库,并提供多种高级语言(目前支持 C++、Python、Java、Scala、Golang)的编程接口来驱动电路。
UVM-TLM 事务封装到其他语言: picker 能够基于用户提供的 UVM sequence_item 进行自动化的 TLM 代码封装,提供 UVM 与其他高级语言(如 Python)的通信接口。 该工具允许用户基于现有的软件测试框架,例如 pytest、junit、TestNG、go test 等,进行芯片单元测试
??基于Picker 进行验证的优点:
不泄露RTL 设计:经过 Picker 转换后,原始的设计文件(.v)被转化成了二进制文件(.so),脱离原始设计文件后,依旧可进行验证,且验证者无法获取 RTL 源代码
减少编译时间:当DUT(设计待测)稳定时,只需要编译一次(打包成 .so 文件)
用户范围广:提供的编程接口多,覆盖不同语言的开发者
使用丰富的软件生态:支持Python3、Java、Golang 等生态系统
自动化的UVM 事务封装:通过自动化封装 UVM 事务,实现 UVM 和 Python 的通信
第三讲
Toffee 的安装与使用
虽然 Picker 提供了底层的硬件交互能力,可以将 RTL 设计转换为可在高级语言(如 Python)中驱动的模块。但要构建一个结构化、可复用、易于维护的验证环境,还需要更完善的框架和方法学支持。
Toffee 正是为此而生。它是一个基于 Python 语言编写的硬件验证框架,构建于 Picker 之上,旨在提供一套更高效、更规范的验证解决方案。本讲将分为上、下两部分,详细介绍 Toffee 的安装和核心组件的使用方法。
??Toffee 框架的主要功能特点包括:
标准化验证环境结构:借鉴了 UVM 等验证方法学的思想,提供了 Bundle(接口封装)、Agent(事务级驱动与监测)、Env(环境组织)、Model(参考模型)等核心组件,引导用户构建分层、模块化的验证平台。
集成测试用例管理(toffee-test):通过与 pytest 框架集成,toffee-test 插件简化了测试用例的编写、执行、管理和报告生成,支持 fixture 等高级测试特性。
内建异步支持:核心基于 Python 的 asyncio 协程,提供了 async/await 的原生支持和一系列异步等待机制(如 AStep, ACondition),便于处理并发行为和精确的时序控制。
功能覆盖率支持:内建 CovGroup, CovPoint, CovBin 等类,支持方便地定义、收集和报告功能覆盖率,量化验证完备性。
??相比直接使用 Picker,采用 Toffee 框架的优势:
更高的抽象层次:Toffee 将验证逻辑从底层的信号读写提升到事务级操作,使测试用例更关注于“测什么”而不是“怎么驱动信号”。
更强的结构化和规范性:提供了明确的验证环境组件和组织方式,提高了代码的可读性、可维护性和可复用性。
简化的测试流程:toffee-test 自动化了测试用例发现、执行和报告生成,集成了覆盖率收集,简化了整个验证流程的管理。
方法学支持:融入了验证方法学的最佳实践(如驱动与监测分离、事务级建模、覆盖率驱动验证等),有助于新手建立规范的验证思维。
易于扩展和协作:模块化的设计使得验证环境更容易扩展,也更便于团队成员分工协作。
第四讲
进阶案例:双端口栈
本讲将进入一个进阶应用案例,旨在将先前学习的知识应用于一个更接近实际工程复杂度的场景。核心目标是学习和演示在只使用picker 的前提下,如何处理并发接口的验证,这是芯片验证中常见且重要的挑战。我们将以双端口栈为例,该设计允许两个端口同时进行独立的读写操作。
??为了应对这种并发性,我们将探讨并实践两种不同的驱动方法:
基于回调函数的状态机:一种传统的处理并发事件的方式。
基于协程的异步驱动:利用Picker 提供的异步接口和 Python 内置的 asyncio 库。这种方法直接应用了第三讲中介绍的 async/await 异步编程原理。
??通过对比这两种方法,你将能更深刻地理解:
处理并发验证问题的不同策略及其优缺点。
异步编程模型(如async/await 和协程)相比传统回调函数,在简化并发逻辑、避免复杂状态机方面的优势。
虽然本例未使用完整的Toffee 框架,但它所演示的协程方法是 Toffee 这类现代验证框架的核心基础,理解它是掌握 Toffee 的关键一步。
将在前几讲学习的基础工具(Picker)和编程概念(异步)应用于解决具体的、具有挑战性的验证问题。
第五讲
实战案例:果壳Cache
使用 Toffee,你已经可以搭建出一个完整的验证环境,并且方便地去编写测试用例了。然而在实际的业务中,往往无法理解如何开始上手,并最终完成验证任务。实际编写代码后,会遇到无法正确划分 Bundle,无法正确理解 Agent 的高级语义封装,搭建完环境之后不知道做什么等问题。
在这一讲中,将会介绍如何从头开始完成一个新的验证任务,以及如何更好地使用 toffee 来完成验证任务。
相信在完成新手教程全部内容的学习之后,你可以顺利完成一次实战任务:用 Toffee 对果壳 Cache 进行验证。这需要你提交果壳 Cache 的验证代码仓库和验证报告。在成功提交并审核通过之后,你将会获得万众一芯团队为你准备的周边礼包一份~
加入官方qq群(600480230)获取支持与指导
关注“万众一芯UnityChip”,了解最新活动
“万众一芯”官网:open-verify.cc GitHub:https://github.com/XS-MLVP/UnityChipForXiangShan
GitLink:https://www.gitlink.org.cn/XS-MLVP/UnityChipForXiangShan