Structural Hazard: Cannot proceed with an operation because a resource is in use. To overcome hazards we must use shedulling and arbitration:
One scheduling decision impacts on another: ideally need to find a global optimum.
The scheduling and arbitration operations can often be done at compile-time, (e.g. for operations performed by a single behavioural thread).
Remainder must be done at run-time according to actual input data since some operations may be vari-length and the relative interleaving of different threads is often unpredictable.