ADDITIONAL ASSUMPTIONS A. In case of data dependency, the dependent instruction is stalled in the read stage until all its sources are ready (updated). All instructions that entered after it in the pipeline are also stalled in their proper stages. Meanwhile NOP instructions are delivered to the execution stage to fill the bubble. B. In case of a jump (either unconditional or conditional whose condition is evaluated true) all instructions that entered the pipeline after the jump instruction are anulled (changed to NOP), including the instruction that is sampled right when the PC is updated to its jump target value. The next instruction will be fetched from the target address. C. Assume a simple execution unit, with one clock latency, that treats floating point arithmetic instructions as integer arithmetic instructions. The main goal now is to set up a functional pipeline, not to design the execution block. ------------- PIPELINE STEP BY STEP DESIGN 1. Design each pipeline stage in a separate module, without data dependency control. Test the pipeline flow for a couple of independent instructions (without data or control dependencies). 2. Provide a separate module for data dependency control. Test the pipeline flow for a couple of data dependent instructions. Start with a program that has only 1 data dependency. Then with a program with 2 data dependency. Progress from simple to complex programs. 3 Design a sublock of the execution stage that deals with jump instructions. Modify the fetch stage so that its PC can be updated from the execution stage if a jump is required. Test the pipeline with a couple of instructions that has one unconditional jump between them. Then test for a couple of instructions that has one conditional jump between them. Repeat the test for opposite condition values. 4. Test with mixed control and data dependencies.