009 进程间通信(Interprocess Communication)

  • 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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值