- 博客(6)
- 收藏
- 关注
原创 CPU设计实战:Loongarch版 实践任务11:转移指令和访存指令添加
同上一节一样,在ID阶段添加译码指令并将相关判断加入,这些指令与之前的无非就是位宽的不同,将相关ram的enable设置一下即可,完全可以复用ld.w,st.w指令的设计实现,而转移指令也一样,复用之前的即可,只不过判断逻辑不同。
2025-01-11 20:53:13
279
原创 CPU设计实战:Loongarch版 实践任务10:算术逻辑运算指令和乘除法运算指令添加
而我认为在其中需要注意的是乘除法指令,要考虑有无符号的运算。而实现乘除法可以选择调用xilinx的ip核,也可以选择自己手搓一个乘法器和除法器,而我为了简单,就使用了调用ip,对于7系列的FPGA,目前vivado实现“*‘运算符会默认采用DSP48器件,几乎不消耗LUT资源,具有单周期延迟,输入数据之后当拍就能输出结果,而为了处理32位的有无符号乘法,可以选择例化2个乘法器ip,也可以将32位有无符号乘法转换为33位有符号乘法,方法是将32位有无符号数扩展为33位有符号数,再相乘。
2025-01-11 20:47:30
398
原创 CPU设计实战:Loongarch版 实践任务9:前递技术解决相关引发的冲突
继续分析前面所举的例子,可以发现第2条指令位于译码阶段的时候,虽然它所需要的第1条指令的结果还不在寄存器中,但是这个值已经在流水线的执行阶段计算出来了,那么何必非要等着这个值沿着流水线一级一级送下去写入寄存器后再从寄存器中读出呢?ADDU r4,r3,r2”,当LW处于执行级的时候,ADDU处于译码级,那么下一拍显然ADDU不能到达执行级,只有当LW通过访存级到译码级的数据通路之后ADDU才可以到达执行级。为了支持前递,加入了从执行级、访存级到译码级的数据通路,并使用寄存器相关判断逻辑来控制如何前递。
2024-06-11 16:41:56
1716
5
原创 CPU设计实战:Loongarch版 实践任务8:阻塞技术解决相关引发的冲突
这是因为如果第2条指令要使用第1条指令写回到寄存器的结果,就必须保证第2条指令读取寄存器的时候第1条指令的结果已经写回到寄存器中了,而现有的5级流水线结构如果不加控制,第2条指令就会在第1条指令写回寄存器之前读取寄存器,从而引发数据错误。并且有一个细节:保证被比较的两个寄存器号都是有效的,这体现在三个方面:1.参与比较的指令到底有没有寄存器的源操作数或者目的操作数,2.如果寄存器号为0,那么也不用进行比较,因为0号寄存器的值恒为0,3.用来比较的流水级上到底有没有指令,如果没有指令那么比较毫无意义。
2024-06-05 13:25:42
3678
3
原创 CPU设计实战:Loongarch版 lab7:不考虑相关冲突处理的简单流水线CPU
我认为在了解了怎么将单周期分割成流水线之后最主要就是要细心了,将mycpu分成5个module之后,有时候会出现丢掉几个赋值语句(在ctrl+C和ctrl+V时)或者是数据位宽的问题,比如我就忘掉了数据ram的使能信号和读出数据的赋值,导致我卡了很久,而且在复制的时候我认为要给不同阶段之间传递的需要保持的信号附上不同的名字,这样就可以知道是哪个阶段出了问题。不过最终也是解决了问题,通过测试。我在一开始将每个需要传递到下一个阶段的信号都写在输入输出那里,发现这在我后面连线时会变得异常麻烦,参考了。
2024-06-02 12:50:35
3670
2
原创 CPU设计实战:Loongarch版 lab6--20条指令单周期CPU
这个debug卡我时间最长的就是通用寄存器的写使能信号,当时一直没找到,甚至把golden—trace生成了一遍又一遍,对照test,检查了各种,卡了很长时间,我都以为是我之前哪一步搞错了,或者环境什么的,但是一步步做下来并没有,并且“机器永远是对的”让我终于查到了错。debug到一半才想起来写个博客,就不写过程了,下个lab再写过程。下面是两个模块的代码,运行已通过仿真验证。其他的bug就还好,如果认真跟着。就能马上找出来,,上面的每一句话都很重要。走,按逻辑检查并且查。
2024-05-27 19:51:54
3967
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人