BUAA计组p3_Logisim_复习tips

p3 OCC


一、设计需求

  • 基础要求指令集:{addu, subu, ori, lw, sw, beq, lui, nop}。

  • MIPS-C0指令集:

  • 课下实现指令集:


二、指令添加步骤

  1. 分析数据通路,判断是否需要修改模块
  2. 确定控制信号,在控制元件中添加控制指令
  3. 检查控制指令实现情况,测试数据

三、高老板的教导!!!(ptsd合集)

  1. 设计思想

    • 层次化设计思想,在思考一层的搭建设计时,应该着眼于各部件的主要功能需求实现,以及各部件之间的主要联系,整体观念最为重要。在设计该层时向下最多深入一层,过于纠结下层设计会导致整体观念混乱。

    不同层次应关注不同的问题域;RTL描述关注的是指令执行所涉及的对象及其操作的抽象,但建模CPU内部结构时就必须关注对象与操作的具体实现方式。

    • 以单周期为例,首先要掌握的是整体的架构,要熟悉单周期CPU模型,再思考功能部件与控制器的设计与实现

      1. 熟单悉周期CPU模型:
      • 单周期CPU模型分为控制器与数据通路,可以通过指令的宏观实现过程完成对于数据通路所需功能部件及其关系的思考。首先PC通过地址信息驱动IM输出指令信息,紧接着指令信息驱动从寄存器堆中读出参与运算的寄存器值,之后从寄存器堆中输出的操作数进入ALU参与运算,其运算结果或写回至目的寄存器,或进数据存储器,同时一些指令从数据存储器中读取数据写入目的寄存器中。当然,需要通过指令存储器及PC值计算下一指令的地址,即NPC。
      1. 功能部件的设计与实现:指令级数据通路及控制信号真值表的建模、数据通路的综合、综合器的综合

      2. 建模指令的数据通路与控制信号真值表

      3. 控制器的设计与实现:考虑指令与数据通路的功能部件之间的关系,再进行具体实现的映射部分

  2. 自己的问题:

    • 设计思路方面的逻辑不清,缺乏层次化设计的思想

    • 对于基础模型的概念的掌握非常差

    • 对于指令的实现很不熟悉


四、dalao的实现思路(膜)

ACE_control

part1: 进入后先识别指令

part2: 翻译为RTL表达,把rs,rt,rd寄存器对应上,直接在control里确定好GRF的A1,A2,A3

part3:control signal直接给每一个指令编码control值,其splitter即为各control值


五、课下感悟

  1. 如果该位之前Control连的是零新加指令需要修改这一位务必删除0

  2. 注意控制指令务必写全位数,确保高位到低位连接的顺序,为0的位置不连!control连接完成之后对照文档检查一下是否正确,所以文档务必写对!

  3. 注意关注指令的实际意义,以简化测试代码的编写,比如sll左移的数字必须是小于等于31的,低级错误一定避免!

  4. IM一定先clear再load

  5. 看清楚rt,rd,rs!!!!!!!!!rd, rt常作为A3,rs是A1

  6. 先clear再连接controller里面指令判断

  7. 确保mips里的代码一行对一行不要有伪指令!


