如何快速学习和上手 RISC-V
前情提要
-
近年 国内 芯片行业一直很火热,美国制裁、国内政策,风口已来
-
RISC-V 的出现,有希望打破 x86、ARM 架构的市场垄断,形成“三足鼎立”局面
-
RISC-V 与 x86、ARM 犹如 Linux 与 Windows,一个开源、一个闭源
-
无论如何,也算是给 技术宅 DIY 提供了平台,大家玩的开心就好
-
公众号推送、书籍推荐、网页刷到,心动,逃不掉,那就整整吧
-
谨以此笔记,记录一周以来 资料汇总,环境搭建过程
-
错过 Linux ,不能再错过 RISC-V
Stay hungry,Stay foolish. --Steven Jobs
RISC-V 概述
RISC-V 是一种开放的指令集架构,而不是一款具体的处理器
1 RISC-V 架构的设计哲学 - “大道至简”
RISC-V 架构的存储器访问指令有如下显著特点:
- 为了提高存储器读写的性能,RISC-V架构推荐使用地址对齐的存储器读写操作(地址非对齐的存储器操作也支持)。处理器可以选择用硬件来支持,也可以选择用软件来支持
- 现在主流应用是小端格式 (Little-Endian), 故 RISC-V 架构仅支持小端格式
- 为减小设计处理器的难度,故 读/写指令 不支持地址自增自减的模式,
- 采用松散存储器模型(Relaxed Memory Model) 松散存储器模型访问不同地址的存储器读写指令的执行顺序不作要求,除非使用明确的存储器屏障(Fence)指令加以屏蔽
2 RISC-V 编译环境搭建
2.1 RISC-V GNU Compiler Toolchain
RISC-V C和C++的交叉编译器
支持两种构建模式:
- 通用的ELF/Newlib工具链
- 复杂的Linux ELF/glibc工具链
👇 重点在这,最终使用版本 👇
The RISC-V Embedded GCC
github 下载 Linux/windows安装包
使用镜像加速下载 Linux/windows安装包
👆 重点在这,最终使用版本 👆
2.2 全平台轻量开源verilog仿真工具iverilog + GTKWave
windows 10
- 将C:\Program Files (x86)\GnuWin32\bin 加入到系统环境变量即可
安装python3:- Microsoft Store > python 3.12
- cmd 输入python会自动跳转到 Microsoft Store
Linux
ubuntu 国内源source.lish
- sudo mv /etc/apt/sources.list /etc/apt/sources_bak.list
- sudo mv sources.list /etc/apt/
- 安装iverilog:sudo apt-get install iverilog -y
- 安装GTKWave:sudo apt-get install gtkwave -y
- 安装其他工具:sudo apt-get install make python3 -y
- gtkwave需搭配图形化界面使用,笔者使用wsl版本ubuntu,不想安装图形化,故使用windows环境
VSCode + VSCode 插件
- Verilog HDL/SystemVerilog:支持VS代码,语法高亮,代码段,Linting,格式化等等
- Verilog HDL:支持运行Verilog的插件
- WaveTrace:FPGA/RTL开发人员的交互式波形查看器,界面很漂亮哦
- Verilog_Testbench:自动生成testbench,shift+ctrl+p输入testbench,直接生成tb
编译输出乱码解决:
- Windows设置 > 时间和语言 > 日期、时间和区域格式设置 > 其他设置 > 区域 > 更改日期、时间或数字格式 > 管理 > 更改系统区域设置 > Enable Beta版:Unicode UTF-8 提供全球语言支持 > 电脑重启
testbench 执行报错:ModuleNotFoundError: No module named ‘chardet’
- 解决 CMD 输入:pip install chardet
在生成的 testbench 模块添加以下片段,即可生成可仿真波形
initial
begin
$dumpfile("wave.vcd"); //生成vcd
$dumpvars(0, testBench); //tb模块名称
end
3 开发语言 Verilog
- 推荐使用 Verilog RTL 编码风格
- 使用标准 DFF 模块例化生成寄存器
- 使用 assign 语法替代 if-else 和 case 语法编写
4 经典 MIPS 五级流水线
取指(Instruction Fetch)
译码(Instruction Decode)
执行(Instruction Execute)
访存(Memory Access)
写回(Write-Back)
5 RISC-V 指令集
6 参考开源 RISC-V 项目
7 针对 RISC-V 项目 进行优化
8 重新设计 RISC-V 处理器
9 ARM Cortex-M3 处理器
不知如何设计架构的情况下,就仿照 ARM Cortex-M3 的架构进行设计
- 先抄作业:了解其整体框架、环境搭建、编译链、Verilog语言规范
- 而后增删改:添加新功能接口、优化设计、代码优化
- 最终设计进行重构:添加新特性、升级进阶
- 基于 ARMv7-M架构,RISC(精简指令集)处理器
- 使用32位架构,指令集架构为 Thumb ISA,其基于Thumb-2技术并同时支持16位和32位指令
- 三级流水线设计:取指、译码、执行
- 哈佛总线结构,且具有统一的存储器空间:指令和地址总线使用相同的地址空间
- 32位寻址,支持4GB存储器空间
- 基于ARM AMBA(高级微控制器总线架构)技术的片上接口,支持高吞吐量的流水线总线操作
- NVIC(嵌套向量中断控制器)的中断控制器,支持最多240个中断请求和8~256个中断优先级(取决于实际的芯片设计)
- 支持多种OS(操作系统)特性,如节拍定时器以及影子栈指针等
- 休眠模式和多种低功耗设计
- 可选的MPU(存储器保护单元),提供了可编程存储器件或访问权限控制等存储器保护特性
- 普通数据处理,包括硬件除法指令
- 存储器访问指令,支持8位、16位、32位和64位数据以及可以传输多个32位数据的指令
- 位域处理指令
- 乘累加(MAC)以及饱和指令
- 用于跳转、条件跳转以及函数调用的指令
- 用于系统控制、支持OS等的指令