我的课上题目

  • T1:senodb rd,rs,rt

    • 描述:统计rs和rt寄存器中不同位的个数,不同位个数为偶数rd置1,否则置0
    • 32位指令格式:000000 rs rt rd 00000 100111
    • 实现:改ALU,XOR + BitAdder
  • T2:bao rs,rt,offest
    • 描述:if(GPR[rs] + GPR[rt] 溢出) then branch
    • 32位指令格式:101100 rs rt offset
    • RTL描述:
      temp <—— (GPR[rs]31||GPR[rs]) + (GPR[rt]31||GPR[rt])
      if temp32 ≠ temp31 then
      PC <—— PC + 4 + sign_extend(offset||02)
      else
      PC <—— PC + 4
    • 实现:完全按照RTL描述来实现,不要用logisim Arithmetic自带的Adder判断overflow,亲测会出bug
  • T3: lwor rt,offset(base)
    • 描述:lw的扩展,详见RTL描述
    • 32位指令格式:110011 base rt offset
    • RTL描述:
      vAddr <—— (GPR[base] + sign_ext(offset) + rt * 4) & 0x7c
      GPR[rt] <—— memory[Addr]
    • 实现:完全按照RTL描述来搭就好
  • 总结:
    • 三道题一般是跳转 + 计算 + 访存。
    • 做题时一定要好好看 RTL! 课上基本就是把 RTL 翻译成电路。
    • 课上测试一般存在于前几个点,后几个点不涉及课上指令。所以如果发现自己错了后面几个点,那基本上是课下测试的问题。(此条谨慎对待)

设计概述


本次课下设计的CPU为logisim实现的单周期CPU,搭建采用自下而上的方式完成—先根据应实现的指令对各个功能部件进行设计与搭建,然后对各个功能部件进行连接,形成完整的数据通路。设计的模块有NPC、GRF、ALU、DM、CU、EXT。先实现的指令为add, sub, ori, lw, sw, beq, lui, nop,课下提交通过后进行扩展。

数据通路及模块定义


NPC

端口定义:

信号名 方向 位宽 描述
PC I 32 输入当前正在执行的指令的地址
IMM I 26 beq跳转立即数 & instr_index
RA I 32 储存在寄存器中的地址数据(实现jr)
Br I 3 000(PC+4) 001(beq) 010(j) 011(jal) 100(jr)
ALUZero I 1 beq跳转标志
NPC O 32 下一条要被执行指令的地址
PC4 O 32 输出PC + 4(jal要用)

实例:


GRF:

信号名 方向 位宽 描述
clk I 1 时钟信号
reset I 1 异步复位信号
A1 I 5 地址输入信号,指定32位寄存器中的一个,将其中的数据读入RD1
A2 I 5 地址输入信号,指定32位寄存器中的一个,将其中的数据读入RD2
A3 I 5 地址输入信号,指定32位寄存器中的一个,将其作为待写入的目标
WD I 32 输入待写入的数据
WE I 1 写使能信号
RD1 O 32 输出A1寄存器中的32位数据
RD2 O 32 输出A2寄存器中的32位数据

ps:直接挪用P0课下搭好的GRF就好,注意0号寄存器不能写入。

DM:

端口定义:

信号名 方向 位宽 描述
clk I 1 时钟信号
reset I 1 异步复位信号
WE I 1 写使能
A I 5 地址输入信号,指向DM的某个存储单元
D I 32 数据输入信号
RD O 32 输出A指定存储单元中的32位数据

实例:

ALU:

比较容易,先写一个加减与或的,然后慢慢扩展

实例:

CU:

信号名 add sub lui ori sw lw beq j jr jal jalr
func 6’d32 6’d34 6’d08 6’d09
opcode 000000 000000 6’d15 6’d13 6’d43 6’d35 6’d04 6’d02 000000 6’d03 000000
DMWr(是否写入DM) 0 0 0 0 1 0 0 0 0 0 0
Br(跳转方式) 3‘b000 3’b000 3’b000 3’b000 3’b000 3’b000 3’b001 3’b010 3’b100 3’b011 3b100
extop(符号扩展或零扩展) 0 0 0 0 1 1 0 0 0 0 0
ALUop(选择ALU操作) ADD SUB LUI OR ADD ADD SUB X X X X
Bsel(选择ALU srcB) 0 0 1 1 1 1 0 X X X X
WDsel(选择寄存器写入数据) 2’b00 2’b00 2’b00 2’b00 2’b00 2’b01 XX XX XX 2’b10 2’b10
A3sel(选择寄存器写入地址) 2’b01 2’b01 2’b00 2’b00 2’b00 2’b00 2’b00 XX XX 2’b10 2’b01
RFWr(是否写入寄存器) 1 1 1 1 0 1 0 0 0 1 1
  • 一位控制信号可以用与或门阵列来实现
  • 多位控制信号可以用Priority Encoder

