If I understand the code correctly, the
total target block time is 90s, not the PoW target block time.
The PoW target block time is determined by this formula:
(main.cpp:1045)
int64 nTargetSpacing = fProofOfStake ? STAKE_TARGET_SPACING :
min(nTargetSpacingWorkMax, (int64) STAKE_TARGET_SPACING * (1 + pindexLast->nHeight - pindexPrev->nHeight));
STAKE_TARGET_SPACING is 90 (1.5 minutes) and nTargetSpacingWorkMax is 900 (15 minutes).
Thus, for POS blocks, the target spacing is always set to 90 seconds (because fProofOfStake is true for POS blocks).
For POW blocks, the target spacing is
min(nTargetSpacingWorkMax, (int64) STAKE_TARGET_SPACING * (1 + pindexLast->nHeight - pindexPrev->nHeight)).
In other words, the target spacing gets set to 90s * (2 + number_of_non_pow_blocks_since_the_last_pow_block).
If this value exceeds 15 minutes, the target spacing is set to 15 minutes.
=> When there are many PoS blocks, the PoW block spacing gets increased in order to achieve the total average block time of 90 seconds.
This
feature seems to be inherited from Peercoin.