-
新的ifu改动挺大的,又拜读了一遍,但有几个地方看不懂,向大佬请教一下: 2)false oversize 的问题:为啥ftb entry需要为最后的rvc br或jmp指令设置oversize信号,与普通的last rvc指令一样使用haslasthalf信号通知next fetchpacket的起始地址不行吗? 3)如果false hit导致fallthrouaddr超出startAddr+34byte范围,那么进入ifu的fetch req的fallthrouaddr修正为startAddr+32byte,而如果bpu预测顺序取next fetchpacket,即用超出startAddr+34byte范围的fallthrouaddr地址取next fetchpacket,ifu好像没有对错误此进行纠正? 4)如果false hit造成的f2_ftr_range比f2_jump_range小,那么ifu中有效指令范围中就没有jump指令,那么此fetchpacket之后应该顺序取next fetchpacket; 但是bpu预测的是jump,即bpu不是顺序取的next fetchpacket,此错误好像没有被ifu纠正? XiangShan/src/main/scala/xiangshan/frontend/IFU.scala Lines 260 to 262 in 856013d |
Beta Was this translation helpful? Give feedback.
Replies: 3 comments 6 replies
-
Discussions好像没有提醒,没留意到, @Lingrui98 @jinyue110 会回答这个问题 |
Beta Was this translation helpful? Give feedback.
-
您好,针对您的第二个问题,目前是对最后的rvi跳转指令设置oversize,在这一版开发初期,我们沿用了上一版的思路,为了避免行末后半条rvi跳转指令取不到的问题,采用了这个逻辑。后来发现这个逻辑其实是没有必要的,可以被简化,只是还没来得及做; |
Beta Was this translation helpful? Give feedback.
-
(。・∀・)ノ゙嗨,感谢您对香山项目的关注,针对您的问题:
Best Wishes! |
Beta Was this translation helpful? Give feedback.
(。・∀・)ノ゙嗨,感谢您对香山项目的关注,针对您的问题:
这个其实是时序的考虑,last half其实可以统一处理,可以规约为fallthrouAddr或者说这个packet的结束边界恰好卡在一条RVI指令中间。但这样处理的坏处在于,需要根据变动的fallthrouAddr去找到最后一条有效指令,然后再判断这个指令是不是半条RVI,predChecker里面做了很多检查,生成的fixedRange逻辑路径比较长,如果再加上这个找最后一条有效指令index的路径,那到终点f3_lastHalf.valid寄存器的时序就会违例。所以这里我们只处理每个packet里第16条指令发生last half的情况,因为这时候最后一条指令的index是常数,省掉了找index的路径。而对于那些提前结束的last half(即最后一条有效指令在16之前,并且卡在一条RVI中间)我们认为是false hit造成的,因为既然提前结束了说明一定做出了预测(e.g. packet里有两条不跳转的分支),而预测结果不对(错误地把结束地址放在了一条RVI指令中间),这时候的情况我们观察下来是少数,因此这种时候我们发redirect 刷掉重新取指令。
这个和我们的range独热码产生的逻辑有关,你可以看到在你贴出的代码的261行,我们计算一个packet的range独热码(每一位为1代表这个2Bytes在这个packet的范围内,为0表示在fallthrouAddr之后了)的算法是根据fallThrouAddr(这个是以前的命名,现在是nextStartAddr),计算出最后一条指令的inde…