使用邮箱

时间:2019-01-18 06:43:37

标签: multithreading scheduling uvm

我试图了解进程如何在systemverilog环境中进行通信。具体来说,我在这里查看代码: https://www.verificationguide.com/p/systemverilog-mailbox.html 总结如下:

//Generator

task run;
    repeat(2) begin
      pkt = new();
      pkt.randomize(); //generating packet
      m_box.put(pkt);  //putting packet into mailbox
      $display("Generator::Packet Put into Mailbox");
      #5;
    end
endtask

//driver
task run;
    repeat(2) begin
      m_box.get(pkt); //getting packet from mailbox
      $display("Driver::Packet Recived");
      $display("Driver::Addr=%0d,Data=%0d\n",pkt.addr,pkt.data);
    end
endtask

//start two processes
fork
      dri.run(); //Process-2
      gen.run(); //Process-1
join here

通信的摘要是,生成器创建了一个对象并将其放置在邮箱中,而驱动程序从共享邮箱中使用了该对象。当测试台分叉两个进程时,两个线程正在进行生产者/消费者握手。我想了解如何安排两个流程。这就是我的想法。

  1. 首先,因为m_box为空,所以dri.run()在m_box.get()处启动并被阻止。它进入睡眠模式。
  2. gen.run()开始,然后使用m_box.put(pkt)将pkt放入邮箱中。
  3. 将pkt放入邮箱后,它执行$ display并在#5处阻塞,因为它需要模拟时间才能提前。同样,Systemverilog还需要在此模拟时间完成所有其他要做的事情。
  4. systemverilog线程调度程序搜索其他要执行的线程,并发现驱动程序进程正在等待填充主机箱。调度程序将其唤醒并执行m_box.get(pkt)和以下两个$ display语句。
  5. 驱动程序进程被repeat(2)块中的m_box.get(pkt)阻塞。
  6. systemverilog模拟器看到所有线程都被阻塞(正在等待邮箱),并将模拟时间提前到了#5。

这是正确的吗? 另外,步骤3和步骤6之间的主要区别是什么?它们都处于生成器进程正在等待模拟时间提前而驱动程序进程正在等待邮箱被填充的状态。唯一的区别是邮箱在步骤3中有内容,但在步骤6中没有。调度程序必须具有某种机制来知道有一些进程正在等待邮箱,并且不应在步骤3中提前仿真时间。要详细了解此机制,什么是很好的阅读材料?

0 个答案:

没有答案