1. A method of simulating communication between devices, the method comprising: at a hardware simulator: receiving, at a simulated device interface, a host request that represents a command from a host device for accessing a state register of a simulated device that is connected to the simulated device interface; distributing the host request to a device endpoint of the simulated device interface; generating, by simulating an operation of the simulated device, a device request for accessing the state register of the simulated device; removing the host request from the device endpoint, wherein the receiving, generating, and removing are performed iteratively by concurrent threads; determining a first time at which the device request is generated, and a second time at which the host request is removed from the device endpoint; interleaving the host request and the device request into a merged sequence of requests such that, when the first time is earlier than the second time, the device request has priority over the host request; and executing requests of the merged sequence of requests in an order in which the requests occur in the merged sequence of requests, wherein the requests include instructions for accessing state data stored by the state register.