理论教育 如何对齐CLA流水线:流水线的D2阶段中的CNDF标志测试

如何对齐CLA流水线:流水线的D2阶段中的CNDF标志测试

更新时间:2025-09-01 理论教育 版权反馈
【摘要】:多数CLA指令不需要特殊考虑的流水线。写接着读在两种CLA流水线下都是读发生在写之前。这种行为与28x CPU不同。CLA没有这种保护机制,而代码必须等待以完成读。CNDF标志在流水线的D2阶段测试。MBCNDD前的这三条指令可以改变MSTF标志,但是对MBCNDD指令是否分支没有影响。这三条指令要排除MSTOP、MDEBUGSTOP、MBCNDD、MCCNDD或MRCNDD指令。任何使用间接寻址的MAR0或MAR1的后增量将发生在流水线的D2阶段。紧跟装入指令的两条指令将使用MAR0或MAR1更新发生前的值。

多数CLA指令不需要特殊考虑的流水线。下面列出几种少数需要特殊考虑的操作。

(1)写接着读

在两种CLA流水线下都是读发生在写之前。即如果读紧跟在写之后,那么读将首先完成。在多数情况下这样并不会引起问题,因为一个存储器单元的内容并不依靠另一个单元的状态。对于写一个单元能影响另一个单元数值的外设,程序代码必须等待写完成后再进行读。这种行为与28x CPU不同。对于28x CPU,任何写跟着读同一个单元是受保护的,称之为写跟着读保护。这种保护自动停止流水线,写将在读之前完成。另外一些外设也受保护,这样28x CPU在帧内写单元总是在读该帧之前完成。CLA没有这种保护机制,而代码必须等待以完成读。

(2)延迟的条件指令:MBCNDD、MCCNDD和MRCNDD

参考下述例6-1,延迟的条件指令执行过程如下:

1)I1。I1是对分支、调用或返回指令影响的最近的指令。CNDF标志在流水线的D2阶段测试。即当MBCNDD,MCCNDD或MRCNDD在D2阶段做出决策而不管是否分支。

2)I2、I3和I4。MBCNDD前的这三条指令可以改变MSTF标志,但是对MBCNDD指令是否分支没有影响。这是因为标志修改发生在分支、调用或返回指令的D2阶段之后。这三条指令要排除MSTOP、MDEBUGSTOP、MBCNDD、MCCNDD或MRCNDD指令。

3)I5、I6和I7。分支、调用或返回后面三条指令总是被执行而不论条件是否为真。这些指令要排除MSTOP、MDEBUGSTOP、MBCNDD、MCCNDD或MRCNDD指令。

例6-1 MBCNDD、MCCNDD或MRCNDD代码片段。

<指令1>;I1对分支、调用或返回操作影响标志的上一条指令

<指令2>;I2不能停止、分支、调用或返回

<指令3>;I3不能停止、分支、调用或返回

<指令4>;I4不能停止、分支、调用或返回

<分支/调用/返回>;MBCNDD、MCCNDD或MRCNDD

;I5~I7:后面三条指令总是被执行而不论分支、调用或返回是否被拿走

<指令5>;I5不能停止、分支、调用或返回

<指令6>;I6不能停止、分支、调用或返回

<指令7>;I7不能停止、分支、调用或返回

<指令8>;I8

<指令9>;I9(https://www.daowen.com)

....

(3)停止或暂停一个任务:MSTOP和MDEBUGSTOP

MSTOP和MDEBUGSTOP指令不能放到分支、调用或返回指令(MBCNDD、MCCNDD或MRCNDD)之前或之后的三条指令的位置。参考例6-1。

为了单步通过一条分支、调用或返回指令,应在至少退后4条指令插入MDEBUGSTOP,并由此单步。

(4)装入MAR0或MAR1

装入辅助寄存器MAR0或MAR1将发生在流水线的执行阶段。任何使用间接寻址的MAR0或MAR1的后增量将发生在流水线的D2阶段。

参照下述例6-2,装入辅助寄存器有如下过程:

1)I1和I2。紧跟装入指令的两条指令将使用MAR0或MAR1更新发生前的值。

2)I3。辅助寄存器装入发生在执行阶段,而由于后增量寻址的更新发生在D2阶段。这样I3不能使用辅助寄存器,否则将会有冲突。在冲突的情况下,由于寻址模式后增量的更新将取胜,辅助寄存器不会更新为_X。

3)I4。从第4条指令开始MAR0或MAR将具有新值。

例6-2 装入MAR0或MAR1代码片段。

;假设MAR0为50而_X是20

MMOVI16MAR0,_X;用X(20)的地址装入MAR0

<指令1>;I1使用MAR0(50)的旧值

<指令2>;I2使用MAR0(50)的旧值

<指令3>;I3不能使用MAR0

<指令4>;I4使用MAR0(20)的新值

<指令5>;I5使用MAR0(20)的新值

....

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