`
Marshal_R
  • 浏览: 132498 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

三步教你用Verilog写一个CPU:第三步

阅读更多

三步教你用Verilog写一个CPU

第三步:登峰造极

 

基础

课程要求:数字电路、计算机组成原理、程序设计

编程语言:Verilog

开发平台:xilinx ISE

FPGA开发板:Nexys3

 

 

教学大纲

第一步

指令集设计与五级流水线的实现

第二步

内存设计与CPU测试

第三步

指令冲突避免

 

 

指令冲突介绍

    在我们之前的测试中可以看到,指令之间加入了许多额外的NOP指令,这都是为了避免指令冲突,插入NOP可以有软件的实现方式(编译器),也可以通过硬件实现,即CPU检测到冲突的时候就执行NOP指令。不过对于CPU的设计者来说,这极大地降低了CPU的性能,是不可容忍的。下面我来详细讲解指令冲突的不同场合以及避免措施。

 

    流水线处理中,由于各个阶段的依赖关系、硬件资源的竞争等原因,会出现操作无法同时执行的情况。造成流水线故障的原因称为冒险,冒险分为构造冒险、数据冒险和控制冒险 3 种类型。


构造冒险

        由于硬件资源的竞争,操作无法同时执行的情况。由于内存设计采用了指令内存和数据内存分离的方式,因此不会产生构造冒险。


数据冒险

        由于指令执行所需要的数据还未准备好所引起的冒险情况。当即将执行的指令依赖于还未处理完成的数据时,会导致指令无法立刻开始执行,引发数据冒险。


图1 数据冒险

 

        数据冒险可以简单地通过插入 NOP 的方式避免,不过这样大大降低了流水线的工作性能。另外的方法就是通过数据转发,尽管数据回写在 WB 阶段,但实际上运算结果在 EX阶段就已经确定,可以传递给下一条指令。


图2 数据转发

 

        数据转发有一个例外就是 LOAD 指令,由于 LOAD 指令从内存调取数据是在 MEM 阶段才完成的,而此时下一条指令也已经到了 EX 阶段,与数据转发不吻合。解决 LOAD 冒险的方法是暂停机制,阻塞流水线一个周期,到下一个周期的时候再继续执行 LOAD 之后的指令。


图3  LOAD冒险暂停机制

 

控制冒险

        无法确定下一条指令而引发的冒险情况。在执行可能会改变下一条指令的分支指令时,在这一条指令执行结果确定之前下一条指令无法开始执行,从而引起控制冒险。控制冒险也可以通过在分支 指令之后插入 3 条NOP 指令避免,不过更加高效的方法是采用静态分支预测,即假定分支指令不转移,CPU 继续执行跟在分支指令之后的指令,当分支指令执行到MEM 阶段确定了分支需要转移,则排空流水线 IF、ID、EX 阶段,重新读取转移目标地址处的指令开始顺序执行。

 

 

指令冲突的避免

数据冒险

        LOAD 冒险要在 IF 阶段进行检测,如果当前已经有一条 LOAD 指令进入 ID 阶段,并且下一条指令(即处于 IF 阶段的指令)与之存在数据冲突,则阻塞流水线一个周期,具体做法是保持 PC 值不变,在 IF 阶段插入 NOP 指令。


图4  LOAD冒险避免代码实现

 

        数据转发在 ID 阶段进行检测,数据转发到 reg_A、reg_B 或者 smdr 寄存器,如果与上一条指令(ex_ir)冲突,从 ALUo 处转发数据,否则如果与上上条指令(mem_ir)冲突,从reg_C 或者数据内存 d_datain 处转发数据,否则如果与上上上条指令(wb_ir)冲突,从 reg_C1处转发数据。


图5 数据转发部分代码实现

 

控制冒险

        可以在 MEM 阶段设置一个跳转标志寄存器,当且仅当分支指令被确认为跳转时标志寄存器有效。标志寄存器有效则排空流水线 IF、ID、EX 阶段,这样就避免了跟在分支指令之后本不该被执行的指令在 EX、MEM、WB 阶段修改 zf、nf、cf、8 个通用寄存器以及数据内存的值,具体做法是把 id_ir、ex_ir、mem_ir 置为 NOP,dw 不使能,同时还要保证把 PC设置为跳转目标地址。


图6 控制冒险避免代码实现

 

 

 代码实现

    至此,整个CPU的设计以及测试都已经介绍完了,这里代码就不贴上来了,因为光是pcpu模块就有五百多行代码,篇幅占用太大了,三步所有的代码都可以在文章末尾下载到。这些都是我个人写的代码,不一定十分准确,仅供参考,希望能对想接触CPU设计的各位有所帮助!

 

 

 

  • 大小: 17.5 KB
  • 大小: 79.2 KB
  • 大小: 39.6 KB
  • 大小: 34.1 KB
  • 大小: 46 KB
  • 大小: 68.5 KB
  • 大小: 17.7 KB
分享到:
评论

相关推荐

    简化的cpu用verilog语言

    在本文中,我们将探讨如何使用Verilog语言设计一个简化的RISC(精简指令集计算)CPU。RISC CPU以其高效的指令集和简洁的硬件结构著称,旨在提高计算机的运算速度。通过这个设计过程,我们可以深入理解CPU的工作原理...

    cpu设计实例-verilog

    通过对本教学模型的学习,我们可以了解到如何使用Verilog HDL来设计一个简化的RISC CPU。虽然该设计可能不是最优化的方案,但它为学习者提供了一个深入了解CPU内部工作原理的机会。此外,这也展示了Verilog HDL作为...

    使用Verilog设计CPU

    在本章中,我们将深入探讨如何使用Verilog HDL来设计一个简化的RISC CPU。RISC(精简指令集计算机)CPU的特点是其指令集非常简洁,每条指令执行时间短,能够高效地执行程序。为了达到这个目标,我们需要遵循以下几个...

    自己动手写CPU

    第三篇是进阶篇,通过为教学版OpenMIPS添加Wishbone总线接口,从而实现了实践版OpenMIPS处理器,并与SDRAM控制器、GPIO模块、Flash控制器、UART控制器、Wishbone总线互联矩阵等模块组成一个小型SOPC,然后下载到FPGA...

    夏闻宇Verilog教程

    第三章 Verilog HDL的基本语法.doc 第九章虚拟器件和虚拟接口模型以及它们在大型数字系统设计中的作用.doc 第二章 Verilog HDL设计方法概述.doc 第五章 基本运算逻辑和它们的Verilog HDL模型.doc 第八章 可综合...

    verilog-MIPS多周期处理器CPU

    【MIPS多周期处理器CPU】是计算机硬件设计领域的一个重要课题,主要涉及使用硬件描述语言Verilog进行设计。MIPS(Microprocessor without Interlocked Pipeline Stages)是一种精简指令集计算机(RISC)架构,以其高...

    VERILOG CPUs设计架构

    【VERILOG CPUs设计架构】 在CPU设计中,VERILOG是一种常用的硬件...这个简单的CPU设计展示了如何利用VERILOG来构建一个基础的微处理器,尽管它只包含了几个基本操作,但其设计理念和方法可以扩展到更复杂的设计中。

    可综合的verilog编写的RISC_CPU设计

    通过上述内容,我们可以清楚地看到,使用Verilog HDL设计一个可综合的RISC_CPU是一项非常有价值的学习活动,它不仅能够帮助初学者掌握Verilog HDL的应用技巧,还能为未来的硬件设计打下坚实的基础。

    计组头歌实验MIPS CPU设计1-5关源码

    通过头歌实验的方式,我们可以逐步构建一个功能完整的MIPS CPU,并通过编写和调试源码来解决各个关卡的问题。 首先,我们需要了解MIPS指令集。MIPS指令集设计简洁高效,包含数据处理、控制转移、加载/存储等基本...

    基于Verilog的简易单周期CPU的实现+实验报告.zip

    【项目介绍】 基于Verilog的简易单周期CPU的实现+实验报告.zip ...2、请用自己的账号在csdn官网下载,若通过第三方代下,博主不对您下载的资源作任何保证,且不提供任何形式的技术支持和答疑!!!

    计算机组成原理(CPU)的设计

    通过这个实验,你将有机会亲手实现一个简单的CPU模型,理解各个部分如何协同工作,从而更深入地掌握计算机组成原理。这不仅有助于理解计算机的底层运作,也为后续的系统级编程、硬件设计等领域的学习打下坚实基础。...

    verilog三本包含夏宇闻

    这些实例可能覆盖了从基础的逻辑门到复杂的数字系统,提供了一个从易到难的学习路径。 综上所述,学习夏宇闻的Verilog系列书籍,不仅能够掌握Verilog语言本身,还能深入了解数字逻辑与计算机设计的原理,对于想要...

    计组头歌实验:MIPS单周期CPU设计(24条指令)(HUST)1-4关源码

    在单周期CPU设计中,所有的指令在一个时钟周期内完成,不涉及复杂的流水线技术。 二、单周期CPU设计 1. 数据通路设计:单周期CPU包含ALU(算术逻辑单元)、寄存器堆、控制逻辑、数据存储器等核心组件。每个组件在一...

    Verilog基本电路设计指导书.pdf

    // 第一个半加器 half_adder ha1 (a, b, s1, c1); // 第二个半加器 half_adder ha2 (s1, cin, sum, c2); // 或门 or or1 (cout, c1, c2); endmodule ``` #### 2. 数据通路设计 数据通路是指在计算机体系结构...

    《自己动手写CPU》配套代码( 代码+工具)

    《自己动手写CPU》使用Verilog HDL 设计实现了一款兼容MIPS32指令集架构的处理器——OpenMIPS。OpenMIPS 处理器具有两个版本,分别是教学版和实践版。教学版的主要设计思想是尽量简单,处理器的运行情况比较理想化,...

    自己动手写CPU 第八章学习笔记

    在“自己动手写CPU 第八章学习笔记”中,我们主要探讨了CPU设计中的关键概念和技术,这章可能涵盖了流水线、中断系统、内存管理以及输入/输出接口等多个主题。以下是对这些知识点的详细说明: 1. **流水线技术**:...

Global site tag (gtag.js) - Google Analytics