《超标量处理器设计》- 执行

《超标量处理器设计》- 执行 旁路网路需要旁路网络的原因比如两条指令RAW最保守的方式是前面一条指令 FU 计算完成后dst 写回了PRF然后后面一条指令 是如此idx再去读PRF费时影响pipelie效率所以需要旁路电路从前一个指令计算出结果的时候就fwd到新指令的入口。简单设计的旁路网络左边图没有旁路网络的时候所有的寄存器的值从PRF来。右边那个比如FU0的值可以从PRF来也可以从上一次FU0自己算出来的值来还可以从FU1的计算的结果来。旁路电路冲突的解决产生conflict的原因如下图如果一个FU中有几个计算模块比如第一个FU可以同时执行Add和shiftadd latency2,shift latency1则下下张图的时序有可能出现add和shift的运算同时算出来都需要fwdforward这就出现了旁路电路fwd的冲突解决旁路电路conflict方式根据是否进行推测有两种方案前提我们知道指令的执行latency推测假设所有的都不会出现conflict当要开始执行的时候再检查是否会和同FU的其他指令产生conflitc如果产生conflict就放回issue queue.不推测在选择指令的时候就算好如果会和前面的指令发生conflict这个周期就不把指令送到FU复杂设计的旁路网络复杂电路引起增加流水级数在现实的处理器里FU比较多布线复杂从PRF读的数据需要很长的传输才能到达FU的数据端而且数据来源不止从PRF来有可能还要做mux所以把这个阶段单拿一个周期叫source drive。如果没有这个阶段复杂的准备工作和冒险处理将和执行阶段抢时间导致cycle拉长。同理计算的数据到写入PRF也要很长的时间所以单拎出来一个周期 result drive增加流水级数引起旁路电路的复杂度快速提升指令在result drive和write back阶段可以发起forward在source drive阶段和execute阶段可以接收forward,导致forward的组合急剧增多简化旁路电路采取的方式clustercluster bypass把不同的FU放在不同的cluster中一个cluster放1FU同cluster内的FU之间可以快速forward,没有source drive和result drive的环节不同的cluster之间数据如果有依赖只能通过读取PRF的方式获取存储器指令的加速影响存储指令速度的原因1. load/store指令之间也会出现和寄存器类似的WAW/WAR/RAW hazard解决hazard的方式完全顺序执行缺点存储的速度慢优点可靠部分乱序执行store和store之间保持顺序两个store之间的load可以乱序当指令A被select的时候就可以wake up 指令B/C/D,当B/C/D的地址算出来的时候A的已经算出来了因此B/C/D 可以和A比较是否发生地址冲突如果不发生load就可以发出去如果发生load就可以等到store的回来直接用store的数据。指令B/C/D并不阻塞下一条store 指令E因为对于AXI来说是不同的channel而且即使指令A没有AXI的bresp回来指令E也可以发出去但是指令F/G检查冲突的时候要不仅要和指令E做地址比较也要和指令A做地址比较。那么哪些load指令需要和前一个store做比较哪些需要和前前…个store指令做比较这就需要记录load和store 之间的顺序可以用ROB来做辅助标记。所有的store的指令相关的数据都放在store buffer里如果load有匹配的上的就去store buffer取数据就不向AXI去read了。完全乱序执行只要load的操作数准备好了就发送2.数据放在不同层级cache中取数据慢解决方式D-cache缺失的时候处理器继续执行后面的load/store使用非阻塞的fetch方式3.一次取的cacheline数据多采用关键字优先来解决4.通过提前触发预取