In reply to bmorris:
The question here is, what is your definition of “fully verify it”. Here’s an over simplified and contrived example:
Say you have a design that can do task1 and task2. You omit to verify task2 (maybe because you thought that’s something that shouldn’t be used) and it’s buggy. If you reuse your testbench and the system actually executes task2, you’ll (hopefully) see some fails from the module level testbench. Since you didn’t expect task2 to be used, the module TB should yell that its assumption didn’t hold.
You could potentially also see these fails in the system level testbench (because your expected system behavior wouldn’t happen), but that means that you have a some pretty fancy end-to-end checks in place.
Functional checks you could probably safely turn off, because as you pointed out, whether you stimulate a certain case in the module level TB or in the system level context, you’re basically checking the same. Wrong assumptions about how a module is supposed to be used are what you care about. These could have either been made on module level (wrong module designed) or system level (module used incorrectly).