Hi Amund,
The issue queue stage ready signals (which say if it is full) connect to the dispatch stage at the line: fp_pipeline.io.dis_uops <> dispatcher.io.dis_uops(i) (line 832 of core.scala in the v4 code).
The issue queue ready signals are generated in line 212 of issue-unit-age-ordered.scala in the v4 code: io.dis_uops(w).ready := RegNext(PopCount(is_available) > w.U(log2Ceil(nFastSlots).W) + PopCount(io.dis_uops.map(_.fire)))
One thing that might have been confusing is that, within the Basic Dispatcher is that we input dis_uops from the core to the ren_uops input of Basic Dispatcher, but the outputs of Basic Dispatcher are called dis_uops. And then, we use the ready signals from the issue queue (which, since they go backwards, are inputted to the dis_uops output of the Basic Dispatcher), to say whether ren_uops (in Basic Dispatcher) are ready (and this is the same as dis_uops in core.scala).
Please let me know if any other part of the feedback loop was making you confused.
Tom