Design techniques for “soft” single-core embedded processors with predictable behaviour and high levels of performance