Concurrent assertions are evaluated over multiple clock cycles and are used to monitor sequences of events over time. It's only evaluated on clock edge.
A concurrent assertion is often created using Sequence and Property.
Sequence: define a series of events or conditions that occur over time, which is essential for expressing temporal relationships in hardware designs.
Property: use sequences to specify conditions or behaviors that must hold true. The property can then be used in assertions to check if the design behaves as expected over multiple clock cycles.
We can define a clock in a sequence. However, it's recommended that the clock be defined in a property to increase the reusability of the basic sequence.
Example
Output