六、课上测试

  1. 课上感悟

    1. 玄学问题如我遇到的一上来一连线就变蓝线,先开始担心是不是课下残留的bug,试图直接引OpCode和Funct替代与逻辑运算直接判断,结果也蓝线,De了20min心态锻炼效果极佳。解决办法:果断关掉Logisim重开。经验:重启解决玄学bug,亲测非常之有效。

    2. 认真读懂RTL描述性语言非常之重要。本次指令中LBI指令因为没有读懂load and insert浪费了不少时间。建议务必先读懂指令含义,分析清楚数据通路,再下手连接,确保高效且思路清晰。类似LBI这样与LB指令类似的指令,可以通过阅读手册,对比其与LB指令的区别帮助理解,2h加三个指令时间其实相对很充足,心态要好,要细心(老生常谈,劝诫自己emm)。

    3. 跳转类指令debug如果发现测试点部分正确,及时去查看是否为PC值得扩展方式选错了。如查错本次课上的BLTZALR指令时,看到报错信息部分正确,立即去查了branch类指令PC+4+sign_Imm<<2发现果然是Bit-extender错选为0扩展了,而且记起来课下测beq竟然没测过偏移负值!Bit-extender一定要选对,p0就因为同步复位extender选错载过,建议对于这种细节谨慎查看。

  2. 思路回顾

    • bltzalr跳转指令:判断Rs寄存器内值小于零时,跳转至branch类PC值,否则仍为PC+4;将PC+4存储进Rt寄存器。

      • 实现:
      • 类似beq,实现也相近,在实现时可以沿用beq的方式给Controller增加一位来自ALU判断Rs寄存器内值是否小于0的sml,其他不赘述。
    • movz指令:判断Rt寄存器内存储的值是否为零,若为零则将Rs寄存器内值存储进Rd(?具体存进哪个我忘记了)

      • 实现:
      1. 首先分析数据通路。
      • 此指令需要判断寄存器内值是否为零,且需要进行寄存器堆的存储操作,思路上类似于beq指令:不同条件下执行操作不同。因此借鉴beq经验,对数据通路进行修改:给ALU增加一位Equal输出,给Controller增加一位Equal输入。Equalr标识ALU_A-ALU_B是否等于ALU_A,即减法的结果是否等于被减数。
      1. 之后确定控制信号。
      • NPC为PC+4
      • A3选择要求的寄存器(为对应RTL,建议在MUX建立时就选择label命名为Rs,Rt,Rd,直观效率高且出错率低)
      • ALU选择减法
      • RF_WD选择ALU_Y(本题中符合写入条件Rt_data == 0时,ALU_Y==Rs_data)= Rs-Rt == Rs
      • Equal && movz的结果连接到RF_Wr的或运算中。
      1. 在Debug模块中检查控制信号是否完全对应。注意给Controller添加了一个输入信号后,Debug模块需要同步修改。
    • lbi指令:读出offset(base)地址内的8bits,并且insert进Rt寄存器。

      • 注意:该指令与lb指令的区别:lbi取出的8bits需插入在对应的位置上,其他位保持不变,而lb是进行符号扩展再放在最低位。

      • 实现:

      1. 首先分析数据通路。
      • 此指令需要将load的8bits插入Rt寄存器,再将数据写入Rt寄存器。由于课下已经实现了lb指令,给DM增加了两位DM_mode控制信号,并修改了DM读入地址为[6:0]七位,因此只需要给DM增加Rt_data的输入即可,即RD2输入至DM。DM中实现方式:DM_mode为1时由Addr[1:0]作为选择信号选择Mem_RD插入的位数及对应于Rt的插入位置,由DM_mode为1选择输出为lbi_RD作为DM_RD。
      1. 之后确定控制信号。
      • NPC为PC+4
      • A3选择Rt
      • DM_mode选择1,对应8bits操作控制输出。
      • RF_Wr为1,RF_WD为DM_RD
      1. 在Debug模块中检查控制信号是否完全对应。
  3. 模块构建一定要遵循高内聚,低耦合

    内聚是指某个功能部件的内部功能的相关性,耦合是指功能部件间连接关系的强度。
    高内聚强调单一性,即功能部件或者功能单一,或者多个功能高度相似。
    低耦合强调功能部件的接口应该尽可能少。

  • 在课下实现时,我尽可能的将指令的控制置于Controller中,仿照beq指令添加一位Zero判断相等的思路,课上实现时bltzalr, movz均于ALU内添加类似Zero的一位标识信号输出至Controller,lbi添加一个Controller输出的两位DM_mode输入控制其操作位数。(考虑到lw, lb, lh三类,设置为两位应该更合适)
posted @ 2020-11-29 00:28  Frida_h  阅读(1690)  评论(0编辑  收藏  举报