Назначение идентификационного номера или кода для модуля Verilog

Я разработал модуль (A) в Verilog, и мне нужно создать его экземпляр четыре раза в верхнем модуле. Два модуля взаимодействуют друг с другом и некоторыми другими модулями. "А" посылает некоторые сигналы, которые должен принять другой экземпляр "А". Сигналы отправляются через интерфейс или шину. Я не хочу усложнять конструкцию за счет включения каких-либо стандартных протоколов шины. Я создал входной порт, чтобы избежать одинакового типа портов для ввода и вывода.

Есть ли способ назначить идентификатор или код для каждого экземпляра, чтобы каждый экземпляр проверял этот идентификатор и принимал сигналы, поступающие с другого идентификатора, чем он сам. Прямо сейчас без идентификатора или стандартного протокола шины модули также принимают свои собственные сигналы, чего не должно быть.

2 ответа

Решение

Вот способы, которыми вы можете сделать это:

  1. Добавить порт ввода идентификатора
    Когда этот порт настроен на постоянное значение, при включении питания устройство может определить свой идентификатор. Технически вы можете сделать динамический идентификатор с этим, но обычно вы просто подключаете порт к постоянному значению. Это наиболее гибкий вариант, особенно если вы хотите, чтобы ваш конечный продукт использовался в качестве настраиваемого компонента.
    module A ( /* your_ports */, input [1:0] ID );
    /* ... code ... */
    endmodule
    module top;
    A inst0 ( .ID(2'd0), .* );
    A inst1 ( .ID(2'd1), .* );
    A inst2 ( .ID(2'd2), .* );
    A inst3 ( .ID(2'd3), .* );
    endmodule
  2. Создать параметр ID
    Имитация для порта ввода идентификатора, за исключением того, что значение жестко запрограммировано, и экземпляр знает значение идентификатора во время компиляции, до симуляции или включения устройства. Уникальные значения параметров генерируют уникальные модули. Если идентификатор равен 0, он будет физически отличаться от идентификатора с 1.
    module A #(parameter ID) ( /* your_ports */ );
    /* ... code ... */
    endmodule
    module top;
    A #( .ID(0) ) inst0 ( .* );
    A #( .ID(1) ) inst1 ( .* );
    A #( .ID(2) ) inst2 ( .* );
    A #( .ID(3) ) inst3 ( .* );
    endmodule
    

Почему бы вам не установить параметр для каждого модуля и не использовать его в качестве идентификатора? Затем установите параметр уникально для каждого экземпляра:

module A;
   parameter ID = 0; //default value
   case (ID)
       0: //specific code for ID0
       1: //specific code for ID1
       2: //specific code for ID2
       3: //specific code for ID3
   endcase
endmodule

И ваш верхний модуль:

module top;

  A #(.ID(0)) inst_0 (...);
  A #(.ID(1)) inst_1 (...);
  A #(.ID(2)) inst_2 (...);
  A #(.ID(3)) inst_3 (...);

endmodule

Пара других полезных моментов:

Вы можете проверить generate block или же vectorized/array module instantiation, которые позволяют вам создать массив модулей.

Также обратите внимание, что в целом каждый модуль может видеть всю иерархию. Внутри каждого модуля вы можете получить доступ к сигналам, используя hierarchical expression:

module A;
   reg s;
   ....
   initial $display("The initial value of signal s in instance A_2 is:", top.inst_2.s);
endmodule

Остерегайтесь, хотя это не рекомендуется, поскольку описание вашего модуля будет соответствовать вашей иерархии.

Другие вопросы по тегам