文章

【笔记】五级流水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_src1alu_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,删除后成功修复。

修复 srl

本文由作者按照 CC BY 4.0 进行授权

© sazikk. 保留部分权利。

Total views. 您是第个访问者

本站采用 Jekyll 主题 Chirpy