Chisel芯片开发入门系列 -- 10. CPU芯片开发和解释0
进入到了暑假,换了一个环境,之前搭建的Chisel开发环境没有了。还好,有记录在csdn上的本系列文章,按照文章重新搭建了一番,这次是在一台新的Windows系统上,安装JDK+安装Scala+安装sbt,当然每一步或者两步的时候要测试一下,包括Hello.java和Hello.scala的测试,然后才是Chisel项目的测试,基本顺利,当然也碰到了一次“新坑”,记录在了《Chisel芯片开发入门系列 -- 5. Chisel的HelloWorld到SystemVerilog》一文的评论中。由此也见到了这“烂笔头”写下的系列在线文章,确实很有作用。
本篇文章介绍使用Chisel开发一个“CPU芯片”!听起来有点疯狂,这还叫“入门”吗?这简直是要“捅破天花板”啊。虽然有近30年的程序员经验(从看谭浩强老师的C语言书算起),但我和读到此文的你一样对芯片开发确是新手,就想通过实现一个“CPU芯片”来理解芯片“编程”,因为CPU就是咱软件工程师心中的“殿堂”和“明珠”。这多少要有点“无知者无畏”的气概。
当然在本文的环境中,有一个限定是使用Chisel语言。其实在Chisel语言之前,使用Verilog+FPGA来实现一个“CPU芯片”也是有的、并不鲜见,通常是放在“流水LED灯”这样的HelloWorld例程之后、作为最高阶的例子。与此对应,Chisel从一开始就是和RISC-V芯片几乎同步发展的、用于开发像RISC-V这样的CPU的语言平台。
开始上干货,项目代码地址如下:
项目首页 - riscv-chisel-book:fork riscv-chisel-book by ChipCamp for Tutorial 20250703 - GitCode
从项目中可以看出它所fork的原始项目是github上的riscv-chisel-book项目,该项目也是配套日文图书的源代码,这本日文图书已经翻译为中文版并在网上平台有售,而上述项目及本文主要关注代码级的实际操作和解释,这些都是原项目和原书所没有做的,对是对原来项目和图书所存在的鸿沟进行的实质性关键性补充,包括环境搭建+编译构建+看到效果。
【1】环境搭建,在此前的系列文章中已经趋于稳定,包括本次在一个新的Windows环境下搭建及运行并写这篇文章。
【2】编译构建,涉及到对原项目中的源代码编译构建方法的改动及Makefile等文件中的环境变量和构建指令的新增或修改。项目原来使用的是Docker进行构建,本文不采用Docker进行构建,而是使用手工搭建的适合个人PC的、无Docker的环境进行构建。为何?因为Docker会把很多东西打包在一起形成黑盒,而本系列入门从一开始就是手工打造的白盒。
【3】看到效果,展示这个CPU芯片(电路)的运行/仿真效果,这是关键中的关键。
先看一下Makefile文件,这是在本项目中新增的一个文件。在本次Windows环境下没有Make工具,展示这个文件主要用来提示sbt命令行。注意进入到riscv-chisel-book/chisel-template目录下,后面的图均是在这个目录下操作。

实际的sbt运行的配置文件在build.sbt中,如下,可以看出它和本系列文章此前的配置是一致的,而和原来的项目相比进行了关键改动和测试,解决了原来无法跑通的问题。

CPU的取指操作:在一个Memory中预先存放3条指令,分别是0x11121314,0x21222324,0x81828384,0x91929394。时钟信号每嘀嗒一下,CPU电路从PC寄存器的位置取指令,并将PC寄存器值加4(因为CPU的位宽为32,一次取指后往后移4个字节)。注意因为字节码大端小端序的关系实际指令显示的是0x14131211这样的,这里先不深入纠结这个大端小端序的问题,但请在对照图来理解的时候注意到这一点即可。

CPU的指令解码:将4字节的指令字解码为opcode + para1 + para2这样的结构体。有的指令有2个参数(para1和para2),有的指令有1个参数(para1),有的指令没有参数,将定长的指令解码为结构体的过程称为decode模块。

CPU的指令执行:最常见的CPU指令执行大概就是3个,从数据存储器(DMem,和指令存储器IMem区分)中读取某个地址的数据到CPU的寄存器中,对CPU的寄存器中的数据进行加减乘除等运算并存到某个寄存器中,将寄存器中的数据写到数据存储器DMem的某个地址中。这里展示的是Load Word的指令执行情况,涉及到从Dmem.addr加载数据到寄存器中!

至此,可以初步看出Chisel写的“CPU芯片”在逻辑上跑通了 &可理解了 &CPU芯片可以通过“Chisel编程”设计出来并加以验证!其中无论是Makefile文件、build.sbt文件、以及源代码文件,均进行了多处实质性的改动(参见项目中的提交记录)并进行了测试验证,打通了CPU芯片设计入门理解和实践的关键Gap。下一步,将对这其中的代码进行解释和备忘。
PS:请熟练使用gitcode并关注本项目,实际操作才能真正入门。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)