RAM ports, ALUs, non fully-pipelined components and other shared resources can cause Structural Hazards. Structural Hazard: Cannot proceed with an operation because a resource is in use. To overcome hazards we must use shedulling and arbitration:
One schedulling decision impacts on another: ideally need global optimum.
Often schedulling can 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. Relative interleaving of different threads is often unpredictable.