While a domain sits in reset, its outputs sit at their reset values, and those values travel into neighbours that may already be running. A neighbour can easily mistake a reset value for live data: a zeroed data bus looks like a valid word of zeros, and a deasserted handshake looks like an idle link inviting the next transfer.
Isolation puts a gate on each output of a domain held in reset, clamping it to a chosen safe value while the domain is down. The safe value is the one the neighbour already treats as idle: valid low, request low, data held or forced to a value the neighbour ignores while valid is low.
// snippet
// Clamp each output to its idle value while the neighbour-facing
// isolate signal is asserted. The control comes from a live domain.
assign out_valid isolated_out_valid & ~isolate;
assign out_req = isolated_out_req & ~isolate;Assert isolation before the domain resets, and release it only after the domain has left reset and reached its idle state.
Drive the isolate control from logic that is not itself being reset; an isolate signal generated inside the isolated block defeats the purpose.
Choose safe values per signal with the neighbour's protocol in mind: clamping valid low is the usual case, and data buses need no clamp once they are qualified by a clamped valid.
Pair isolation with protocol tolerance where transfers can be interrupted mid-flight: isolation fixes the levels, the protocol rules fix the interrupted exchange.
A stream of valid zero words that were never sent. Clamp valid low while the domain is isolated so the neighbour treats the bus as idle, regardless of the data values.
Because logic inside that domain is itself in reset and cannot be trusted to assert or hold the control. The signal that guards a reset domain must live in a domain that stays alive.