The same clock edge does two things on a register to register path. The capturing flip-flop locks in its current D value, and the launching flip-flop sends out new data. The capturing flip-flop needs its D held steady for the hold time th after the edge. If the new data races through too quickly, it overwrites the value being captured.
The earliest the new data can arrive is the minimum clock to q delay plus the logic's contamination delay on the short path. So:
tcq(min) + tcd ≥ th
This check uses minimum delays, because the fastest data is the danger. The margin is the hold slack: tcq(min) + tcd − th.
Notice there's no clock period in it. Both events happen at the same edge, so the race doesn't care when the next edge comes. That makes a hold violation nasty: slowing the clock can't fix it, and the chip fails at every frequency. The fix is a hold fix: add delay, such as buffers, to the short path, then recheck setup.
With clock skew, the rule becomes tcq(min) + tcd ≥ th + tskew.