a complex test environment consists of reusable verification components that must communicate with one another. verilog's 'event' primitive allowed different blocks of procedural statements to trigger each other, but enforcing thread synchronization was up to the programmer's (clever) usage. systemverilog offers two primitives specifically for interthread synchronization: "mailbox" and "semaphore". the mailbox is modeled as a fifo message queue. optionally, the fifo can be type-parameterized so that only objects of the specified type may be passed through it. typically, objects are class instances representing "transactions": elementary operations (for example, sending a frame) that are executed by the verification components. the semaphore is modeled as a counting semaphore.