MIPS微系统设计注意事项
这是一篇针对计组P8的一些注意事项
写在开头如果大家是以P8课下的身份来到这个,笔者首先恭喜大家来到P8,计组实验最终回。P8,是笔者认为debug de起来最痛苦的一个Project,没有之一。这是因为P8作为板级验证的Project,是最接近硬件的一个Project,而硬件Bug一般是难以定位的。
特别是ISE十分万恶,有些不可综合的语句不会给你做出相关警报,只会一声不吭的切割掉整个CPU,然后让你的CPU上板则寄,笔者被活活折磨了好几天
因此,笔者认为出一篇注意事项的博客是很有必要的,话不多说,Here We Go!
不可综合在Verilog中,有很多语句是不可综合的,我们在P8要避免出现这种情况。
注意事项(1)不使用initial。(2)不使用#10。(3)不使用循环次数不确定的循环语句,如forever、while等。(4)不使用用户自定义原语(UDP元件)。(5)尽量使用同步方式设计电路。(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。(7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 ...
中断支持流水线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,mtc0,mfc0,syscall}4.nop的机器码为0x00000005.该CPU支持对来自计数器和外部的中断进行处理6,该CPU支持对于部分异常进行处理,例如字不对齐,存取位置异常,溢出异常等
关键模块定义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
时钟信号
...
中断支持流水线CPU全自动测试思路(Verilog)
这是一篇针对计组P7的自动化测试学习
写在开头由于P7是P6的迭代开发,因此本次工作将主要体现在数据生成上,而且由于Mars的局限性,我们将编写两个测试程序(一个对拍Mars,一个对拍CPU),分别用于测试功能/异常和中断
命令行学习导出0x4180位置处的机器码1java -jar Mars.jar mc LargeText a dump 0x00004180-0x00006000 HexText handler.txt nc test.asm
在Mars中,我们是无法导出0x4180位置的机器码的,但我们可以通过命令行进行导出,上面的命令行就是以16进制导出test.asm中的0x4180-0x6000位置处的机器码,导出到handler.txt文件中。
限制Mars运行指令数1java -jar Mars.jar mc LargeText nc db lg ex me 65536 test.asm > mar.txt
在P7中,最起码对于笔者来说,是经常会将程序指引向一个死循环的,所以我们需要给Mars设置指令条数上限,这样Mars才能结束运行,否则将会一直运行。 ...
流水线设计与添加指令经验总结
这是一篇针对计组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 ...