Разница между & ldquo; параметром & rdquo; и & ldquo; localparam & rdquo;

Возможность отправки вызова методу, основанному на типах аргументов, называется multiple dispatch . В Java это делается с шаблоном посетителя .

Однако, поскольку вы имеете дело с Integer s и String s, вы не можете легко включить этот шаблон (вы просто не могут изменять эти классы). Таким образом, гигантское switch на время выполнения объекта будет вашим оружием выбора.

17
задан Qiu 17 May 2015 в 16:01
поделиться

2 ответа

Как правило, идея 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 ") !) ».

27
ответ дан Qiu 17 May 2015 в 16:01
поделиться

Минимальный пример

Вот пример того, что упомянул Цю.

В ОЗУ объем памяти является функцией размера слова и адреса.

Таким образом, если родительский модуль задает размер слова и адреса, он также не может указывать размер памяти.

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 выдает ошибку, как и ожидалось.

5
ответ дан robsmi1970nyc 17 May 2015 в 16:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: