Hardware Verification with C++: A Practitioner's Handbook

Oh what a tangled web we weave,
When first we practice to deceive.Sir Walter Scott, Marmion. Canto vi, Stanza 17
Connecting classes together is more important than the classes themselves. How can this be? It is so because, by definition, the connecting of classes involves jumping around in the code base. Managing this is mentally more difficult than simply managing the code within a class. For example, when you see a pointer to a class in a method call, you have to think about why the method needs that class. The answer depends upon whether the system is a tangled web or a well-architected series of connections.
Often you have to find the header file for the class and go look at the implementation of the method. In the worst case, the code make no sense whatsoever, even after you stare at the implementation. In the best case, the connections are obvious, such as when a test gets a pointer to a testbench.
In hardware design we connect modules together and worry about clock domain crossings. With verification, we connect instances of classes and methods together and worry about crossing the threads of execution. In addition, the connections in verification may be temporary (for example, they are used only within a method), or they may be permanent (for example, when a constructor takes in a pointer to a logger and stores it in a data member.
Connections in your code can either form a spider web of...