The first step when adding assertions is to identify the module or group of signals where assertions should be applied. Generally it is easier to describe the behavior of control signals than data signals since algorithmic operations do not lend themselves to simple behavioral rules. Control signals, however, often are responsible for responding to external and internal stimulus, and thus, their behavior and interaction is more readily described. For our AXI example, we will identify the entire set of AXI signals as our target, but for more general applications, designers may choose to focus more time adding assertions at interface boundaries or modules with high levels of control logic.
Adding assertions at the boundary of a module provides an additional benefit. In addition to checking that the internal logic is compliant, they check that the external environment behaves according to these rules. These assertions can therefore check for invalid testbench configurations or protocol violations as well as problems in other blocks that would later be interfaced to this module.