Abstracting the hardware-software interface is more tricky, since the simulator does not control the software the same way it controls the hardware. However, since the device accuracy is defined relative to the driver software that accesses it, there are quite a few things that can be done once the driver and the usage pattern is known.
The obvious thing to do is to abstract away all parts of the interface that are never accessed by the driver. Control registers not used by the driver, states that are never entered, and behaviors that are never triggered can well be left unimplemented. For debugging reasons one should make sure to indicate to the user whenever accesses to unimplemented parts of the model occur. See section 9.3 for more on error reporting and user interface issues.
Another area where the hardware-software interface can be abstracted is timing. This is covered in more detail in section 7.
6.1 Fewer States
6.2 Avoid Modeling Error States
6.3 Approximate Performance Counters and Hardwire Diagnostics