system verilog - Почтовый ящик

Ниже я разместил полный код почтового ящика. Он имеет генератор классов, драйвер класса и код верхнего уровня. Мой вопрос в приведенном ниже коде, внутри генератора классов, как используются Transation tr и почтовый ящик mbx? Также, в функции new, как используется mbx?

program mailbox_example(bus_if.TB bus...);
  class Generator;   // Class Generator
    Transaction tr;
    mailbox mbx;

    function new (mailbox mbx);
      this.mbx=mbx;
    endfunction

    task run;
      repeat (10) begin
        tr=new;
        assert(tr.randomize);
        mbx.put(tr); //send out transaction
      end
    endtask
  endclass

  class Driver;  //Class Driver
    Transaction tr;
    mailbox mbx;

    function new(mailbox mbx);
      this.mbx=mbx;
    endfunction

    task run;
      repeat(10) begin
        mbx.get(tr);
        @(posedge busif.cb.ack);
        bus.cb.kind<=tr.kind;
        ...
      end
    endtask
  endclass

  mailbox mbx;  //Top level
  Generator gen;
  Driver drv;
  initial begin
    mbx=new;
    gen=new(mbx);
    drv=new(mbx);
    fork
      gen.run();
      drv.run();
    join
  end
endprogram

person Akash    schedule 09.11.2015    source источник
comment
Кстати, я настоятельно рекомендую вам использовать параметризованный почтовый ящик с типом объекта, который вы планируете передавать через почтовый ящик. mailbox #(Transaction) mbx Это позволяет компилятору проверять типы объектов, которые вы помещаете / получаете из почтового ящика.   -  person dave_59    schedule 09.11.2015


Ответы (1)


Почтовый ящик - это среда, используемая для связи между двумя блоками.

Почему почтовый ящик находится в конструкторе ... ??
Для связи между двумя блоками, такими как драйвер и генератор, между ними должен быть общий почтовый ящик (например, общий кабель используется для передачи информации от DTH антенна к приставке).
Чтобы совместно использовать общий почтовый ящик между драйвером и генератором, почтовый ящик создается в блоке верхнего уровня (например, Env), и его дескриптор передается драйверу и генератору через конструктор.

Как используются транзакция и почтовый ящик?
В почтовом ящике есть методы по умолчанию для хранения и получения транзакций, такие как put (), try_put (), get (), try_get (), peek () и try_peek ( ). В генераторе транзакция сохраняется в почтовом ящике с помощью метода put () или try_put (). В драйвере транзакция извлекается с помощью методов get (), try_get (), peek () или try_peek ().

Пожалуйста, обратитесь к разделу 15.4 Почтовые ящики в SV LRM для получения более подробной информации. :)

person H.Modh    schedule 09.11.2015
comment
Внутри функция new (почтовый ящик mbx), что делает this.mbx = mbx; означает? Кроме того, внутренний запуск задачи; что значит tr = new; означает? - person Akash; 10.11.2015
comment
Это означает, что вам нужно найти некоторый ресурс для развития SystemVerilog, особенно основы классов. Извините, но попытаться объяснить эту основную концепцию на форуме означало бы расширить тему. - person dave_59; 10.11.2015