Jump to content
    

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 уже описать доступ к ним под своими именами. Тогда неиспользуемые, но объявленные элементы памяти будут выброшены синтезатором при оптимизации. Минус - при выбрасывании посыпятся ворнинги, будет замусоривание лога. Надо писать так, чтобы не было ничего лишнего, и синтезатору ничего не приходилось выкидывать после тебя.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Приветствую!

 

Внесите всю работу с mem под соответствующий if

 

Успехов! Rob.

 

 

 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Код всё же пришлось сделать по рекомендации ув. 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, то вход соединяется с выходом нормально. Это говорит, что нет ошибки при описании вставки экземпляра (инстантировании).

 

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

Share this post


Link to post
Share on other sites

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

 

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

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

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

 

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


Link to post
Share on other sites

 ...
                  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 синтезатор понимать умеет? Попробуйте и тут закомментировать, что получится?

 

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...