zoukankan      html  css  js  c++  java
  • 自己动手写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. port: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所有指令来实现和相应的机器代码

    参考 

  • 相关阅读:
    Java类的静态块の二
    Java类的静态块の一
    Eclipse优化工具Optimizer for Eclipse
    C#实现MD5WITHRSA签名
    Ubuntu 初始化Root账户密码
    shell连接本机虚拟机
    Nodejs的Express完成安装指导
    node.js之Windows 系统下设置Nodejs NPM全局路径
    Unicode, UTF-8, GBK, ASCII的区别
    BootstrapValidation一些tips
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5039884.html
Copyright © 2011-2022 走看看