Hi, Max. Believe it or not, I had written my own simulator around 1970. The original was written in IBM General Purpose Simulation System, then PL1, then C, C+, C++, C#. It could simulate asynchronous logic, set/reset latches, and edge triggered flip flops. It was really aimed at control/Boolean logic so the input was Boolean expressions rather than HDL. This brings me to another of your topics, "Are we all in synch?". The Mueller(?) Method of hand shaking
"I have something for you / OK I grabbed it" seems quite logical except the skew among bits on a bus may corrupt the transfer. If we go back to the arbiter design where circuit metastability was first observed, It seemed simple: requests were prioritized so the highest active priority would see the grant. But if a higher priority request arrived just as a lower was being serviced, the lower grant would be shut off, but there would be enough signal to start both operations. Oh, the good old days when you could scope the signals.