# SoC Laboratory Assignment W7 #### a) The example shows RAW dependency. Explain the software and hardware techniques to solve the problem. ``` I0: LDR X1, [X2] I1: ADD X1, X1, X3 // X1 RAW I2: LDR X3, X2, #4 I3: SUB X2, X3, #1 // X3 RAW ``` Software technique: compiler inserting NOP Hardware techniques: dynamic pipeline, instruction reordering, data forwarding --- #### b) Identify the load-to-use harzards? And reorder the instruction to eliminate it. Original order: ``` I0: LW R1, b I1: LW R2, e I2: ADD R3, R1, R2 // R2 load-to-use I3: SW R3, a I4: LW R4, f I5: ADD R5, R1, R4 // R4 load-to-use I6: SW R5, c ``` After reorder: ``` I0: LW R1, b I1: LW R2, e I4: LW R4, f // program I4 first I2: ADD R3, R1, R2 // R2 from I1 WB forwarding I3: SW R3, a I5: ADD R5, R1, R4 // no load-to-use I6: SW R5, c ``` --- #### c) Identify RAW, WAW, WAR dependency. Use Register renaming to eliminate WAW, WAR dependency ##### RAW: * I0 & I1 r1 * I1 & I2 r3 * I2 & I3 r1 * I1 & I3 r3 ##### WAW: * I0 & I2 r1 ##### WAR: * I1 & I2 r1 * I0 & I3 r2 * I1 & I3 r2 * I2 & I3 r2 * I1 & I3 r3 <table> <thead> <tr> <th>Instructions</th> <th colspan=3>Map table</th> </tr> </thead> <tbody> <tr> <td></td> <td>r1</td> <td>r2</td> <td>r3</td> </tr> <tr> <td></td> <td>11</td> <td>12</td> <td>13</td> </tr> <tr> <td>I0: add r1, r2, r3</td> <td>11</td> <td>12</td> <td>13</td> </tr> <tr> <td>I1: sub r3, r2, r1</td> <td>11</td> <td>12</td> <td>14</td> </tr> <tr> <td>I2: mul r1, r2, r3</td> <td>15</td> <td>12</td> <td>14</td> </tr> <tr> <td>I3: div r2, r1, r3</td> <td>15</td> <td>16</td> <td>14</td> </tr> </tbody> </table> | Original instructions | Renamed Instructions | |-----------------------|---------------------| | add r1, r2, r3 | add pr11, pr12, pr13 | | sub r3, r2, r1 | sub pr14, pr12, pr11 | | mul r1, r2, r3 | mul pr15, pr12, pr14 | | div r2, r1, r3 | div pr16, pr15, pr14 |