第十一讲流水线操作技术一、流水线操作二、延迟分支转移的流水线图三、条件招待指令的流水线图:四、双寻址存储器的流水线冲突五、流水线的冲突问题一、流水线操作:1)C54x采用6级流水线,可同时处理6条指令的6个不同阶段2)一条k级流水线能在k+(n-1)个机器周期内处理n条指令,非流水线处理n条指令需kn个机器周期。P(预取指)F(取指)D(译码)A(寻址)R(读数)X(执行)预取指级:用PC的内容加载PAB(1个机器周期)取指级:用读取到的指令字加载PB(1个机器周期)译码级:PB上的内容加载指令寄存器(IR),并对IR内的指令进行译码,产生招待指令所需的一系列控制信号(1个机器周期)寻址级:根据译码结果,在需要的情况下将数据1读地址加载DAB、将数据2读地址加载CAB,修正辅助寄存器和堆栈指针(1个机器周期)读数级:将读数据1加载DB、读数据2加载CB,如果需要,用数据3读地址加载EAB,以便在流水线的最后一级将数据送到数据存储空间(1个机器周期)执行级:招待指令,或用写数据加载EB(1个机器周期)指令字、单字指令、双字指令、多字指令:指令字:表征指令的二进制代码,由操作码和操作数组成单字指令:由16位二进制代码表示的指令(1个字)双字指令:由32位二进制代码表示的指令(2个字)多字指令:由n*16位二进制代码表示的指令(n个字)说明:1)执行一条单字指令至少需要1个指令周期(6个机器周期)2)执行一条双字至少指令需要2个指令周期3)程序执行时只能依次取出一个指令字,不能同时取出两个指令字1)一般在一条指令中操作码占8位,其余为操作数位2)若操作数不超过8位则为单字指令,否则为双字指令或多字指令3)立即数寻址为单字(立即数为3、5、8位),双字(9、16位)4)绝对地址寻址为双字指令5)累加器寻址为单字(*ARx)或双字(#lk)指令6)直接寻址为单字指令7)间接寻址为单字指令9)存储器映象寄存器寻址为单字指令10)堆栈寻址为单字指令双操作数间接寻址的指令格式:单字指令1个机器周期1个指令周期机器周期、指令周期、基于流水线的存储器访问:二、延迟分支转移的流水线图:知道要转移得到转移的地址将要转移的地址加载PAB取出要转移的地址完成转移执行转移只需2个周期实现转移浪费2个周期开始执行转移实际使用4个周期1)被冲洗掉的两个单周期指令并不占用转移后指令的执行阶段,它们刚好是在各级错开的。2)在6级流水线中执行双字分支转移转移指令必须要4个机器(即4个指令周期)周期才能完成,在满流水线中执行相当于只占用2个指令周期(机器周期),另外2个周期可用于完成两条单周期指令或一条双周期指令的执行。3)采用延迟分支转移指令可利用转移指令后的两个周期,即在延迟分支转移指令后安排两条单周期或一条双周期指令,该指令不能是分支或重复指令。4)具有延迟操作功能的指令有:BDFBDBACCDFBACCDBANZDCALLDCALLDFCALLDFCALLDRETDFRETDRETEDFRETEDRETFDFRETDCCDRCD例3-9在完成R=(x+y)*z操作后转移至nextr的程序段有两种编写方式:利用普通分支转移指令BLD@x,AADD@y,ASTLA,@sLD@s,TMPY@z,ASTLA,@RBnext共8个指令字,10个指令周期利用延迟分支转移指令BDLD@x,AADD@y,ASTLA,@sLD@s,TBDnextMPY@z,ASTLA,@R共8个指令字,8个指令周期利用普通分支转移指令BLD@x,AADD@y,ASTLA,@sLD@s,TMPY@z,ASTLA,@RBnext共8个指令字,10个指令周期LD@x,AADD@y,ASTLA,@sLD@s,TMPY@z,ASTLA,@RBnext完成转移123456789101112131415LD@x,AADD@y,ASTLA,@sLD@s,TMPY@z,ASTLA,@RBDnext完成转移123456789101112131415利用延迟分支转移指令BDLD@x,AADD@y,ASTLA,@sLD@s,TBDnextMPY@z,ASTLA,@R共8个指令字,8个指令周期三、条件招待指令的流水线图:条件招待指令:XCn,cond[,cond,[,cond]]求解条件决定后面指令是否执行1)条件执行指令是一条单字单周期指令,比条件跳转指令快。2)条件在XC指令进入执行阶段的前两个周期已经求解出来,如果在这之后到执行前改变条件(如发生中断),将会造成无法预期的结果,所以要尽国避免在XC指令执行前两个周期改变所规定的条件。四、双寻址存储器的流水线冲突:1。C54x片内的双寻址存储器(DARAM)分成若干独立的存储器块,允许CPU在单个周期内对其进行两次访问,包括三种情况:1)在单周期内允许同时访问DARAM的不同块,不会带来时序上的冲突;2)当流水线中的一条指令访问某一存储器块时,允许流水线中处于同一级的另一条指令访问另一存储器块,不会带来时序上的冲突;3)允许处于流水线不同级上的两条指令同时访问同一个存储器块,不会带来时序上的冲突。2。CPU能够在单周期内对DARAM进行两次访问,是利用一次访问中对前、后半个周期分时进行的缘故,具体为:对PAB/PB取指利用前半周期对DAB/DB读取第一个数据利用前半周期对CAB/CB读取每二个数据利用后半周期对EAB/EB将数据写存储器利用后半周期3)如果CPU同时访问DARAM的同存储器块时就会发生时序上的冲突:1)同时从同一存储器块取指和取操作数(都有在前半个周期)2)同时对同存储器块进行写操作和读第二个操作数(都在后半个周期)上述两种冲突CPU将通过自动插入一个空闲周期或将写操作延迟一个周期的办法解决。Dual-AccessMemoryandthePipelineDARAMBlocksHalf-CycleAccessestoDual-AccessMemory读*AR2五、流水线的冲突问题:1。冲突存在方面:1)同时访问同一存储器空间的冲突;2)读、写同一存储器单元在时序上的颠倒,导致读数错误。2。对流水线冲突的解决方法:1)插入等待周期(人工插入、编译时自动插入)自动插入只能解决明显的同时访存冲突隐含的时序错乱只能人工插入2)编程序时全理安排指令的先后顺序3)用C语言编写程序4)对其内容不经常变动的存储器映象寄存器早安排初始化的写操作5)利用等待周期插入所需的等待周期五、解决流水线冲突的例子:1。采用保护性写操作解决流水线冲突STMA,AR1LD*AR1,BWN写到AR1将AR1中数据放DAB时序错乱,AR1中内容还没有来得及改变STM#lk,AR1LD*AR1,BW#lkN保护性写操作,立即译码后马上写到AR1,(写提前一周期)双字指令隐含周期采用保护性写操作使写AR1提前一周期,改用双字指令插入一隐含周期,则读AR1延迟一周期,结果W比N早一周期2。通过插入NOP解决流水线冲突:STLMA,AR0W#10WWSTM#10,AR1LD*AR1,B双字指令单字指令单字指令自动插入等待周期解决N写AR1读AR1放DAB存在时序错乱问题STLMA,AR0STM#10,AR1NOPLD*AR1,BWWN通过插入一空操作使读AR1延迟一周期,在写AR1之后3。用等待周期表解决流水线冲突问题:根据指令特点查等待周期表得到所需插入的空操作个数自已看书