Использование типа почтового ящика SystemVerilog в качестве модуля ввода-вывода - PullRequest
0 голосов
/ 13 февраля 2020

Можно ли передавать типы почтовых ящиков в SystemVerilog с помощью обычного модуля ввода-вывода? Большинство примеров почтовых ящиков в книгах показывают, что они используются только внутри классов SystemVerilog. Например, могу ли я сделать следующее? Это законно?

module driver(
    output mailbox mb
);

    mailbox   mbx = new(2);

    initial begin
        for (int i=0; i < 5; i++) begin
            #1 mbx.put(i);
            $display ("[%0t] Put #%0d,  size=%0d", 
               $time, i, mbx.num());
        end
   end
endmodule
module sink(
    input mailbox mb
);

    initial begin
        forever begin
          int idx;
          #2 mbx.get (idx);
          $display ("[%0t] Got item #%0d, size=%0d", 
            $time, idx, mbx.num());
        end
    end
endmodule
module top;
   mailbox mbx;
   source(mbx);
   sink(mbx);
endmodule

1 Ответ

2 голосов
/ 13 февраля 2020

Да, но в вашем коде много ошибок. Вы смешивали mb и mbx, и ваш модуль top был неверным. Кроме того, я настоятельно рекомендую использовать параметризованный почтовый ящик, чтобы сделать строго типизированный. Вы будете благодарить меня позже при использовании многих почтовых ящиков. Следующие работы для меня

typedef mailbox#(int) i_mailbox;
module source(
  output i_mailbox mbx
);

    initial begin
      mbx = new(2);
        for (int i=0; i < 5; i++) begin
            #1 mbx.put(i);
            $display ("[%0t] Put #%0d,  size=%0d", 
               $time, i, mbx.num());
        end
      #100 $finish;
   end
endmodule
module sink(
    input i_mailbox mbx
);

    initial begin
        forever begin
          int idx;
          #2 mbx.get (idx);
          $display ("[%0t] Got item #%0d, size=%0d", 
            $time, idx, mbx.num());
        end
    end
endmodule
module top;
   i_mailbox mbx;
   source so(mbx);
   sink si(mbx);
endmodule
...