In reply to Emphacy:
Then main use of the extern keyword is for readability. By declaring all the prototypes together without seeing their implementations, you can quickly see the API that a class provides. This makes documentation easier as well as making it easier for IP providers to encrypt their implementation leaving the prototypes visible.
In other languages like C++, declaring the class prototypes in a different file is a requirement for separate compilation. It’s not required by SystemVerilog; it uses packages instead.
I don’t think extern was ever intended to remove compile order dependencies. typedef should not be used for that either—only for rare cases of cyclic class dependencies.