(一种涉及LH&LB的方法实现)

教程实例:

我的操作:

测试方案

测试 ALU+DM+跳转:
mips 代码如下:

ori $t0,$0,156
ori $t2,$0,135
ori $a3,$a3,1035
lui $a1,101
ori $a1,$0,2211
nop
loop:
beq $t3,$t2,end
ori $t4,8
lui $s6,170
addu $t3,$t3,$t4
addu $t3,$t2,$0
lw $s0,4($t1)
out:
addu $t2,$t2,$t1
subu $t3,$t2,$0
beq $t3,$t2,loop
end:
lui $v0,11111

机械码如下:

v2.0 raw
3408009c
340a0087
34e7040b
3c050065
340508a3
00000000
116a0008
358c0008
3c1600aa
016c5821
01405821
8d300004
01495021
01405823
116afff7
3c022b67

课下testcode:

v2.0 raw
341c0000
341d0000
34013456
00210820
8c010004
ac010004
3c027878
00411822
3c051234
34040005
00000000
ac85ffff
8c83ffff
10650001
1000000d
34670404
10e3000b
00000000
3c087777
3508ffff
00080022
34001100
00e65020
34080000
34090001
340a0001
010a4020
1109fffe
1000ffff

思考题

1.上面我们介绍了通过 FSM 理解单周期 CPU 的基本方法。请大家指出单周期 CPU 所用到的模块中,哪些发挥状态存储功能,哪些发挥状态转移功能。
  • 状态存储:GRF,DM
  • 状态转移:IFU,EXT,ALU,CU
2.现在我们的模块中 IM 使用 ROM, DM 使用 RAM, GRF 使用 Register,这种做法合理吗? 请给出分析,若有改进意见也请一并给出。

非常合理。
ROM的优点在于数据不能被改变,下次打开文件时里面的内容也就是指令仍然存在。而且在电路运行期间,ROM里面的数据也就是指令不会被修改。
RAM的优点在于可写可读可复位,支持 load 和 store 指令,并且速度快于ROM,可以相对方便快捷的对里面的值进行修改。但由于RAM采用按字存储的方式,不支持跨地址读写数据;并且一次只能读写一个地址(4字节),因此无法直接实现lb,sb等指令。
GRF是临时存储单元,是CPU的核心部件。而Logisim提供的寄存器功能与实际的CPU中相同,一切运算都必须通过寄存器完成,同时是实现寄存器模块效率最高的元件。

3.在上述提示的模块之外,你是否在实际实现时设计了其他的模块?如果是的话,请给出介绍和设计的思路。

暂时没有设计其他的模块。但在扩展指令的过程中将会在CU中扩展mux的选择信号,对ALU的行为进行进一步选择

4.事实上,实现 nop 空指令,我们并不需要将它加入控制信号真值表,为什么?

nop相当于sll $0, $0, 0,即把$0寄存器中的值左移0位并写入$0寄存器,但$0寄存器的值始终为0,不会被修改,因此没有影响。即使课下搭建的CPU并没有包含sll指令,nop也不会对电路元件进行任何操作,所以没有影响,不需要加入到控制信号真值表

5.上文提到,MARS 不能导出 PC 与 DM 起始地址均为 0 的机器码。实际上,可以避免手工修改的麻烦。请查阅相关资料进行了解,并阐释为了解决这个问题,你最终采用的方法。

可以将PC的信号传入一个自动修改模块,来判断PC是否到达DM的地址区域。假设DM的起始地址为0x3000,那么我们可以构建一个判断模块:当PC小于0x3000时不做任何修改;PC大于0x3000时减去0x3000,以保证二者的地址没有重合部分。

6.阅读 Pre 的 “MIPS 指令集及汇编语言” 一节中给出的测试样例,评价其强度(可从各个指令的覆盖情况,单一指令各种行为的覆盖情况等方面分析),并指出具体的不足之处。

该测试样例的强度较高。先由最基本的可独立判断正误的指令进行验证,之后再在其基础上对更高层的跳转等指令的正误进行验证,且各个指令的覆盖情况较为完整,对程序的验证能够起到较为准确的反馈。我认为没有什么不足之处。

本文是在原版课下文档上参考往届学长大佬的博客稍作修改后得到,后续可能会在描述不够具体的地方添加思路以及补充其他的指令实现,欢迎提出修改意见。

