【笔记】五级流水LA架构CPU设计学习笔记
这是我学习Loongsonedu CDE LAB的学习笔记,内容包括完成20条指令的debug以及完成一个五级流水LA架构CPU,是龙芯杯个人赛的前置学习。
2024.6.12
环境配置
这里我遇到了严重问题,上来第一个问题就是 PC
寄了,没法正常自增。检查发现是,配置好的ip核宽度少了一半变成16位,直接体现就是传进来的 inst_sram
z了一半,这显然写不下去。经过长达两个多小时的各种尝试,被wyc换了一个路径再重置了仿真之后成功解决,但是问题的原因仍然未知,因为原先路径的长度没有超限,也不存在非法字符。
修复debug_wb_rf_we
仿真时一眼就能看见debug_wb_rf_we
这个信号z了,按照有z调z原则先看这个。带有debug
前缀的信号意义是传出与标准信号进行比较,以判断你的core是否正确。检查该信号发现z的原因是该信号的assign语句中,信号名被篡改,末尾多个字母。想出这种bug的人是不是生活不如意
修复alu接口
接下来出错的指令是addi.w
,写回寄存器的结果有误。从alu的结果出问题开始倒推,检查alu的操作发现无误,再往回检查alu的实例化接口,发现alu_src1
和alu_src2
传入的参数都是alu_src2
,修复后成功解决。
修复bl
下一条出错指令是bl
,这条指令的作用是无条件跳转到目标地址处,同时将该指令的 PC
值加 4 的结果写入到 1 号通用寄存器 r1
中。对比标准信号,这条指令处标准信号没有发生写回(标准信号的写回使能遵循你传出的写使能),而bl
指令需要写寄存器,显然此时寄存器写使能应该为高电平,但是实际为低电平。检查通用寄存器写使能 gr_we(General Register Write Enable)
,发现置位时排除了bl
指令,删除了排除bl
指令的代码后成功修复。
2024.6.14
修复slli.w
这里首先发现alu的计算结果有误,检查两个操作数,发现操作数2有明显问题,操作数2的值是0x38
,也就是56,但slli.w
指令的操作数2为ui5
,即五位无符号立即数,56已经超过了5位无符号立即数的表示上限31。在我们的核中,所有的立即数被平行维护,指令只是根据需要选取对应立即数再看情况扩展一下就行,因此直接检查立即数的维护,发现压根没实现ui5
,于是添加ui5
实现。 添加了ui5
之后alu结果还是有误,检查alu操作,发现是操作数1和2位置写反了。牛的。修改后bug成功修复。
修复 or
or
指令的调用流程没有问题,但是答案有误,于是检查alu,发现计算中除了俩操作数取或以外还莫名其妙或了一个alu_result
,删除后成功修复。