Перейти к содержанию
    

Работаю в Qartus 9.1 SP2

 

Надо создать N экземпляров одного модуля, причем N является параметром.

Конечно можно написать максимально возможное количество if-generate, но меня это как-то не вдохновляет.

Возможно ли такое при помощи for-generate?

 

так квартус ругается

Error (10253): Verilog HDL Module Instantiation error at data_path_64.v(104): cannot elaborate array of instances because the declaration for the instantiated module has not been analyzed

    generate
        genvar    i;
        
        for(i = 0; i < DAT_BYTES; i = i + 1) 
        begin : dq_gen
            dq_8    dq_8_inst[i](//<<<<<<<<<<<<<<<<
                .oe(oe_bd),
                .inclock(dqin_clk_wire[i]),
                .outclock(clk2_inv),
                .datain_h(dqo[8*(i+1)-1:8*i]),
                .datain_l(dqo[8*(DAT_BYTES+i+1)-1:8*(DAT_BYTES+i)]),
                .padio(dq[8*(i+1)-1:8*i]),
                .dataout(dqi_wire[8*(DAT_BYTES+i+1)-1:8*(DAT_BYTES+i)]),
                .dataout_ddio(dqi_wire[8*(i+1)-1:8*i])
            );
        end
    endgenerate

 

так не ругается, но по моему это не вполне корректно

    generate
        genvar    i;
        
        for(i = 0; i < DAT_BYTES; i = i + 1) 
        begin : dq_gen
            dq_8    dq_8_inst(//<<<<<<<<<<<<<<<<
                .oe(oe_bd),
                .inclock(dqin_clk_wire[i]),
                .outclock(clk2_inv),
                .datain_h(dqo[8*(i+1)-1:8*i]),
                .datain_l(dqo[8*(DAT_BYTES+i+1)-1:8*(DAT_BYTES+i)]),
                .padio(dq[8*(i+1)-1:8*i]),
                .dataout(dqi_wire[8*(DAT_BYTES+i+1)-1:8*(DAT_BYTES+i)]),
                .dataout_ddio(dqi_wire[8*(i+1)-1:8*i])
            );
        end
    endgenerate

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

называется "найдите хоть одно отличие" :)

То i, что взято в скобках , добавляется к dq_8_inst само при генерации. Таким, образом, каждый экземпляр будет иметь свое имя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

называется "найдите хоть одно отличие" :)

 

То i, что взято в скобках , добавляется к dq_8_inst само при генерации. Таким, образом, каждый экземпляр будет иметь свое имя.

Ну, отличие есть, потому как один способ работает, а другой нет :laughing:

 

То что второй способ работает В КВАРТУСЕ я и сам вижу, квартус создает инстансы вида dq_gen.dq_8_inst

 

Просто меня интересовало насколько это корректно с точки зрения стандарта verilog 2001? И будет ли это работать в других средах?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто меня интересовало насколько это корректно с точки зрения стандарта verilog 2001?

Насколько я понимаю, это единственно верное решение (для всех сред).

Для этого блок begin - end и должен иметь имя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто меня интересовало насколько это корректно с точки зрения стандарта verilog 2001? И будет ли это работать в других средах?

это некорректно с точки зрения любого стандарта по 2009 вклчительно, т.к. вот это "dq_8 dq_8_inst(...)" (выделено жирным) есть идентификатором модуля, который определяется вот этим синтаксисом:

simple_identifier ::= [ a-zA-Z_ ] { [ a-zA-Z0-9_$ ] }

как видите символа '[' или ']' там нет

 

ЗЫ как я уже неоднократно повторял Апендикс А Formal Syntax очень полезная вещь в стандарте - решает любые вопросы и очень быстро и просто

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это некорректно с точки зрения любого стандарта по 2009 вклчительно, т.к. вот это "dq_8 dq_8_inst(...)" (выделено жирным) есть идентификатором модуля, который определяется вот этим синтаксисом:

