发布网友 发布时间:2024-09-27 01:42
共1个回答
热心网友 时间:6分钟前
终于踏上用 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 代码包括内存、处理器核心和顶层文件的实现,内存代码不宜在综合器中直接生成,需使用专门的内存编译器。