最近学习了RISC-V架构的CPU设计,然后根据经典的五级流水线架构在Vivado上完成了一个简单的CPU,故开一个新坑记录该CPU的设计过程。
该CPU实现了RVIM指令集,并可以搭建简单的SOC。
这个CPU也有致命缺点,就是没有实现JTAG,无法进行调试,在后面会实现。
目前CPU进度可搭建片上soc,已能够通过Vivado综合,各功能验证无误。
注:此软核仅用于学习交流,若要进行商用,请务必与作者本人联系!
开源资料链接:https://hihii11.github.io/verilog_fly_v_cpu.html
资料总共提供了两份工程,其一用于软核的仿真,可以观察软核内部信号的变化。
另一份用提供了一SOC设计实例,使用者可根据自己的板卡和需求修改工程配置,进行比特流烧录。
在测试例程中给出了CPU和SOC的测试例程,分别用于上述两个工程。
CPU测试例程
SOC测试例程
在编译器中,提供了RISC-V的RARS编译器,具体程序烧录例程参考第五章。
• 32位 RISCV架构CPU
• 经典五级流水线架构
• 支持RISC-V IM指令集
• 可拓展AHB主机接口
• 可编程快速MIO口,最多32个
• 内部可编程周期计数器、Timer64计数器(定时器)
• PLIC中断管理器,可编程中断屏蔽、优先级
• 最多支持23个用户自定义中断(不支持中断嵌套)
• 暂无实现JTAG
•软核部分
在软核中设计了能通过CSR直接进行控制的周期计数器(MYCYCLE)、可编程快速IO口(MIO)、64位计数器(Timer64)。
这些器件固定占用了PLIC中断的ID 1~9。
CPU内嵌了PLIC中断管理器,其产生的中断直接作为外部中断进行处理,其配置也可通过CSR寄存器组实现。
CPU内嵌了AHB主机接口,能够通过AHB总线访问挂载在AHB总线上的各种器件,其配置也可通过CSR寄存器组实现。
内存访问部分使用单独的数据总线,ROM使用了Xilinx板载ROM,但RAM使用了LUT RAM。
这是因为使用者可以通过LUT RAM来直观的观察RAM数据的读写过程,这里也可将LUT RAM直接替换为BRAM。
•自定义IP设计
使用者自定义的IP核将直接挂载在AHB总线上,在本设计提供的示例设计中,默认挂载了一AHB读写测试从机、I2C、GPIO、SPI_LCD(LCD专用高速驱动器)。
使用者可根据需要自行增删改查AHB接口的IP,具体方法在资料的AHB文档中有说明。
最多可支持的AHB器件(推荐16)为4096。所有AHB器件若需要中断处理,则将连接至PLIC中断管理器的ID (10~32)(ID:10对应软核上的IRQn0)
本RV软核设计的所有开发文件均在Vivado 2018.3中完成设计和调试。
软核程序的下载通过配置ROM的向量文件来实现。
首先通过RARS完成汇编的编写
然后通过RARS生成机器码文件。文件路径选择为dist,后缀选择为bin。
将生成的bin文件拖拽至RV_bin2coe.exe脚本文件上,制作可供Vivado ROM使用的coe文件。
(注意:请务必保留config.txt文件,其中包含了coe文件的基本配置。如使用者需要也可自行修改)
打开Vivado工程,如果是SOC工程,则右击fly_v_top IP核,选择edit in ip packager。
点击ok并生成ROM实例后,在打包器中重新打包。
最后返回soc工程,更新IP核即可。
如果是CPU测试文件,则只要找到if-id下的rom,按照上述步骤生成实例ROM即可。
在RISC-V SOC工程中,双击fly_v_top IP核。
IP核参数设置中,memory address界面用于配置CPU的ROM与RAM。
在ROM Configuration界面可以对ROM中程序指令的起始地址和ROM的大小(单位KB)进行配置。
在RAM Configuration界面可以对RAM存储数据的宽度、RAM数据深度以及RAM的地址宽度进行设置。
在MIO界面可以对快速IO口进行例化。注意:MIO 0-7 能够进行中断配置。MIO 9-31 无法进行中断配置。
在External Interrupt界面可以对自定义中断接口。用户自定义的中断ID将从10开始。
在AHB Interface界面可以对AHB接口进行设置,Base Addr为所有AHB从机设备的起始地址;
Data Width为AHB总线数据宽度,默认32位。
Addr Width为AHB总线地址宽度,默认32位。
Fifo Depth为AHB Fifo深度。
Fifo Addr Width为AHB Fifo地址宽度。
这个CPU的设计过程也不是一帆风顺的,遇到过很多的问题,如流水线数据冒险,控制冒险,分支跳转冲突等等;故开这个系列文章来记录下设计CPU的过程,在看完整个系列文章后,大家都能进行自己的简单CPU设计。
当然,在开始之前,希望读者可以具备以下技能:
1.掌握Verilog语言
2.了解汇编语言
3.熟悉一款仿真工具或集成开发环境(modelsim、quartus、Vivado等)。
4.不放弃
这里再推荐大家几本参考书籍《手把手教你设计CPU——RISC-V处理器篇》、《硬件架构的艺术》