simple_identifier ::= [ a-zA-Z_ ] { [ a-zA-Z0-9_$ ] }

как видите символа '[' или ']' там нет

Ну я вообще то имел ввиду как раз способ второй - без , он корректен везде?

 

Ну а как же массивы модулей?!

 

// Array of instances
<module_name> #(<parameters) <inst_name> [<msb>:<lsb>](<port_connects>);

 

Спасибо ViKo !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну я вообще то имел ввиду как раз способ второй - без , он корректен везде?

второй - да.

Ну а как же массивы модулей?!

// Array of instances
<module_name> #(<parameters) <inst_name> [<msb>:<lsb>](<port_connects>);

а это вы откуда взяли? массивы модулей только планируются в следующем стандарте (или я что-то пропустил?).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а это вы откуда взяли? массивы модулей только планируются в следующем стандарте (или я что-то пропустил?).

они же еще в 2001году были

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

они же еще в 2001году были

ого. пойду перечитаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Был не прав. Вспылил. Но теперь считаю свое предложение безобразной ошибкой, раскаиваюсь, прошу дать возможность загладить, искупить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а это вы откуда взяли?

В квартусе в Verilog Templates

И собственно озлобляет то, что нахрена это там писать, если это не поддерживается (квартусом)?

Хотя заявленно что Q поддерживает Verilog 2001!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В квартусе в Verilog Templates

И собственно озлобляет то, что нахрена это там писать, если это не поддерживается (квартусом)?

Хотя заявленно что Q поддерживает Verilog 2001!

что именно не поддерживается? скобки при generate for использовать нельзя, имя генерируется автоматически. никакого нарушения стандарта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что именно не поддерживается? скобки при generate for использовать нельзя, имя генерируется автоматически. никакого нарушения стандарта.

скобки-то, получается, можно. нельзя в них индекс genvar запускать в цикле.

получается, что вот так:

    generate
        genvar    i;
        
        for(i = 0; i < DAT_BYTES; i = i + 1) 
        begin : dq_gen
            dq_8    dq_8_inst[ some_other_index ](...);
        end
    endgenerate

должно быть разрешено

тогда generate должен сгенерировать

dq_8 dq_gen[0].dq_8_inst[ some_other_index ](...);

...

dq_8 dq_gen[DAT_BYTES-1].dq_8_inst[ some_other_index ](...);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

скобки-то, получается, можно. нельзя в них индекс genvar запускать в цикле.

 

получается, что вот так:

some_other_index должен быть диапазоном (а не индексом), определенным на этапе сборки, а не genvar или другой вычисляемой переменной. В вопросе автора это не так.

 

2 MAXvaLL перед тем как шашкой махать (кричать что ква плохой), надо разобраться в вопросе (стандарте) %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что именно не поддерживается? скобки при generate for использовать нельзя, имя генерируется автоматически. никакого нарушения стандарта.

Можно! но не так как предлагал я, а как предложил CaPpuCcino, с учетом замечания des00

 

generate-for тут непричем

просто попробуйте создать группу модулей без for и без generate.

...
DFF dff_group [7:0] (
    .d(1), 
    .clk(clk1_wire), 
    .q()
    );
...

Результат:

Error (10253): Verilog HDL Module Instantiation error at data_path_64.v(43): cannot elaborate array of instances because the declaration for the instantiated module has not been analyzed

 

some_other_index должен быть диапазоном (а не индексом), определенным на этапе сборки, а не genvar или другой вычисляемой переменной. В вопросе автора это не так.

 

2 MAXvaLL перед тем как шашкой махать (кричать что ква плохой), надо разобраться в вопросе (стандарте) %)

Тут вы правы, это некорректный способ (первый из тех что я предлагал), и я это уже понял :)

 

А тут вы не правы! В вопросе я разобрался - ква-ква плохой! :maniac: См. выше...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...