LoongArch单周期处理器设计
·
怎样做一个CPU?
- 步骤1:理解指令系统规范
- 步骤2:设计CPU电路结构
- 步骤3:实现CPU电路设计
- 步骤4:验证设计正确性
1 LoongArch指令集精简版
龙芯自主指令系统架构LoongArch
- 充分考虑兼容需求的自主指令系统
- 遵循RISC指令设计风格
- 32位定长指令编码风格
- load/store架构
- 32个通用寄存器
- 32个浮点/向量寄存器
- 分为32位和64位两个版本,简称LA32和LA64架构
- 采用基础部分加扩展部分的整体架构
- 基础指令集(~340条)
- 二进制翻译扩展、向量扩展、虚拟化扩展

1.1 指令集概述
指令集数量包含关系
LoongArch Primary精简版
- 基于LoongArch 32位版本的精简子集——LoongArch Primary
- 用户态:保留典型应用中最常用的指令
- 整数指令~50条,访存指令仅“基址+偏移”寻址方式且要求地址对齐
- 浮点数指令可以不实现,也可以只实现单精度部分
- 原子同步指令仅LL/SC,软件维护指令与数据Cache的数据一致性
- 核心态:支持主流类Unix操作系统
- 仅包含PLV0和PLV3两个特权等级
- 支持例外与中断,但入口为同一个
- 支持TLB MMU,软件负责TLB重填
- 软件生态:维护一个独立的小系统
- QEMU、GCC、......
- PMON、Linux kernel、busybox、buildroot
1.2 指令集用户态介绍
1.2.1 数据类型
- 比特(bit,简记b)
- 字节(Byte,简记B,8bit)
- 半字(Halfword,简记H,16bit)
- 字(Word,简记W,32bit)
1.2.2 寄存器
- 通用寄存器(GR)
- 32个32位宽寄存器,0号寄存器恒为0
- 程序计数器(PC)
- 32位宽
- 独立于通用寄存器,仅杯转移指令修改
- 浮点指令操作浮点寄存器,其独立于通用寄存器
1.2.3 指令编码
- 指令都是32位长
- 指令均需4字节边界对齐
- 8种指令格式
- 单一操作码域
- 寄存器操作数域(rd,rj,rk,ra)
- rd——通常作为目的寄存器
- rj——通常作为源寄存器1
- rk——通常作为源寄存器2
- ra——通常作为源寄存器3
- 立即数域(imm)
- (1+)5种不同的长度
- 访存与整型计算:12位
- CSR寻址:14位
- 转移指令:16位、21位、26位置
- 所有指令至多一个目的寄存器
- “两源一目的”的3R-type是最常见的指令格式;4R-type仅出现在浮点运算中。
例1
例2
三种RISC指令格式共性
- 定长、对齐、指令格式种类少
- 操作码域、寄存器域和立即数域
- “两源一目的” 三寄存器操作数格式最常用
- 要读写的寄存器号出现的位置(基本)固定不变
- RV最彻底,MIPS和LA有少量例外
(1)整数加减运算


(2)整数比较运算


(3)逻辑位运算


(4)移位运算


(5)立即数装载


(6)PC相对计算


(7)乘除运算


(8)条件分支


(9)无条件相对PC跳转


(10)无条件间接跳转


(11)普通访存


(12)原子访存


(13)预取指令


(14)栅障指令

(15)系统调用及陷入

(16)时间读取

(17)C语言的机器表示

(18)LoongArch ABI

(19) LoongArch ABI寄存器使用约定

(20)流程控制语句—例1

(21)流程控制语句—例2

(22)流程控制语句—例3

(23)流程控制语句—例4

(24)过程调用—例

(25)LoongArch Primary指令简明列表

2 数字电路与Verilog知识
2.1 CPU实验中Verilog使用

2.2 面向硬件电路的Verilog设计思路

2.3 可综合Verilog

2.4 模块声明和实例化

2.5 基础逻辑门

2.6 译码器

2.7 编码器

2.8 多路选择器

2.9 ALU模块



2.10 D触发器

2.11 带使能端的D触发器

2.12 实验中CPU所用的寄存器堆

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐





所有评论(0)