0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RISC-V五级流水线CPU设计

FPGA设计论坛 来源:tencentcloud.csdn.net 2025-04-15 09:46 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文实现的CPU是一个五级流水线的精简版CPU(也叫PCPU,即pipeline),包括IF(取指令)、ID(解码)、EX(执行)、MEM(内存操作)、WB(回写)。

指令集:RISC

指令集大小:2^5 = 32

数据宽度:16bit

数据内存:2^8×16bit = 256个16bit

指令内存:2^8×16bit = 256个16bit

通用寄存器:8×16bit

标志寄存器:NF(negative flag)、ZF(zero flag)、CF(carry flag)

控制信号:clock、reset、enable、start

1.介绍与设计

1.1.CPU顶层视图

第一步只要求实现简单的五级流水线,不要求实现指令内存、数据内存模块,因此CPU内部与内存有关的信号都简化为输入输出信号了,CPU的顶层视图看起来应该如下图,其中select_y、y信号是跟CPU板级测试有关的,这一步暂且没用到。

38a444c8-15e6-11f0-9310-92fbcf53809c.png

1.2.指令集

指令为三地址格式,操作码长度5bit,根据操作数的不同可以把指令分为三种类型,即寄存器类型R type、立即数类型I type、混合类型RI type,不过后面在代码编写的时候,为了方便,会依据其它标准进行划分。

38b7eb18-15e6-11f0-9310-92fbcf53809c.png

规范一下表示方式,r1或者gr[r1]表示访问寄存器r1,m[r2+val3]表示访问r2+val3这个地址,{val2,val3}表示立即数访问,val2为MSB,val3为LSB。

汇编代码示例:

38ce8210-15e6-11f0-9310-92fbcf53809c.png

本文设计一共实现了28条机器指令,剩下未用的4个操作码(10100,10101,10110,10111)可自行补充为其它操作,比如自增INC、自减DEC。这里指令的编码是比较随意的,而且由于代码实现中使用了宏定义,因此可以任意更改指令的编码,不过如果想做进一步的优化,就要仔细考虑编码方式了。以下是指令集的具体格式与操作,设计CPU的时候有两张图是必须时刻看着的,我都把它们打印出来,这是其中一张。

38d83b70-15e6-11f0-9310-92fbcf53809c.png

1.3.五级流水线

除了指令集之外,设计CPU最重要的就是下面这张CPU块级电路图,五级流水线的代码实现都必须依赖于这张图,因此必须理解图中每一步的作用。

38e7fbaa-15e6-11f0-9310-92fbcf53809c.png

图中所有矩形框标出来的都是CPU内部的寄存器,整个电路图展示了CPU内部指令以及数据的流动方向。每到时钟上升沿,上一级流水线的寄存器的数据就会经过中间的组合逻辑电路流动到下一级流水线的寄存器,因此,5个时钟周期之后一条机器指令便执行完毕了。

简单描述一条指令的执行过程就是,

●首先根据PC的值到内存中取一条指令,

●解码指令提取两个操作数

●进行运算,

●根据指令功能以及运算结果决定是否访问数据内存以及如何访问,

●最后同样根据指令功能决定是否要进行回写操作,即修改寄存器的值。

下面将分别讲解CPU控制以及五级流水线每一级的行为,为了简单起见,这里仅考虑NOP、HALT、LOAD、STORE、ADD、CMP、BZ、BN这几条指令,明白了流水线的行为之后再加上其它的指令也是一样的道理

1.4.CPU控制

CPU控制自然是基于状态机,只有两个状态idle和exec,CPU在idle状态下只有enable、start同时使能才会进入exec状态。

38f537a2-15e6-11f0-9310-92fbcf53809c.png

1.5.IF

IF阶段的任务就是要根据PC的值从指令内存中读取一条指令,并且设置下一周期PC的值(指令可以顺序执行,也可以跳转到某个特定的地址)。因为读取内存是内存模块实现的功能,因此这里CPU只需要给出指令地址i_addr就能得到对应的指令i_datain。

390808fa-15e6-11f0-9310-92fbcf53809c.png

1.6.ID

ID阶段要根据指令的功能(即操作码)从指令中提取对应的操作数,操作数可能来自通用寄存器r0-r7,也可能是立即数。另外如果指令是STORE指令,也要准备好要存储到内存中的数据。

39157d6e-15e6-11f0-9310-92fbcf53809c.png

1.7.EX

EX阶段执行的是ALU运算和标志寄存器设置,另外如果是STORE指令也要给出内存写的使能信号dw以及将要写到内存中的数据smdr1。

392983cc-15e6-11f0-9310-92fbcf53809c.png

1.8.MEM

MEM阶段要根据指令功能和上一阶段的运算结果(内存操作的时候作为内存地址)决定是否要访问内存以及如何访问,只对需要内存操作的指令有效。

39383390-15e6-11f0-9310-92fbcf53809c.png

1.9.WB

WB阶段同样根据指令的功能以及上一阶段的结果决定是否要修改寄存器的值以及如何修改,只对需要修改寄存器值的指令有效。

39480cfc-15e6-11f0-9310-92fbcf53809c.png

CPU仿真(通过内存实现)

