Systemverilog темы общения с использованием почтового ящика - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь понять, как процессы взаимодействуют в среде 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. Сначала dri.run () запустился и заблокировался в m_box.get (), потому что m_box пуст. Переходит в спящий режим.
  2. gen.run () запустился и поместил pkt в почтовый ящик, используя m_box.put (pkt).
  3. после помещения pkt в почтовый ящик, он выполняет $ display и блокируется на # 5, потому что для продвижения требуется время симуляции. Также Systemverilog должен завершить все другие дела в это время моделирования.
  4. планировщик потока systemverilog ищет другой поток для выполнения и обнаруживает, что процесс драйвера ожидает заполнения основного ящика. Планировщик разбудит его и выполнит m_box.get (pkt) и два следующих оператора $ display.
  5. Процесс драйвера заблокирован m_box.get (pkt) в блоке repeat (2).
  6. systemverilog simulator увидит, что все потоки либо заблокированы (ожидают почтовый ящик), и увеличит время симуляции до # 5.

Это правильно? Кроме того, что будет основным отличием между этапом 3 и этапом 6? Они оба являются состоянием, в котором процесс генератора ожидает продвижения времени моделирования, а процесс драйвера ожидает заполнения почтового ящика. Единственное отличие состоит в том, что почтовый ящик имеет что-то на шаге 3, но не на шаге 6. Планировщик должен иметь какой-то механизм, чтобы знать, что существует какой-то процесс, ожидающий почтовый ящик, и не должен увеличивать время моделирования на шаге 3. Что было бы хорошим материалом для чтения, чтобы узнать об этом механизме более подробно?

...