怎样做一个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所用的寄存器堆

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

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

更多推荐