Назначение идентификационного номера или кода для модуля Verilog
Я разработал модуль (A) в Verilog, и мне нужно создать его экземпляр четыре раза в верхнем модуле. Два модуля взаимодействуют друг с другом и некоторыми другими модулями. "А" посылает некоторые сигналы, которые должен принять другой экземпляр "А". Сигналы отправляются через интерфейс или шину. Я не хочу усложнять конструкцию за счет включения каких-либо стандартных протоколов шины. Я создал входной порт, чтобы избежать одинакового типа портов для ввода и вывода.
Есть ли способ назначить идентификатор или код для каждого экземпляра, чтобы каждый экземпляр проверял этот идентификатор и принимал сигналы, поступающие с другого идентификатора, чем он сам. Прямо сейчас без идентификатора или стандартного протокола шины модули также принимают свои собственные сигналы, чего не должно быть.
2 ответа
Вот способы, которыми вы можете сделать это:
- Добавить порт ввода идентификатора
Когда этот порт настроен на постоянное значение, при включении питания устройство может определить свой идентификатор. Технически вы можете сделать динамический идентификатор с этим, но обычно вы просто подключаете порт к постоянному значению. Это наиболее гибкий вариант, особенно если вы хотите, чтобы ваш конечный продукт использовался в качестве настраиваемого компонента.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
- Создать параметр 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
Остерегайтесь, хотя это не рекомендуется, поскольку описание вашего модуля будет соответствовать вашей иерархии.