【CO】P5课上总结
P5第一次上机出了一些很不好的问题,归根到底还是准备不充分吧。趁这个机会把P5课上总结一下,指导一下两天后的第二次上机。
P5课上总结
P5课上添加的指令可以分为计算类指令,分支跳转类指令,访存类指令。下面分别分析并总结一些方法。
计算类指令
计算类指令较为容易,对ALU进行修改即可。然后在ALU中自上而下对不同的信号添加新指令。
分支跳转类指令
分支跳转类指令进一步可以根据链接方式分为条件链接、无条件链接和无链接。分支跳转部分其实也存在条件的问题,一般来说,分支指令都是有条件的,跳转指令不需要条件(分支条件和链接条件往往是相同的,即如果分支则发生一种行为,否则进行另一种行为)。分支跳转部分可以在D级完成,对于条件的判断对CMP模块进行扩展即可。问题的关键在于链接方式。下面分开来具体分析。
无链接
这种指令当然十分简单,和beq、j没什么区别,对CTRL,NPC进行修改即可。
无条件链接
无条件链接比如jal,如果是分支指令的话,则是有条件分支,无条件链接。这个时候由于对寄存器有写操作,会涉及转发和阻塞的问题。在CTRL里要记得在A那里指定写入的目标寄存器(应该是RA吧,不过如果是rt或者rd也无妨),在jump_and_link那里记得加上该新指令,以便于转发的判断。这种无条件链接不需要在流水中传递额外的信号,和jal基本上一样。
有条件链接
这种指令需要特别注意。是否分支(和是否链接)在D级完成判断,这时注意!!!
第一,一定要把是否链接的判断信号流水下去,因为是否链接会影响到CTRL中对新指令写入寄存器(A)的判断和是否链接(jump_and_link)以及各种其他信号的判断,并且在CTRL中一定要是新指令&&链接条件成立
这样去添加新指令,这样才能把两种情况分开。对于一般信号,AT信号,jump_and_link都是如此,所以要在流水线寄存器中从D级开始流水链接信号,同时CTRL增加端口接收链接信号。分支信号不需要传入流水线和CTRL,因为其在D级作用于NPC即可,只需要对NPC接收信号的端口和内部适当修改。
第二,对于清空延迟槽的操作,实现的操作是清空FD寄存器,清空延迟槽信号的产生一定要判断此时是否阻塞,因为如果阻塞,那么对于是否清空延迟槽这一行为的判断信号是不准确的,如果此时清空,那么会误删延迟槽。所以,清空延迟槽时一定要判断此时是否阻塞。FD寄存器的清空信号在数据通路中产生即可(判断npc_op,stall和清空延迟槽对应的条件(CMP中产生))。
访存类指令
相比于一般的lw和sw,课上添加的访存指令可能存在这样的情况:存入寄存器时有条件判断到底存入哪个寄存器,这种情况下我们只能在新指令到达W级时才能知道到底写入哪个寄存器。所以新指令在E、M时的阻塞条件我们都无法判断,一种思路是暴力阻塞,即只要E、M级的指令是新指令就阻塞,这样大概率会超时。不超时的思路是,在新指令在E、M级时,同时判断D级的指令是否需要新指令可能写入的寄存器的数据,如果需要那么阻塞。这里在对stall进行改写时,最好和原来的AT法隔离开来,另写一个判断然后再或上去得到要输出的stall,这样不会干扰其他指令通过AT法实现的stall的判断。
此外还为npc和ext预留了一位信号,防止上机现加产生遗漏。
希望两天后上机顺利吧
虽然第三题条件访存被卡了一个点,两题万岁吧。