2022 buaa CO P3(Logisim 实现单周期CPU)相关推荐

  1. 使用logisim搭建单周期CPU与添加指令

    使用logisim搭建单周期CPU与添加指令 搭建 总设计 借用高老板的图,我们只需要分别做出PC.NPC.IM.RF.EXT.ALU.DM.Controller模块即可,再按图连线,最后进行控制信号 ...

  2. 2021 buaa 计组上机P3和P4 单周期CPU 3道课上考试题

    P3和P4上机2021试题 P3和P4一共三道题,分别是计算.跳转和存储相关指令 同场考试,P3和P4所用的题目一致 计算相关指令的扩展 格雷码指令 gray $t0, $t1 32位指令格式 000 ...

  3. 使用Verilog搭建一个单周期CPU

    使用Verilog搭建一个单周期CPU 搭建篇 总体结构 其实跟使用logisim搭建CPU基本一致,甚至更简单,因为完全可以照着logisim的电路图来写,各个模块和模块间的连接在logisim中非 ...

  4. MIPS单周期CPU设计(24条指令)

    MIPS单周期可执行24条指令CPU 实验要求 本实训项目帮助学生构建支持 24 条指令的 MIPS 单周期 CPU ,最终实现的处理器能运行 benchmark 测试程序.另外希望学有余力的同学能为 ...

  5. 计算机组成原理——单周期CPU

    单周期CPU 项目代码 实验原理 MIPS指令 rom.coe文件 代码 顶层模块SingleCycleCPU display外围模块 PC instructionMemory Alu模块 DataM ...

  6. 北航2021届计组 -- 单周期CPU设计

    单周期CPU设计 写在前面的话 ​ 首先需要强调的是,这是一篇考后反思,所以相比于之前的HDLBit的以力证道,或者MIPS的技之巅峰(不要笑,我的技巧最高水平就那样了).这篇文章要温吞很多.这篇文章 ...

  7. 【Computer Organization笔记10】单周期CPU设计:基于7条MIPS指令的数据通路

    本次笔记内容: P19 计算机组成原理(19) P20 计算机组成原理(20) 本节课对应幻灯片: 组成原理24 singlecycle.pptx 基于上节课的7条MIPS指令的数据通路,分别针对7条 ...

  8. 单周期CPU设计【Verilog】

    第一章 单周期CPU的设计原理 1.1 单周期CPU概述 1.2 CPU工作原理 第二章 单周期CPU的设计内容 2.1 指令系统的设计 2.1.1 概述 2.1.2 运算类指令的设计 2.1.3 传 ...

  9. 【中山大学计算机组成原理实验】单周期CPU设计与实现

    实验一 : 单周期CPU设计与实现 一. 实验目的 (1) 掌握单周期CPU数据通路图的构成.原理及其设计方法: (2) 掌握单周期CPU的实现方法,代码实现方法: (3) 认识和掌握指令与CPU的关 ...

最新文章

  1. NameError: name ‘sklearn‘ is not defined的解决方法:
  2. Python看程序执行时间(time模块)
  3. 多系统权限设计(一)
  4. linux 切换用户_Linux 用户态切换到内核态的 3 种方式
  5. mysql error 变量_mysql 变量问题
  6. 自带容器_什么是衬胶容器罐以及质量标准?
  7. 2020年墨天轮数据报告发布!
  8. 自动化运维专题之zabbix课程内容大纲
  9. LeetCode 40. 组合总和 II(回溯)
  10. Oracle数据库to_date()和to_char()的相关
  11. loadrunner中面向目标场景的设计
  12. (转)Windows API User32.dll详细介绍
  13. 仓库管理软件中的账套是什么意思
  14. 通过MVC与MVP的对比,简述单一职责原则
  15. 一个完整的研发体系应该包括的内容
  16. 2021年开源愿景大揭秘
  17. 英汉对照名言隽语(四)
  18. 问题 G(1203): 【基础算法】0/1字符串问题
  19. 程序是怎样跑起来的-读书文摘
  20. win7开启共享(热点)设置

热门文章

  1. Springboot 整合ElasticSearch(Client篇)
  2. vue 上传图片 base64图片无法显示的问题
  3. 如何预防arp欺骗以及c#如何自动绑定网关的mac地址?
  4. 环球好货,小黑鱼就是一个骗局
  5. 意外被裁,逆境中意外面过阿里3+1,成功拿下阿里Java岗P6 offer
  6. python笔记之NUMPY中的掩码数组numpy.ma.mask
  7. Android 2020年夏招面试题(一)
  8. 为什么叫Windows 7?
  9. 相机快门音量大小适配
  10. OpenCV 画任意圆弧曲线