chisel搭个cpu(一) RV32I介绍/chisel基础语法/fetch实现/tester验证

如题所述

终于踏上用 Chisel 构建 CPU 的旅程。参考书籍《RISC-V与Chisel学习——第一次自制CPU》,我略去前四章的日语内容,直接进入项目部分,通过代码快速理解。尽管书中有部分日语,使用 WPS 的翻译功能能轻松解决。Chisel 专用细节未在之前文章中提及,将在此补充。

了解 RV32I 指令集,我们从最基础的 32 位整数运算指令集开始,随后实现简单的 V 类型向量加法运算,最后扩展至自定义指令集。本部分将详细介绍。

RV32I 指令集分为多种类型,具体类型及其功能已在前文概述,这里不再赘述。接下来将讲解 Chisel 语法。

以示例代码展示 Chisel 基础语法,待补充新内容时即时更新。推荐一本关于 Chisel 语法的书籍,值得深入阅读。

实现 fetch 功能需要内存和处理器核心,通过一个顶层文件连接两者。内存实现包含输入输出端口,实现从输入地址读取指令。

内存实现采用纯组合逻辑,深度为 16384、宽度为 8 位的 RAM。输入地址通过处理器的程序计数器(PC)获取,读取指令并输出。内存加载来自 fetch.hex 文件的内容,通过 loadMemoryFromFile 方法实现。

处理器核心包含 PC 寄存器,每周期增加 4,指向内存中指令地址。当遇到特定指令(如 0x13136f97)时,设置退出标志。内存接口方向通过 flipped 方式调整,简化设计。

顶层文件负责实例化内存和处理器核心,完成信号连接。测试模块(tb)不断循环执行,打印退出端口内容直至结束条件满足。

测试过程涉及从内存读取指令,处理器判断指令类型,直至遇到特殊指令 0x13136f97,退出测试。输出结果展示内存中加载的 fetch.hex 内容与处理器行为。

生成的 Verilog 代码包括内存、处理器核心和顶层文件的实现,内存代码不宜在综合器中直接生成,需使用专门的内存编译器。
温馨提示:内容为网友见解,仅供参考
无其他回答

chisel搭个cpu(一) RV32I介绍\/chisel基础语法\/fetch实现\/tester验证
实现 fetch 功能需要内存和处理器核心,通过一个顶层文件连接两者。内存实现包含输入输出端口,实现从输入地址读取指令。内存实现采用纯组合逻辑,深度为 16384、宽度为 8 位的 RAM。输入地址通过处理器的程序计数器(PC)获取,读取指令并输出。内存加载来自 fetch.hex 文件的内容,通过 loadMemoryFromFile ...

chisel搭个cpu(二) SW功能(实现译码\/执行\/访存)
现在,我们专注于SW功能的实现,它涉及前四级流水线。SW功能的核心是将rs1的内容与12位立即数相加,然后将结果作为地址,rs2的内容作为数据写入内存。为此,需要增加一个读写数据端口,并利用上一章的fetch部分。在chisel代码中,我们定义了SW指令,并按照decode步骤处理。在EXE阶段,将rs1数据和指令中的...

chisel搭个cpu(四) 验证SW\/LW指令
首先,我们设定测试目标:当pc_reg的值为0时,从内存(mem)读取LW指令,将地址12的32位数值23333333写入regfile的第5行。根据risvc指令的特性,很容易确定hex文件的前四行应如下所示:mem的第0-3行:指令头信息第4行:pc_reg的初始值第5行:mem的读取地址(12)第6行:读取的32位数据(23333333)...

相似回答
大家正在搜