A
semaphore allows you to control access to a resource.
Conceptually,
a semaphore is a bucket. When a semaphore is allocated, a bucket that contains
a fixed number of keys is created. Processes using semaphores must first
procure a key from the bucket before they can continue to execute. If a
specific process requires a key, only a fixed number of occurrences of that process
can be in progress simultaneously. All others must wait until a sufficient
number of keys are returned to the bucket.
Semaphores
are typically used for mutual exclusion, access control to shared resources,
and basic synchronization.
Imagine
that you and your spouse share a car. Obviously, only one person can drive it
at a time. You can manage this situation by agreeing that whoever has the key
can drive it. When you are done with the car, you give up the car so that the
other person can use it. The key is the semaphore that makes sure only one
person has access to the car.
In
operating system terminology, this is known as “mutually exclusive access,” so
a semaphore is known as a “mutex” and is used to control access to a resource.
Semaphores
can be used in a testbench when you have a resource, such as a bus, that may
have multiple requestors from inside the testbench but, as part of the physical
design, can only have one driver.
In
SystemVerilog, a thread that requests a key when it is not available always
blocks the execution of that particular thread. Multiple blocking threads are
queued in FIFO order.
Semaphore
is a built-in class that provides the following methods:
—
Create a semaphore with a specified number of keys: new()
—
Obtain one or more keys from the bucket: get()
—
Return one or more keys into the bucket: put()
—
Try to obtain one or more keys without blocking: try_get()
The
default value for keyCount is
0.
If
the specified number of keys is not available, the get() method blocks process
until the keys become available.
If
the specified number of keys is not available, the try_get() method returns 0.
Semaphores with Multiple Keys:
You
can put more keys back
than you took out. Suddenly you may have two keys but only one car!
Be
careful if your testbench needs to get and put multiple keys. Perhaps you have
one key left, and a thread requests two, causing it to block. Now a second
thread requests a single semaphore – what should happen? In SystemVerilog the
second request, get(1) , sneaks
ahead of the earlier get(2) , bypassing
the FIFO ordering.
No comments:
Post a Comment