On Bus Arbitration on the Unibus and QBUS (2017)
froghouse.org
froghouse.org
At face value, this:
always @(posedge RDMGI, posedge RINIT, posedge cycle_finished) begin
...
assign TDMGO = RDMGI & ~won_arbitration;
...was just asking for metastability in that it transformed the subcircuit into a clock domain crossing problem. Recognizing this, it makes sense that the sol'n[1] was to dual flop synchronize the async RDMGI input.[1] http://www.froghouse.org/~dab/papers/bus-arbitration/grant4....
Two flip-flops in series is almost always enough to resolve the uncertainty.
However, I'm extremely skeptical of all the "metastability" fixes applied here. You only care about synchronizers when you change between unrelated clock domains.
Yes, the PDP-11 is before the advent of widespread knowledge about metastability. However, open-collector busses were not unusual at the time. Glitches were also understood. You set your logic transitions to cross boxes of your Karnaugh map correctly to avoid them. None of the given circuits seem to fix that at first glance, but I'd need to look at it in more detail.
I suspect the issue is that he is using flops instead of latches. Latches are level sensitive while flops are edge sensitive.
A lot of open-collector arbitration is more of something gets yanked down, you see something got yanked down so you also yank something down (this need to happen fast and is in hardware), then you release something if you don't have anything to say (this can happen slowly in software since you already yanked things and locked it), after everybody but one releases the bus arbitration is over and the winner can now proceed to use the bus.
I ask with an inpert mindset recognizing who you are.
http://bitsavers.org/pdf/dec/_Books/Bell-ComputerEngineering...
Disclosure: I have a couple cupboards full of Unibus and QBUS boards.
And if you want to clear out that cupboard, do let me know. :-)