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

generate if в verilog, как объявить элементы памяти внутри этой конструкции

Здравствуйте. Пытаюсь сделать линию задержки:

module delay #(
   DATA_BW = 1,
   DEL     = 1,
   PP      = 0     // 0 - instantiated for algorithmic delay with SRL, 1 - instantiated for pipeline,
) (                 //      without SRL, only FF
   input clk,
   input  [DATA_BW-1 : 0] data_in,
   output [DATA_BW-1 : 0] data_out
);

integer i;

generate
if(DEL == 0) begin : del0g
   assign data_out = data_in;
end
if(DEL == 1) begin : delnzg
   if(PP) begin : ppg
       (* equivalent_register_removal = "no" *) (* shreg_extract = "no" *)
       reg  [DATA_BW-1 : 0] mem;
   end else begin : nppg
       reg  [DATA_BW-1 : 0] mem;
   end
   always @(posedge clk) begin
       mem <= data_in;
   end
   assign data_out = mem;
...

Так вот синтезатор не видит mem ни в одной строчке, где к ней идёт доступ: ни к последней, ни к предпоследней строчке кода выше:

[HDLCompiler 69] <mem> is not declared. ["delay.v":32]
[HDLCompiler 69] <mem> is not declared. ["delay.v":34]

 

Память мне нужно описать разным образом в зависимости от параметра PP - либо с атрибутами запрещения оптимизации, либо без.

Почему синтезатор ругается? Нельзя объявить память внутри generate?

Как сделать красиво?

Пока вижу только некрасивый способ: объявить все возможные элементы памяти выше generate под разными именами, а внутри generate уже описать доступ к ним под своими именами. Тогда неиспользуемые, но объявленные элементы памяти будут выброшены синтезатором при оптимизации. Минус - при выбрасывании посыпятся ворнинги, будет замусоривание лога. Надо писать так, чтобы не было ничего лишнего, и синтезатору ничего не приходилось выкидывать после тебя.

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


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

в данном случае mem - локальная переменная оператора if, следовательно вне "своего" оператора она не видна - все логично. Как решить Вашу проблему, чтобы все было красиво - чесно ХЗ. Смотрите директивы компилятора языка, возможно поможет.

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


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

Sobol', RobFPGA, спасибо за разъяснения. Правда, всю работу с переменной вносить тоже не очень красиво, т.к. у них вся оставшаяся работа общая, а придётся её копировать (что может внести ошибки). Ну ладно, понял причину, буду придумывать подходящий для своих нравственных принципов вариант ))

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


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

Использовать как вариант вместо generate 'ifdef конструкцию, т.к. вы хотите, как я понял, под generate внести атрибут, а не логику.

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


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

препроцессор не умеет перекликаться с параметрами верилога, насколько я знаю. Т.е. я не смогу сделать зависимость ифдефа от параметра PP.

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

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


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

Для задания значений атрибутов в (* *) можно использовать параметры, а не константы, и обойтись без прячущего if-a. Правда, я сталкивался с тем, что некоторые атрибуты(syn_noprune, к примеру) в Synplify можно ставить только в "yes".

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


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

Код всё же пришлось сделать по рекомендации ув. RobFPGA

module delay #(
   DATA_BW = 1,
   DEL     = 1,
   PP      = 0     // 0 - instantiated for algorithmic delay with SRL, 1 - instantiated for pipeline,
) (                 //      without SRL, only FF
   input clk,
   input  [DATA_BW-1 : 0] data_in,
   output [DATA_BW-1 : 0] data_out
);
           reg  [DATA_BW-1 : 0] mem;

integer i;
generate
if(DEL == 0) begin : del0g
   assign data_out = data_in;
end else begin
   if(DEL == 1) begin : del1g
       if(PP) begin : ppg
           (* equivalent_register_removal = "no" *) (* shreg_extract = "no" *)
           reg  [DATA_BW-1 : 0] mem;
           always @(posedge clk) begin
               mem <= data_in;
           end
           assign data_out = mem;
       end else begin : nppg
// //             reg  [DATA_BW-1 : 0] mem;
           always @(posedge clk) begin
               mem <= data_in;
           end
           assign data_out = mem;
       end
...

 

Вылазит такая петрушка:

=======================================================================
==
*                         Low Level Synthesis                           *
=========================================================================
WARNING:Xst:1710 - FF/Latch <mem_30> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_29> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_28> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_27> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_26> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_25> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_24> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_23> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_22> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_21> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_20> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_19> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_18> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_17> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_16> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_15> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_14> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_13> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_12> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_11> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_10> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_9> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_8> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_7> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_6> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_5> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_4> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_3> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_2> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_1> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <mem_0> (without init value) has a constant value of 0 in block <delay>. This FF/Latch will be trimmed during the optimization process.

 

При вставке экземпляра используются такие параметры:

DATA_BW = 31,

DEL = 1,

PP = 0

 

При этом если DEL = 0, то вход соединяется с выходом нормально. Это говорит, что нет ошибки при описании вставки экземпляра (инстантировании).

 

Почему выкидывает регистр? Похоже у меня лыжи не едут... )

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


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

При этом если DEL = 0, то вход соединяется с выходом нормально. Это говорит, что нет ошибки при описании вставки экземпляра (инстантировании).

 

Почему выкидывает регистр? Похоже у меня лыжи не едут... )

Тут же не ошибка, а предупреждение о константе на входе регистра. Если дальше в пути данных регистров нет(или добавлена любая комбинаторика), то и предупреждения при DEL=0 не будет.

А в симуляции всё нормально?

 

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


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

А зачем вы его два раза объявили? Оо
разве? У меня там для проверки 1 закоменнтировано. Как закомментировано - было в начале. Я начал уже мучаться, проверки делать. Вот вынес наружу память.

 

Если дальше в пути данных регистров нет(или добавлена любая комбинаторика), то и предупреждения при DEL=0 не будет.
Там выход блока подключен к выходным пинам микросхемы через блок задержки. Если вход регистра не подключен в месте, где задержка инстантируется, то я бы увидел отсутствие подключения выхода модуля к выходным пинам микросхемы при DEL=0.

 

А в симуляции всё нормально?
Не симулировал, т.к. блок задержки вроде как простой, "2 пальца..." ))) Вот в трёх сосёнках и заблудился. А полностью всю прошивку симулить - это почти нереально, слишком тяжёлая.

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


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

 ...
                  reg [DATA_BW-1 : 0] mem;
...
generate
...
if(DEL == 1) begin : del1g
    if(PP) begin : ppg
    (* equivalent_register_removal = "no" *) (* shreg_extract = "no" *)
    reg [DATA_BW-1 : 0] mem;
...

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

А вложенные if он при generate синтезатор понимать умеет? Попробуйте и тут закомментировать, что получится?

 

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


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

Вроде точно... ) Вы просто не в ту ветку смотрите. У меня PP=0.

 

Перед всеми извиняюсь, проблема всё же была при инстантировании. Указал несуществующий клок. Вот так в 3 сосёнках потратил полдня ))) Как говорится "если совсем ничего не получается - почитайте наконец мануал ворнинги", а они были, просто их надо было посмотреть. А я по запарке полез рыться в коде.

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


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

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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