对于每一个程序计数器(PC),我们需要找到对应的指令内容,指令寄存器干的就是这种事情。 输入:PC 输出:指令内容inst 功能:读取对应地址的指令 寄存器堆 基于RISC-V指令集的 CPU 特点之一就是拥有 32 个寄存器,按照给定的寄存器号对相应的寄存器进行读写操作也是十分关键的操作 输入:寄存器rs1、寄存器rs2、写入寄存器w...
jal指令,指令格式:jal x2, Label,这里的Label跟 B 型指令含义相同,但是到二进制码会略去最低位(当然汇编的数字是正常写的,编译器会帮你处理) ,将Label作为要跳转的地址,然后将 PC + 4 存入x2寄存器里面 在上面的跳转指令栗子中,x2为rd,Label为imm 好了,基础知识就讲那么多,下一篇就要开始单周期CPU设计...
那么这里需要一个 isLoad 信号表示 EX 阶段的指令是否为载入指令,和一个 isRiskCtrl 信号表示是否为控制冒险 isLoad 信号 我们在 CTRL 模块就已经判断出来 ID 阶段的指令是否是载入指令了,需要做的是将它延迟一个时钟周期: // in miniRV.v reg isLoad; // 需要代表 EX 阶段的载入判断 always @(posedge clk...
在CPU 中还原 MEM 模块 在MEM 模块中实现扩展逻辑 `ifdefDEBUG`include"param.v"`else`include"../param.v"`endifmoduleMEM(inputwire[`IO_BUS_WIDTH_ADDR-1:0]addr,inputwireDRAMWE,inputwire[1:0]DRAM_EX_TYPE,inputwireUnsigned,inputwire[`IO_BUS_WIDTH_DATA-1:0]bus_rd,inputwire[`IO_BUS...
《超标量处理器设计》(姚永斌著) 学校的实验指导书(这里不会给出,但是上网查能直接查到) 代码仓库: 其分支 master 为单周期 CPU;分支 Pipeline 为流水线 CPU。 先来写一个基于 RISC-V 指令集的计算器程序,之后我们做完 CPU 就会用它来运行这个程序哦。 计算器程序 要求 从拨码开关输入操作类型和操作数(8位...
在单周期 CPU 中,我们在每个时钟周期都只完成一条指令。而流水线,则是在同一个时钟周期运行多条指令。 大家应该还记得之前设计和实现单周期 CPU 的时候,我们将其分为了 IF、ID、EX、MEM、WB 模块吧,这是经典的 RISC-V 分块。在每个模块中我们做的事情几乎是顺序进行的(取指→译码→执行→访存→写回),相...
管脚的连接主要是在pin.v文件里,将wire变量连到对应switch编号(比如本文中的clk对应Y18,rst对应R1按键),以及对应供电(这个只写变量)即可。一般板子上也会有标号。假如只有16个switch,那一些开关对应的含义可能需要调整一下。我这边switch的含义在第一章的计算器程序章节有说明。 2022-12-23· 广东 回复...
比较指令(R):ALU 不需要操作,COMP 需要两个寄存器数 比较指令(I):ALU 不需要操作,COMP 需要 rd1 和 立即数 ALU 和 COMP 唯一可能发生冲突的 B 型指令,二者的操作数刚好错开,这不巧了吗,那就二者一起判断吧。 ALU 的A 操作数从pc和rd1中选: ...
流水线设计 数据通路 流水线寄存器 向后传递 向前传递 前递 停顿 指令纠正 一些琐碎的问题 流水线设计 相信有了单周期 CPU 设计经验,设计一个简单流水线还是没太大问题滴。 我们采用的是经典的五个模块:IF、ID、EX、MEM、WB,其实对于流水线有几个非常重要的设计考量: ...
指令存储器模块创建 2 这里的Depth指的是(数据总位数 \div 数据位宽),Data Width是数据位数,我们实现的是 32 位,就选 32 啦。 简单来说,每Data Width位为一块(数据位数),总共有Depth个块,每个地址对应一个块。 指令存储器模块创建 3 指令存储器模块创建 4 ...