遇到问题
安装wsl ubuntu
没有开启虚拟化
输入指令后,重启电脑
bcdedit /set hypervisorlaunchtype auto
ubuntu安装依赖问题
ubuntu没有zlibc的包,zlibc在ubuntu中为zlib1g
开始进行
逻辑指令添加
删掉aluop,直接用funct得出alucontrol
删掉maindec的产生aluop的逻辑
maindec修改controls的位数
controller删掉aluop的变量
aludec删掉aluop的输入
aludec增加op (31 - 26)的输入
扩充alucontrol
alucontrol扩充为五位
修改aludev的逻辑
对opD进行分类
为 R_TYPE:
考虑funct
修改alu逻辑
修改SignExtern的逻辑
将opD 31 - 26 接入
根据opD的值扩展
修改maindec的逻辑
memtoreg = 0 说明来自alu
assign {regwrite,regdst,alusrc,branch,memwrite,memtoreg,jump} = controls;
`ANDI: controls <= 7'b1010000;
`XORI: controls <= 7'b1010000;
`LUI: controls <= 7'b1010000;
`ORI: controls <= 7'b1010000;
记录错误;
floprc的位数没有改,导致stallD和stallF为X或Z等其他错误
检查:
2023/12/28:
XORI指令出现错误
原因:mainde写错了
结果:
移位指令添加
修改maindec
控制信号:
assign {regwrite,regdst,alusrc,branch,memwrite,memtoreg,jump} = controls;
不需要改变,都是R-TYPE的控制信号
修改aludec:
添加R-TYPR情况下的funct
修改alu:
将sa加入alu:
从saD 到 saE
将saE加入alu
声明saD和saE变量
为saD赋值
选择floprc传递
添加对应的alucontrol信号
取值修改
结果:
数据移动指令与HILO寄存器
添加HILO寄存器部分
funct:传入instrE的 5 - 0
A3 选择写入的寄存器
01:lo
11:hi
其他:不修改
Hiout:输出
Loout: 输出
HiIn:输入
HiIn:输入
添加控制信号
WriteHLD:写回寄存器的选择,接到A3
读取hilo 写入通用寄存器
修改mips
添加WriteHLD,传入controller 和 datapath
修改datapath
添加输入 WriteHLD
添加WriteHLE,hi_i,lo_i, hi_oD,lo_oD
添加模块hilo_reg
添加hi_oE, lo_oE
添加floprc(32)
修改controller
添加输出 WriteHLD 传入maindec
修改maindec
增加输入 funct
assign {regwrite,regdst,alusrc,branch,memwrite,memtoreg,jump,WriteHLD} = controls;
// WriteHLD
// 01:lo
// 11:hi
// 其他:不修改
`MFHI: controls <= 9'b110000000;
`MFLO: controls <= 9'b110000000;
`MTHI: controls <= 9'b000000010;
`MTLO: controls <= 9'b000000001;
添加输出WriteHLD,修改control的位数
添加MF和MT指令,赋值control位数
修改aludec
添加MF的alucontrol
修改alu
添加输出:
HiLoOutE
添加MF对应alucontrol的计算 直接赋值
错误修正:
maindec的case位置放错了,应该放在R-TYPE的里面
结果:
![XS
9
9
9XYP06HCH)2BLJU`CH.png
算数指令添加
add 和 sub
maindec
assign {regwrite,regdst,alusrc,branch,memwrite,memtoreg,jump,WriteHLD} = controls;
add :110000000
sub :110000000
addu:110000000
subu:110000000
slt: 110000000
sltu: 110000000
addi:101000000
addiu:101000000
slti:101000000
sltiu:101000000
aludec的修改
I-TYPE指令都用R-TYPE指令来控制
signImm也要改
乘除法指令
修改Hilo寄存器
// WriteHLD
// 01:lo
// 10:hi
// 11: 两个都修改
// 00:不修改
maindec
assign {regwrite,regdst,alusrc,branch,memwrite,memtoreg,jump,WriteHLD} = controls;
`MULT: controls <= 9'b000000011;
`MULTU: controls <= 9'b000000011;
`DIV: controls <= 9'b000000011;
`DIVU: controls <= 9'b000000011;
aludec
alu
多传入两个output
除法:
引入除法模块
修改maindec
修改hiloreg
修改aludec
修改harzard
传入
alucontrolE
div_ready
声明
stall_divE
传出
stallE
修改flopenrc、
增加stallE
修改controller
传出
调试:
错误:
符号扩展出错
答案
分支跳转
branch
maindec
增加对应指令的控制信号
新增模块 eqcmp
传入 rs rt rd funct op
Jump指令
改controller
改maindec
传出 jump,jal,jr,jalr
jump 和 jal
跳转是在D阶段就跳转了,但是写回是在W阶段
主要修改mem阶段,在mem阶段加一个jumpM
调试
数据冒险·
branch的冒险和jr的冒险
![28BSM45(R_65V6IMS9C2)K.png
jal 0x40
0c000010
000011_00000_00000_00000_00000_010000
访存指令:
maindec
aludec
sign extend
测试
a0030003
101000_00000_00011_0000 0000 0000 0011
sram连接
第一条指令
2408ffff
001001_00000_01000_11111_11111_111111
00009021
000000_00000_00000 10010 00000 100001
13400003
000100 11010 00000 00000 00000 000011
成功截图
上板测试
always块内有
重复写了一个r22E,内容和r6E重复
吐槽
这个定义文件defines2是认真的吗,感觉束缚了很多东西
J和branch的单元测试的指令
10000004
000100_00000_00000_0000_0000_0000_0100
000001_00000_10001_00000_00000_001010
bal 是 bgezal
0421fff7
000001_00001_00001_11111_11111_110111
42000018
010000 10000 00000 00000 00000 011000
ac85418b
101011 00100 00101 01000 00110 001011
8c824188
100011 00100 00010 01000 00110 001000
a10febaf
10100001000011111110101110101111
10011001010011000000001010000000
401a7000
010000 00000 11010 01110 00000 000000
助教 重新开了一个 但是也跑不起来
文件路径没问题,trace_reg不为0,可以正常打开文件
但是就是无法读取文件的内容
我这边拿之前的答案跑了一遍,相同的verilog版本 相同的trace文件,这个答案就可以正常运行
错误的
正确的
时间沿错误 连线错误 导致读取参考文件出错