【write a toy cpu】实现

本文介绍了作者实现MIPS32指令集CPU的过程,包括ISA的概念、MIPS32指令集、处理器结构和流水线原理。通过Verilog编程,作者实现了部分MIPS32指令,包括逻辑运算、移位、移动和算术操作,并讨论了流水线中的数据相关问题及其解决方案。文章还分享了在Verilog编程中的一些技巧和注意事项。
摘要由CSDN通过智能技术生成

自上大学开始,很早就听说过了CPU这个东西,唯一知道的是:这个东西很复杂,这个东西是计算机的核心,这个东西集成电路做的,而且主要应该是数字集成电路做的,就是说主要进行的是0和1的操作。但对内部工作原理还是一脸懵逼。众所周知,计算机的五个组成部分为运算器(数据通路)、控制器、存储器、输入/输出设备。而CPU的角色应该就是运算器与控制器,两者是结合而并非独立的。但内部呢?依旧不懂。而后有学过8086汇编,对汇编有了一点基础的了解。大概知道CPU是读取一条条的机器指令来执行的,特定的指令会对寄存器、内存、特定的标志位进行操作。处理器内部电路依旧不知,汇编如何翻译成机器码依旧不知。但也只剩下这两个问题了。所以现在只需要解决两个问题:汇编如何翻译成机器码,机器码是如何在CPU里面运行起来的。

而汇编,很明显,是与具体的处理器相关的。也即是不同处理器的指令集体系结构(ISA,Instruction Set Architecture)是不同的。对应的处理器设计也必然是不同的。主要可分为RISC和CISC,这里实现MIPS32指令集的部分指令。正文会简单介绍。

自4月份大概快结束时环境搭好后,实现大概花了半个月的课余时间,到现在都五月中旬了。很多时候在划水,其实应该要不了这么久的。而且我的目标只实现一部分指令就行了,能玩就可以了。按照实现顺序依次实现了:ori,逻辑运算、移位指令和空指令,移动操作指令,部分算术操作指令,条件分支、无条件转移指令,加载存储指令。没有实现协处理器相关指令和中断异常相关指令。至于什么指令级并行、数据级并行、乱序发射啥的统统都是没有的。不过有了前面的那些已经可以进行很多操作了。下面简单说一下实现思路。细节可参考《自己动手写CPU》,或者作者博客。我的实现基本上否是参考这本书,以及这个repo:abcdabcd987/toy-cpu.

ISA

先来看一下ISA的定义,ISA-Wikipedia

An instruction set architecture (ISA) is an abstract model of a computer. It is also referred to as architecture or computer architecture. A realization of an ISA is called an implementation. An ISA permits multiple implementations that may vary in performance, physical size, and monetary cost (among other things); because the ISA serves as the interface between software and hardware. Software that has been written for an ISA can run on different implementations of the same ISA. This has enabled binary compatibility between different generations of computers to be easily achieved, and the development of computer families. Both of these developments have helped to lower the cost of computers and to increase their applicability. For these reasons, the ISA is one of the most important abstractions in computing today.

首先ISA是一个抽象模型,一个ISA可以有不同的实现。ISA的角色是硬件和软件的接口。CPU通过电路物理上实现ISA,软件通过编译器将高级语言编译为ISA对应的汇编语言进而翻译为机器码,即可在实现了该ISA的处理器上运行。ISA可以说是计算机中最重要的抽象。

只要ISA相同,实现方式的不同并不会影响软件的运行,这也是接口这个伟大的抽象的意义。接口面向调用者,需要进行的所有操作通过接口去调用,内部实现对调用者是完全透明的。这样对于一款处理器,知道其ISA,我们就可以编写程序,而不需要知道内部实现。

抽象-接口-分层

有了接口这个抽象,我们便可以将计算机体系进行分层,分层在计算机科学中是广泛存在的,比如计算机层次结构:

layers

和计算机网络中的国际标准OSI七层模型与事实工业标准的TCP/IP四层模型:

computer-network-layers

都是很好的体现。在哪一层操作,我们只需要知道其下层的接口,而不必知道具体实现。这可以简化问题的复杂度,使我们只需专心处理其中一层的问题。

指令集体系结构

一个指令集体系结构定义了:

  • 支持的数据类型(supported data types)
  • 主存与寄存器(the main memory and registers)
  • 内存一致性,寻址方式(memory consistency and addressing modes)
  • 机器指令集合(the set of machine instructions)
  • 输入输出模型(input/output model)

MIPS指令集

详细信息参见MIPS architecture - Wikipedia。MIPS指令集是精简指令集(CISC)的典型代表。龙芯使用的便是MIPS指令集。MIPS算是一类架构,并不单一,有各种扩展以及子架构等。如MIPS I,MIPS II,MIPS III…MIPS 32,MIPS 64,MIPS 64 R2…等等。这算是一个比较学院派的指令集,在商业上并不算成功(相比Intel x86-64),但这对这里的实现并不会有什么影响。其设计者John L. HennessyDavid A. Patterson是去年(2017)ACM图灵奖的获得者。下面看一下MIPS32指令集的一些细节。

数据类型:一个字4个字节32bit,支持半字与字节。
寄存器:定义了32个通用寄存器(与x86的专用寄存器设计不同)命名为$0...$31,很明显需要5个二进制位来寻址寄存器。并且还定义了两个专用寄存器HILO用来存储两个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值