码迷,mamicode.com
首页 > 其他好文 > 详细

自己动手写CPU 笔记

时间:2014-10-30 19:18:17      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:fpga   verilog hdl   ucos-ii   cpu   

自己动手写CPU

跳转至: 导航 搜索

目录

处理器与MIPS

  1. 主要的ISA:x86 ARM SPARC Power MIPS

可编程逻辑器件与Verilog HDL

  1. 不同PLD:PLA PAL GAL PROM EPLD CPLD FPGA
    1. 基于乘积项的:与或门+存储元件(触发器)
    2. 基于查找表的:FPGA一般输入变量<=5
  2. 原理图(Schematic)
  3. Verilog HDL
    1. module
    2. 端口:input, output
    3. 数据类型:
      1. net型:wire(0 1 X Z) tri wor trior wand triand tri1 tri0 supply0 supply1
      2. variable型: reg integer real
    4. 逻辑功能:assign(阻塞= 非阻塞<=)
      1. always
        1. 敏感信号:电平/边沿(posedge, negedge)
      2. initial
    5. 编译指示:`define `include `ifdef ...
  4. 综合(Synthesis):算法/行为描述 --> RTL --> 逻辑门级 --> PLD网表
  5. ModelSim仿真

教学版OpenMIPS处理器蓝图

  1. 5级流水线:取指、译码、执行、访存、回写

第一条指令ori

逻辑、移位与nop

  1. 相关问题(流水线引入了并发竞争?每个阶段可视为单独的HDL模块)
    1. 数据相关:RAW WAR WAW ==> OpenMIPS只存在RAW相关,例如:ori $1, $0, 0x1100; ori $2, $1, 0x0020
      1. p111 如果读取的寄存器是在下一个时钟上升沿要写入的,那么直接将要写入的数据作为结果输出
        1. if( reg2_read_o==1‘b1 && ex_wreg_i==1‘b1 && ex_wd_i==reg2_addr_o begin reg2_o <= ex_wdata_i; ...
      2. 插入暂停周期
      3. 编译器调度(指令重排)
      4. 数据前推

移动

  1. 特殊寄存器HI、LO?

算术

  1. 流水线暂停:保持PC不变,同时第n阶段之前的暂停
    1. CTRL模块:只有译码、执行阶段可能会有暂停请求
  2. 乘累加指令:这是不是有点背离了RISC的原则?
  3. 除法指令(试商法)

转移

  1. 延迟槽
    1. 在执行阶段如果转移,会有2条无效指令
    2. 仍然会导致已经进入取指阶段的指令无效:可在译码阶段进行转移判断,避免浪费时钟周期
  2. p210 bal是bgezal的特殊情况(rs=0)

Load/Store

  1. p258 Wishbone总线的相关规范?
  2. p268 MIPS32特殊的信号量机制:不保证原子操作一定是原子性的,允许检测设置在没有原子性的情况下执行,但只在确实原子运行的时候才让‘设置’生效
    1. 链接加载ll:LLbit
    2. 条件存储sc
  3. load相关问题
    1. 在译码阶段检查是否与上一条指令存在load相关,如果存在,让译码、取指暂停,而执行、访存、回写继续(相当于插入一个nop)

协处理器

  1. MIPS32:CP0用作系统控制,CP1、CP3用作浮点处理,CP2保留
  2. CP0中的寄存器
    1. Status
    2. MMU相关:EntryLo0/1 Context
    3. TLB相关:Index Random PageMask Wired EntryHi ...
    4. 异常:BadVAddr Cause EPC
    5. 定时中断:Compare

异常

  1. 类型:Reset, Soft Reset, DSS DINT NMI, Machine Check, Interrupt, ...
  2. 精确异常(k, 事务性?)
    1. 按指令执行的顺序处理异常,而不是按照异常发生的顺序?
  3. 如果发生异常的指令在延迟槽中,那么保存到EPC的值是PC-4,否则PC
  4. syscall
  5. eret
  6. p332 assign excepttype_o = {19‘b0, excepttype_is_eret, 2‘b0, instvalid, excepttype_is_syscall, 8‘b0};

实践版OpenMIPS

小型SOPC

验证

移植uC/OS-II

附录A 教学版OpenMIPS各个模块的接口说明

附录B OpenMIPS实现的所有指令及对应机器码

参考文献 

自己动手写CPU 笔记

标签:fpga   verilog hdl   ucos-ii   cpu   

原文地址:http://blog.csdn.net/cteng/article/details/40623073

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!