Возможность отправки вызова методу, основанному на типах аргументов, называется multiple dispatch . В Java это делается с шаблоном посетителя .
Однако, поскольку вы имеете дело с Integer
s и String
s, вы не можете легко включить этот шаблон (вы просто не могут изменять эти классы). Таким образом, гигантское switch
на время выполнения объекта будет вашим оружием выбора.
Как правило, идея localparam
(добавлена в стандарт Verilog-2001) заключается в защите значения localparam
от случайного или неправильного переопределения конечным пользователем (в отличие от значения parameter
, это значение может не может быть изменено переопределением параметра или оператором defparam
.
На основе IEEE 1364-2005 (гл. 4.10.2):
Локальные параметры Verilog HDL идентичны параметрам, за исключением того, что они не могут быть напрямую изменены операторами defparam или экземпляром модуля. присвоение значений параметров . Локальным параметрам могут быть назначены постоянные выражения, содержащие параметры, которые могут быть изменены с помощью операторов defparam или назначений значений параметров экземпляра модуля.
Кроме того, в SystemVerilog ( IEEE 1800-2012 (гл. 6.20.4)):
В отличие от нелокальных параметров, локальные параметры могут быть объявлены в генерировать блок, пакет, тело класса или область действия модуля компиляции. В этих контекстах ключевое слово параметра должно быть синонимом ключевого слова localparam.
Локальные параметры могут быть объявлены в модуле parameter_port_list. Любое объявление параметра, появляющееся в таком списке между ключевым словом localparam и ключевым словом следующего параметра (или концом списка, если нет ключевого слова следующего параметра), должно быть локальным параметром. Любое другое объявление параметра в таком списке должно быть нелокальным параметром, который может быть переопределен.
Если вы хотите узнать больше об этой теме, я бы порекомендовал вам статью Клиффорда Э. Каммингса " Новые методики Verilog-2001 для создания параметризованных моделей (или покончим с` define and Death of defparam ") !) ».
Минимальный пример
Вот пример того, что упомянул Цю.
В ОЗУ объем памяти является функцией размера слова и адреса.
Таким образом, если родительский модуль задает размер слова и адреса, он также не может указывать размер памяти.
module myram #(
parameter WORD_SIZE = 1,
parameter ADDR_SIZE = 1
) (
input wire [ADDR_SIZE-1:0] addr,
inout wire [WORD_SIZE-1:0] data,
// ...
);
localparam MEM_SIZE = WORD_SIZE * (1 << ADDR_SIZE);
// Use MEM_SIZE several times in block.
...
И на родительском модуле это нормально:
module myram_tb;
myram #(
.ADDR_SIZE(2),
.WORD_SIZE(2)
) top (
/* wires */
)
, но это должно быть ошибкой:
module myram_tb;
myram #(
.ADDR_SIZE(2),
.WORD_SIZE(2),
.MEM_SIZE(2)
) top (
/* wires */
)
iverilog
не не получается, и я считаю, что это ошибка: https://github.com/steveicarus/iverilog/issues/157
Incisive выдает ошибку, как и ожидалось.