流水线设计与添加指令经验总结
这是一篇针对计组P5,P6的流水线搭建和课上添加指令的经验总结
写在开头虽然这么说有搞心态的嫌疑x,但笔者认为,P5是计组难度的分水岭,难度同时体现在课下和课上当中,课下CPU做不好,做出Bug,课上强测也过不去,而且课上加指令本来就比较难做,所以被P5卡一两回也是理所应当的,同时,P5和P6同作为流水线的开发,课上指令将具有极大的相似性,因此笔者认为,开一篇博客来分享一下笔者P5,P6流水线搭建和课上添加指令是必要的,话不多说,Here We Go!
预留扩展空间如果大家是以顺利通过P3,P4的身份来看这一篇文章的,大家就会明白,一个好的架构对于课上的帮助将有多么巨大,特别是针对于P5,P6这种千行级代码的开发,笔者这里主要说一下扩展空间的事情。
MUX的非模块化很多人在P4,包括我会这样模块化写MUX:1234567891011121314151617181920212223242526272829303132333435module MUX_4_32( input [31:0] data0, input [31:0] data1, input [31:0] ...
复杂流水线CPU全自动测试思路(Verilog)
这是一篇针对计组P6的自动化测试学习
写在开头由于P6是P5的迭代开发,因此本次工作将主要体现在数据生成上
命令行学习无需,前面的完全够用
Python实现(数据执行器)无需,照搬P5即可,具体见我的前几篇博客
数据生成器迭代思路P6指令集{add,sub,and,or,slt,sltu,addi,andi,ori,lb,lh,lw,sb,sh,sw,mult,multu,div,divu,mfhi,mflo,mthi,mtlo,beq,bne,lui,jal,jr,nop}
迭代思路整体思路等同与不等同找到同类,直接归类
没有同类,单独添加
我举个例子,or,and,slt,sltu都是cal_r类型,可以直接和P5数据生成器中的add,sub等同处理。lb,lh可以等同lw处理。sb,sh可以等同sw处理。等同的意思是,代码可以复用,规则可以复用。对于mult,div则不可以,需要新规则的限制。做完这些,大部分我们就归类完毕了,之后就是对于新规则的修修补补,维持程序正确
危险指令与安全指令要这样考虑是为了逻辑上的简便,和作为指令生成时随机范围的依据 ...
复杂流水线CPU设计文档(Verilog)
Verilog 复杂流水线CPU设计文档
CPU设计方案综述总体设计综述使用Verilog开发一个流水线CPU,总体概述如下:1.此流水线CPU为32位CPU2.此CPU为流水线设计3.此CPU支持的指令集为:{add,sub,and,or,slt,sltu,addi,andi,ori,lb,lh,lw,sb,sh,sw,mult,multu,div,divu,mfhi,mflo,mthi,mtlo,beq,bne,lui,jal,jr,nop}4.nop的机器码为0x00000005.add,sub不支持溢出
关键模块定义IM(外置)(1)端口说明
序号
信号名
方向
描述
1
i_inst_addr[31:0]
I
需要进行取指操作的流水级 PC(一般为 F 级)
2
i_inst_rdata[31:0]
I
i_inst_addr 对应的 32 位指令
3
reset
I
复位信号
4
clk
I
时钟信号
(2)功能定义
序号
功能
描述
1
取指
利用PC取出对应位置处的指令
F_PC(1)端口说明
序号
信 ...
简易流水线CPU全自动测试思路(Verilog)
这是一篇针对计组P5的自动化测试学习
写在开头如果P3,P4大家有好好的做数据生成,那么P5的数据生成的工作将主要体现在对于数据生成器的优化上,对于数据执行器则无需太大的优化。
如果大家是从P5才开始做测试,那么建议看看笔者博客中P3 P4的自动化测试,很多工作在那时就已经完成,P5的自动化将迭代开发,在本篇博客中将不再赘述。
命令行学习1java -jar Mars_perfect.jar mc CompactDataAtZero nc db test.asm > mar.txt
有小问号可能要问了,这和P4没啥区别啊这?其实区别就在于”db”,这是要求Mars执行时按延迟槽执行的指令。
Python实现(数据执行器)基础功能迭代迭代在P4的基础,我们只需要更改命令行学习中的那一条指令即可完成P5的数据执行器。
自动存储机器码在P4中笔者只是将asm文件和比较结果进行了存储,并没有保存机器码,在P5笔者建议保留机器码文件,具体原因见后。1234567dir_name_3 = 'C:\\Users\\Unicorn\\Desktop ...
简易流水线CPU设计文档(Verilog)
Verilog 简易流水线CPU设计文档
一、CPU设计方案综述(一)总体设计综述使用Verilog开发一个流水线CPU,总体概述如下:1.此流水线CPU为32位CPU2.此CPU为流水线设计3.此CPU支持的指令集为:{add,sub,ori,lw,sw,beq,lui,jal,jr,nop}4.nop的机器码为0x00000005.add,sub不支持溢出
(二)关键模块定义F_IFU(1)端口说明
序号
信号名
方向
描述
1
NPC[31:0]
I
下一个PC值
2
CLK
I
时钟信号
3
RESET
I
复位信号
4
PC[31:0]
O
当前PC值
5
Instr[31:0]
O
当前指令
(2)功能定义
序号
功能
描述
1
取指令
取出当前PC所对应的指令
2
更改PC值
利用NPC更改PC值
D_GRF(1)端口说明
序号
信号名
方向
描述
1
A1[4:0]
I
5位地址输入信号,指定32个寄存器中的一个,将其中存储的数据读出到RD1
2
A2[4:0]
I
5位地址输入信号 ...
单周期CPU全自动测试思路(Verilog)
这是一篇针对计组P4的自动化测试学习
写在开头在笔者看来,由于P5,P6,P7需要大量的数据作为支持,且均为Verilog语言,所以在P4学好自动化测试是十分有必要的,它可以免除你课上担心课下CPU有问题的后顾之忧,大大增加你PASS的几率。
而且,从P4开始,我们的自动化测试对拍对象不是小伙伴,完全可以是Mars,对我们的测试难度降低了很多,笔者在这里十分建议大家学一学自动化测试。通过阅读本文,你可以了解到如何蒟蒻合理生成不会陷入死循环不会报错的指令,并了解到对Verilog进行自动化测试的相关方法。
工具选择作者对于Verilog的学习全程采用ISE,(学会ISE是能做P8的基础)所以我们这里介绍ISE的命令行操作。
命令行学习MARS命令行官方教程对其他命令感兴趣的小伙伴可以去这里看看~
速通版本工具准备来到P4,原有的MARS已经不能满足我们的要求,因此我们需要一个可以显示每一条指令对GRF和DM读写信息的MARS,笔者在此为大家准备了一个:Mars_perfect,提取码:jkvq,需要的uu可以自取。
生成机器码1java -jar Mars_perfect.jar ...
单周期CPU设计文档(Verilog)
Verilog 单周期CPU设计文档
CPU设计方案综述(一)总体设计综述IFU(1)端口说明
序号
信号名
方向
描述
1
NPC[31:0]
I
下一个PC值
2
CLK
I
时钟信号
3
RESET
I
复位信号
4
PC[31:0]
O
当前PC值
5
Instr[31:0]
O
当前指令
(2)功能定义
序号
功能
描述
1
取指令
取出当前PC所对应的指令
2
更改PC值
利用NPC更改PC值
GRF(1)端口说明
序号
信号名
方向
描述
1
A1[4:0]
I
5位地址输入信号,指定32个寄存器中的一个,将其中存储的数据读出到RD1
2
A2[4:0]
I
5位地址输入信号,指定32个寄存器中的一个,将其中存储的数据读出到RD2
3
A3[4:0]
I
5位地址输入信号,指定32个寄存器中的一个,将其作为RD的写入地址
4
WD[31:0]
I
32位写入数据
5
PC[31:0]
I
当前PC值
6
RD1[31:0]
O
A1指定寄存器的32位数据
7
RD2 ...
单周期CPU全自动测试思路(Logisim)
这是一篇针对计组P3的自动化测试学习
写在开头通过阅读本文,你可以了解到如何蒟蒻合理生成不会陷入死循环不会报错的指令,并了解到对logisim进行自动化测试的相关方法。
全自动测试的开端:设施准备要完成logisim的自动测试,需要使用到Logisim的命令行操作对输出进行重定向,所以我们需要.jar版的logisim来实现,该文件上网找找就有,我也已经上传至百度网盘,提取码:ozsw,需要的uu可以自取。
命令行学习logisim的命令行官方文档是有介绍的,感兴趣的可以去看看:这里我直接贴出有用的命令行,并对其做出解释,方便速通。1java -jar logisim-generic-2.7.1.jar CPU名称.circ -tty table > 输出.txt这句话的意思是运行该.circ文件并将顶层模块的输出全部进行输出,注意是顶层模块,子模块不会输出任何结果!意味着若你想得到你需要的数据,你就需要在主模块将其作为输出进行输出。对于一个xxxx.asm程序,我们需要通过命令行运行mars使其输出机器码文件:1java -jar Mars4_5.jar xxxx.asm ...
单周期CPU设计文档(Logisim)
Logisim 单周期CPU设计文档
CPU设计方案综述(一)总体设计概述
使用Logisim设计开发一个初步的单周期CPU,总体概述如下:
此CPU为32位CPU
此CPU为单周期
此CPU支持的指令集为:{add, sub, addu, subu, ori, lw, sw, beq, lui, nop, j}
nop的机器码为0x00000000
addu,subu不支持溢出
(二)关键模块定义
1.IFU
(1) 端口说明
表 1-IFU端口说明
序号
信号名称
方向
描述
1
CLK
I
时钟信号
2
RESET
I
异步复位信号,将PC值置为0x00000000 0:无效 1:复位
3
PCN[31:0]
I
PC的下一个值
4
Instr[31:0]
O
输出IM中将要执行的指令
5
PC[31:0]
O
输出当前PC值
(2) 功能定义
表 2-IFU功能定义
序号
功能
描述
1
复位
当RESET有效时,将PC值置为0x00000000
2
更新PC值
PC\<=NPC
3
输出指令
根据PC的 ...
状态机实验秒杀——模板化做题
这是一篇适用于P0,P1状态机的做题思路分享
写在开头在度过Pre通过的快乐或是不通过的悲伤之后,很快我们会迎来真正的考验,从P0开始一直到P1,我们将要面对的一个主要问题就是状态机,而状态机一般在P0中占据两题的位置,P1中占据三题的位置,所以我们可以说,状态机这一关过不去,我们的实验将止步于P0。但是,在笔者看来,状态机反而是最为简单,最为模板化的一类题,一旦掌握,则成竹在胸,很难出现意外。今天我们就来聊一聊状态机的是是非非。虽然笔者也极力反对这种刻板化做题的行为,但不得不说,对于状态机而言,一直用一直爽!
状态机基础知识Moore型状态机关键点:输出信号仅与当前状态相关
Mealy型状态机关键点:输出信号与当前状态及输入信号有关没错,做题只需要知道这么多,两句话两个图!
做题模板Logisim仔细观察笔者每一道题,细心的大家一定会发现,笔者的搭建完全按照状态机基础知识中的那两个图进行搭建,线多也只是因为笔者图方便,每一条线代表一位,而基础知识中的那几个图一条线代表很多位,经此而已,所以,搭建:输入-状态转移模块-寄存器-输出模块-输出的框架,这便是第一步。第 ...