Syntax at a glance
req |-> ##[1:3] ack
How it works
A ranged delay allows the next condition to match at any endpoint in an inclusive window. In req |-> ##[1:3] ack, a request at t requires at least one high ack at t+1, t+2, or t+3. Any one of these endpoints is enough; ack does not need to be high throughout the window.
For a request at cycle 1, acknowledgements at cycle 2, 3, or 4 can satisfy the obligation. An acknowledgement only at cycle 1 is too early, and one only at cycle 5 is too late. ##[2:2] describes the same endpoint as ##2. The lower bound must not exceed the upper bound.
Windows from different requests can overlap. Each request needs a matching endpoint, but the same ack may satisfy more than one obligation if it lies inside each request's allowed window. This expression does not enforce a unique response per request or forbid extra acknowledgements.
Put jointly required conditions inside one Boolean expression: req |-> ##[1:3] (ack && ready) requires both ack and ready at a single endpoint. Separate appearances of ack and ready at different cycles are insufficient. Chained ranges are relative to the preceding matched endpoint, not always to the initial trigger.
The evaluator considers possible endpoints and succeeds if a full sequence path matches. A match inside the trace is enough even if later candidates extend beyond its end. If no path succeeds and future endpoints are unresolved, the obligation fails; Studio asks authors to pad the trace. Ranges are limited to 0–128, and very large chained searches can hit the evaluator's complexity budget.