- Semaphore(信号)
- Mailbox(邮箱)
- Events(事件)
Semaphore(信号)
用于锁定或者解锁资源,下面的例子两个并行的agent可能要用到某个资源,用get获取并锁定资源,用push释放资源,try_get为非阻塞获取
program semaphore_ex;
semaphore semBus = new(1);
initial begin
fork
agent("AGENT 0",5);
agent("AGENT 1",20);
join
end
task automatic agent(string name, integer nwait);
integer i = 0;
for (i = 0 ; i < 4; i ++ ) begin
semBus.get(1);
$display("[%0d] Lock semBus for %s", $time,name);
#(nwait);
$display("[%0d] Release semBus for %s", $time,name);
semBus.put(1);
#(nwait);
end
endtask
endprogram
MailBoxes(邮箱)
用于进程间通信
- new:新建
- put:添加数据
- get/peek:获取信箱
- num:获取信箱中数据长度
program mailbox_ex;
mailbox checker_data = new();
initial begin
fork
input_monitor();
checker();
join_any
#1000;
end
task input_monitor();
begin
integer i = 0;
// This can be any valid data type
bit [7:0] data = 0;
for(i = 0; i < 4; i ++) begin
#(3);
data = $random();
$display("[%0d] Putting data : %x into mailbox", $time,data);
checker_data.put(data);
end
end
endtask
task checker();
begin
integer i = 0;
// This can be any valid data type
bit [7:0] data = 0;
while (1) begin
#(1);
if (checker_data.num() > 0) begin
checker_data.get(data);
$display("[%0d] Got data : %x from mailbox", $time,data);
end else begin
#(7);
end
end
end
endtask
endprogram
[3] Putting data : 24 into mailbox
[6] Putting data : 81 into mailbox
[9] Putting data : 09 into mailbox
[9] Got data : 24 from mailbox
[10] Got data : 81 from mailbox
[11] Got data : 09 from mailbox
[12] Putting data : 63 into mailbox
[12] Got data : 63 from mailbox
event(事件)
事件的触发
- ->:触发事件,阻塞所有进程,等待事件完成
- ->>:非阻塞触发
下面的例子,两个进程通过事件交替运行
program event_t;
event try_event;
event get_event;
initial begin
// Start the wait_event as parallel thread
fork
wait_event();
join_none
// Wait till task wait_event has started execution
$write("Waiting for event get_event\n");
@ (get_event);
$write("Triggering event try_event\n");
#1;
-> try_event;
// Wait till task wait_event has done execution
$write("Waiting for event get_event\n");
wait (get_event.triggered);
$write("Got event get_event\n");
#10 $finish;
end
// Task which triggers/waits for events
task wait_event();
begin
#1;
// Inform that wait_event has started
$write("--task : Triggering event get_event\n");
-> get_event;
$write("--task : Waiting for event try_event\n");
@(try_event);
$write("--task : Got event try_event\n");
// Inform that wait_event has done with execution
#1;
$write("--task : Triggering event get_event\n");
->get_event;
end
endtask
endprogram
Waiting for event get_event
--task : Triggering event get_event
--task : Waiting for event try_event
Triggering event try_event
Waiting for event get_event
--task : Got event try_event
--task : Triggering event get_event
Got event get_event