Note that this rule is very opinionated and mostly used on legacy or safety-critical projects.
Some reasons for enforcing this rule:
generate blocks can become very hard to follow,
understand and test.
generate trees are sometimes
used to work around missing parameters / bad architecture instead of using cleaner parameterization.
for-loop inside process when
possible) because they believe it's "more obvious what hardware is created".
generate constructs (especially nested if/case
inside for-generate).