内存其实就是一个 reg 数组,读内存用组合逻辑电路,写内存用时序电路,如下图代码所示。对内存的初始化可以通过 reset 信号,或者软件仿真的时候可以直接在 test bench 文件的 initial 里面初始化。

395589c2-15e6-11f0-9310-92fbcf53809c.png

这时候,pcpu的测试文件就要另外再通过memory.v实例化两个内存模块i_mem、d_mem分别用作指令内存和数据内存了,pcpu模块与内存有关的所有信号(i_datain、d_datain等等)都要连接到这两个模块。initial初始化内存的方式如下图:

3964daa8-15e6-11f0-9310-92fbcf53809c.png

另外一种reset信号初始化内存的方式需要分开定义指令内存i_memory.v和数据内存d_memory.v,然后在pcpu的测试文件里面实例化这两个文件的模块。d_memory.v大致如下

396fbe28-15e6-11f0-9310-92fbcf53809c.png

Testbench:

397d002e-15e6-11f0-9310-92fbcf53809c.png

仿真图

3989b1c0-15e6-11f0-9310-92fbcf53809c.png

399fbcea-15e6-11f0-9310-92fbcf53809c.png

原文连接:https://tencentcloud.csdn.net/678a0cacedd0904849a6618d.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5619

    浏览量

    130422
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11327

    浏览量

    225902
  • 内存
    +关注

    关注

    9

    文章

    3234

    浏览量

    76517
  • 五级流水线
    +关注

    关注

    0

    文章

    2

    浏览量

    1605

原文标题:RISC_v五级流水线CPU设计

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RISC-V开放架构设计之道|阅读体验】RV64指令集设计的思考以及与流水线设计的逻辑

    RISC-V指令集体系结构的设计思想和优化技术,包括流水线、分支预测、数据转发和乱序执行等。 这本书对RISC-V指令集体系结构进行了深
    发表于 01-29 10:09

    RISC-V 基础学习:RISC-V 基础介绍

    特性使得CPU 指令预取、分支预测、指令流水线等部件的效能大大发挥,几乎一个时钟周期能执行多条指令 RISC 的代表产品是 ARM 和 RISC-V。现在,两者已经没有明显的界限了,开
    发表于 03-12 10:25

    RISC-V架构的多级流水线处理

    有的单核RISC-V MCU支持四流水线,有的只支持三流水线,是不是级数越多,带来的开销越大,功耗也越高呢?
    发表于 05-20 16:01

    流水线指令及RISC

    本帖最后由 eehome 于 2013-1-5 09:44 编辑 流水线指令及RISC
    发表于 08-17 15:49

    现代RISC中的流水线技术

    作Stretch计算机)。后来的CDC 6600同时采用了流水线和多功能部件。到了20世纪80年代,流水线技术成为RISC处理器设计方法中最基本的技术之一。RISC设计方法的大部分技术
    发表于 03-01 17:52

    什么是流水线技术

    什么是流水线技术 流水线技术
    发表于 02-04 10:21 4408次阅读

    CPU流水线的定义

    cpu流水线技术是一种将指令分解为多步,并让不同指令的各步操作重叠,从而实现几条指令并行处理,以加速程序运行过程的技术。
    发表于 12-14 15:29 5220次阅读

    基于流水线的HEVCDBF模块硬件架构设计

    基于流水线的HEVCDBF模块硬件架构设计_沈高峰
    发表于 01-07 21:28 0次下载

    处理器系列之CPU流水线科普

    1989年推出的i486处理器引入了流水线。这时,在CPU中不再仅运行一条指令,每一流水线
    发表于 01-26 01:18 5207次阅读
    处理器系列之<b class='flag-5'>CPU</b><b class='flag-5'>流水线</b>科普

    自制CPU(三)流水线

    我们正在第三执行第条指令的执行操作,对于整个数据通路来讲,其它几级都是空闲状态,那我们为了提高CPU的工作效率,就让他提前后边指令的其他几级操作。这样一来,我们的CPU就像工厂内的
    的头像 发表于 07-16 09:20 6447次阅读

    各种流水线特点及常见流水线设计方式

    按照流水线的输送方式大体可以分为:皮带流水装配线、板链线、倍速链、插件线、网带线、悬挂线及滚筒流水线这七类流水线
    的头像 发表于 07-05 11:12 1w次阅读
    各种<b class='flag-5'>流水线</b>特点及常见<b class='flag-5'>流水线</b>设计方式

    CPU流水线的问题

    1989 年推出的 i486 处理器引入了流水线。这时,在 CPU 中不再仅运行一条指令,每一流水
    的头像 发表于 09-22 10:04 3160次阅读

    CPU流水线优缺点

    为什么有些CPU的主频更低,但运算效率却更高呢? 比如:51单片机30M主频,STM32单片机20M主频,执行相同一段代码可能主频更低的STM32所花的时间更短。 这里就牵涉到CPU流水线的问题,本文围绕
    的头像 发表于 10-24 14:34 5834次阅读

    Andes晶心科技推32/64位、高效能低功耗的RISC-V处理器

    这是一个三流水线的 32 位 RISC-V CPU核心,适合低功耗和高效率的嵌入式处理以及物联网应用。
    发表于 02-09 10:59 1401次阅读

    什么是流水线 Jenkins的流水线详解

    jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkin
    发表于 05-17 16:57 1782次阅读