自己动手写CPU
文章平均质量分 86
自己动手写cpu
阿巴阿阿巴巴巴巴
江东才子多才俊,卷土重来未可知。
展开
-
【自己动手写CPU】异常相关指令的实现
//原创 2022-06-01 11:30:17 · 2414 阅读 · 0 评论 -
【自己动手写CPU】about how to deal with bugs
bug是第十章,写协处理器访问指令时出来的。当然每一章都会产生bugs汇编测试代码如下: .org 0x0 .set noat .set noreorder .set nomacro .global _start_start: ori $1,$0,0xf mtc0 $1,$11,0x0 #写compare寄存器,开始计时 $11=0xf lui $1,0x1000 # $1高16位填0x1000 ori $1,$1,0x401 mtc0原创 2022-05-22 17:21:43 · 226 阅读 · 0 评论 -
【自己动手写CPU】协处理器访问指令的实现
协处理器介绍MIPS32架构定义的协处理器及其作用协处理器作用CP0系统控制CP1FPU(浮点数处理单元)CP2特定实现CP3FPU(浮点数处理单元)CP0负责的主要工作配置CPU工作状态:通过读写一些个内部寄存器来改变一些很根本的CPU特性高速缓存控制:集成缓存控制器,来控制、读、写缓存异常控制:异常发生时的检测和处理都由CP0中的一些控制寄存器来定义和控制存储管理单元控制:对系统的存储区域进行合理的控制、管理和分配,主要是对MMU,TLB原创 2022-05-12 19:31:00 · 936 阅读 · 0 评论 -
【自己动手写CPU】load相关问题
问题引入......lw $1,0x0($0) //从数据存储器地址0x0处加载字 保存到通用寄存器$1beq $1,$2,Label1 //比较通用寄存器$1与$2 如果相等 那么转移到Label1处......lw在访存阶段从ram读取数据,即在访存阶段才能写入$1的值,此值就是$1的最新值。紧接着的转移指令beq处于执行阶段,beq在上一周期译码阶段时,就已经对$1,$2的值进行了比较,并判断是否发生转移。判断时$1的值并不是lw指令加载得到的值,所以程序执行的结果是错误的。如果使用之原创 2022-05-01 19:49:23 · 608 阅读 · 6 评论 -
【自己动手写CPU】链接加载指令、条件存储指令说明
ll,sc是MIPS32指令集架构中较特殊的加载存储指令,用来实现信号量控制原创 2022-04-28 22:14:27 · 738 阅读 · 0 评论 -
【自己动手写CPU】加载存储指令的实现
目标修改之前一直做测试的sopc,为其添加数据RAM,测试一般加载指令的实现,加入特殊加载存储指令。探讨由于加载指令引起的load相关问题,给出OpenMIPS的解决方法,验证解决效果。加载存储指令说明...原创 2022-04-18 22:12:45 · 1463 阅读 · 0 评论 -
【自己动手写CPU】转移指令的实现
概述转移指令包括跳转、分支两种。跳转指令是绝对转移,分支指令是相对转移,两者实现方法相似。转移指令涉及延迟槽,所以首先介绍延迟槽的概念。#延迟槽控制相关指流水线中的转移指令或者其他需要改写PC的指令造成的相关。这些指令改变了PC值,导致后面已经进入流水线的几条指令无效。在流水线执行阶段进行转移判断,并且转移发生,会有2条无效指令,浪费两个时钟周期。为了减少损失,规定转移指令后面的指令位置为延迟槽,延迟槽中的指令被称为“延迟指令”。延迟指令总会被执行,与转移发生与否没有关系。但是即使引入延迟槽,在转移发原创 2022-03-29 17:01:05 · 1265 阅读 · 0 评论 -
【自己动手写CPU】除法指令的实现
//原创 2022-03-24 22:35:03 · 1647 阅读 · 1 评论 -
【自己动手写CPU】流水线暂停机制的设计和实现+乘累加乘累减的实现
背景乘累加,乘累减,除法指令在流水线执行阶段占用多个周期,因此需要暂停流水线,以等待这些多周期指令执行完毕。暂停流水线有两种方法实现。一种直观的实现方法:保持取指令地址PC的值保持不变,同时保持流水线各个阶段的寄存器不变。OpenMIPS采用的是一种改进过的方法:假如位于流水线第n阶段的指令需要多少个时钟周期,进行请求流水线暂停。 需要保持指令地址PC值不变,同时保持流水线第n个阶段,第n个阶段之前的各个阶段的寄存器不变,而第n阶段后面的指令继续进行。例如:流水线执行阶段的指令请求流水线暂停,保持原创 2022-03-14 21:27:53 · 2300 阅读 · 0 评论 -
【自己动手写CPU】加载存储指令的实现
1111原创 2022-03-03 21:40:43 · 1274 阅读 · 0 评论 -
【自己动手写CPU】算术操作指令的实现
算术操作指令MIPS32中算术操作指令共21条,可以分为三类简单算术操作指令乘累加、乘累减指令共4条:乘累加(madd)、无符号乘累加(maddu)、乘累减(msub)、无符号乘累减(msubu)。madd和maddu要求操作数相乘后,再与HI、LO寄存器的值相加,msub和msubu则是相减。即这四条指令要进行一次乘法和一次加(减)法,需要2个时钟周期去完成这类指令,第一个时钟周期进行乘法,第二个时钟周期进行加(减)法。除法指令共2条:有符号除法(div)、无符号除法(divu)原创 2022-01-28 15:23:20 · 1134 阅读 · 0 评论 -
【自己动手写CPU】逻辑、移位操作和空指令的实现
逻辑操作指令and,andi,or,ori,xor,xori,nor,lui。1.and,or,xor,nor这四条指令都是R类型指令。指令码都是6’b000000,也就是MIPS指令集架构中定义的SPECIAL类。6 ~ 10bit都为0。根据0~5bit功能码值进一步判断是哪一种指令。31-2625-2120-1615-1110-65-0SPECIALrsrtrd00000AND(100100)SPECIALrsrtrd00000OR(100原创 2022-01-11 00:06:58 · 1735 阅读 · 0 评论 -
【自己动手写CPU】第一条指令ori的实现
验证过程实现ori指令->建立最小SOPC->验证ori指令是否正确ori指令说明ori是进行逻辑“或”的运算指令ori指令的指令码是6’b001101。处理器发现正在处理的指令的高6bit是6’b001101时,说明当时处理的指令是ori指令根据格式可以得出这是一个I型指令,指令的用法为ori rs,rt,immediate作用为将指令中的16位立即数immediate进行无符号扩展至32位,然后与索引为rs的通用寄存器的值进行逻辑“或”运算,运算结果保存在索引为rt的通用寄存原创 2022-01-09 20:11:23 · 2914 阅读 · 2 评论 -
【自己动手写CPU】移动操作指令说明
11原创 2021-10-24 00:46:19 · 1022 阅读 · 0 评论 -
流水线数据相关问题
问题引入流水线中经常有一些被称为“相关”的情况发生,它使得指令序列中下一条指令无法按照设计的时期周期执行,这些“相关”会降低流水线的性能。流水线中的相关分为下述三个类型结构相关指令执行过程中,硬件资源满足不了指令执行需求,发生硬件资源冲突而产生的相关。比如:指令和数据共享一个存储器,在某个时钟周期,流水线既要完成某条指令对存储器中数据的访问操作,又要完成后继的取指令操作,这样发生存储器访问冲突,产生结构相关。数据相关指在流水线执行的几条指令中,一条指令依赖于前面指令的结果,本文主要解决数据相关问原创 2021-10-11 21:48:23 · 3605 阅读 · 0 评论 -
【自己动手写CPU】OpenMIPS处理器
在写指令之前,自己动手写cpu那本书还介绍了OpenMIPS处理器计划实现的五级流水线,介绍了该处理器的接口,解释各个源码文件的作用,最后描述OpenMIPS处理器的实现方法。设计目标五级流水线流水线:流水线是指将计算机指令处理过程拆分为多个步骤,并通过多个硬件处理单元并行执行来加快指令执行速度。...原创 2021-08-20 17:53:23 · 499 阅读 · 1 评论 -
【自己动手写CPU】处理器与MIPS
计算机的简单模型:计算机的简单组成模型:计算机的组成有三大部分:处理器,输入输出,存储器。处理器从存储器中获取指令,然后按照指令执行一定的操作,输入/输出用来提供运算数据、显示运算结果。存储器中存储的是指令,指令就是一条运算命令,处理器按照命令执行即可。处理器内部具有译码功能,用来解释接收到的0,1编码表示的运算类型。计算机的简单使用模型使用编译程序将高级语言编写的程序翻译成汇编指令,然后使用汇编程序将其翻译成01编码架构与指令集指令集架构(ISA),ISA同来描述编程时用到的抽象机器,从软原创 2021-07-31 21:20:10 · 786 阅读 · 0 评论