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