CQU 硬件综合设计

遇到问题

安装wsl ubuntu

没有开启虚拟化
输入指令后,重启电脑

bcdedit /set hypervisorlaunchtype auto
ubuntu安装依赖问题

ubuntu没有zlibc的包,zlibc在ubuntu中为zlib1g
image.png

开始进行

逻辑指令添加

image.png
image.png
删掉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的逻辑
image.png
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写错了

结果:
image.png

移位指令添加

修改maindec
控制信号:
image.png

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信号
取值修改

结果:
image.png

数据移动指令与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
image.png

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指令来控制
image.png

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
传出

调试:

错误:
image.png
符号扩展出错

答案

image.png
image.png

image.png

分支跳转

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

image.png
image.png

sram连接

第一条指令
2408ffff

001001_00000_01000_11111_11111_111111

00009021
000000_00000_00000 10010 00000 100001

13400003
000100 11010 00000 00000 00000 000011

成功截图
image.png

上板测试

image.png
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文件,这个答案就可以正常运行
错误的image.png

正确的
image.png

时间沿错误 连线错误 导致读取参考文件出错
image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值