Krys 2 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба Здравствуйте. Пытаюсь сделать линию задержки: 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 уже описать доступ к ним под своими именами. Тогда неиспользуемые, но объявленные элементы памяти будут выброшены синтезатором при оптимизации. Минус - при выбрасывании посыпятся ворнинги, будет замусоривание лога. Надо писать так, чтобы не было ничего лишнего, и синтезатору ничего не приходилось выкидывать после тебя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sobol' 0 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба в данном случае mem - локальная переменная оператора if, следовательно вне "своего" оператора она не видна - все логично. Как решить Вашу проблему, чтобы все было красиво - чесно ХЗ. Смотрите директивы компилятора языка, возможно поможет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба Приветствую! Внесите всю работу с mem под соответствующий if Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба Sobol', RobFPGA, спасибо за разъяснения. Правда, всю работу с переменной вносить тоже не очень красиво, т.к. у них вся оставшаяся работа общая, а придётся её копировать (что может внести ошибки). Ну ладно, понял причину, буду придумывать подходящий для своих нравственных принципов вариант )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба Использовать как вариант вместо generate 'ifdef конструкцию, т.к. вы хотите, как я понял, под generate внести атрибут, а не логику. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба препроцессор не умеет перекликаться с параметрами верилога, насколько я знаю. Т.е. я не смогу сделать зависимость ифдефа от параметра PP. Под генерэйт я хочу внести атрибут, относящийся к объявлению памяти, т.е. для синтезатора они должны быть строго друг за другом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба Для задания значений атрибутов в (* *) можно использовать параметры, а не константы, и обойтись без прячущего if-a. Правда, я сталкивался с тем, что некоторые атрибуты(syn_noprune, к примеру) в Synplify можно ставить только в "yes". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба о! спасибо! не знал )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба Код всё же пришлось сделать по рекомендации ув. 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, то вход соединяется с выходом нормально. Это говорит, что нет ошибки при описании вставки экземпляра (инстантировании). Почему выкидывает регистр? Похоже у меня лыжи не едут... ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба А зачем вы его два раза объявили? Оо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба При этом если DEL = 0, то вход соединяется с выходом нормально. Это говорит, что нет ошибки при описании вставки экземпляра (инстантировании). Почему выкидывает регистр? Похоже у меня лыжи не едут... ) Тут же не ошибка, а предупреждение о константе на входе регистра. Если дальше в пути данных регистров нет(или добавлена любая комбинаторика), то и предупреждения при DEL=0 не будет. А в симуляции всё нормально? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба А зачем вы его два раза объявили? Ооразве? У меня там для проверки 1 закоменнтировано. Как закомментировано - было в начале. Я начал уже мучаться, проверки делать. Вот вынес наружу память. Если дальше в пути данных регистров нет(или добавлена любая комбинаторика), то и предупреждения при DEL=0 не будет.Там выход блока подключен к выходным пинам микросхемы через блок задержки. Если вход регистра не подключен в месте, где задержка инстантируется, то я бы увидел отсутствие подключения выхода модуля к выходным пинам микросхемы при DEL=0. А в симуляции всё нормально?Не симулировал, т.к. блок задержки вроде как простой, "2 пальца..." ))) Вот в трёх сосёнках и заблудился. А полностью всю прошивку симулить - это почти нереально, слишком тяжёлая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба ... 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 синтезатор понимать умеет? Попробуйте и тут закомментировать, что получится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба Вроде точно... ) Вы просто не в ту ветку смотрите. У меня PP=0. Перед всеми извиняюсь, проблема всё же была при инстантировании. Указал несуществующий клок. Вот так в 3 сосёнках потратил полдня ))) Как говорится "если совсем ничего не получается - почитайте наконец мануал ворнинги", а они были, просто их надо было посмотреть. А я по запарке полез рыться в коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 29 июня, 2015 Опубликовано 29 июня, 2015 · Жалоба еще есть такая фигня procedure - в нее можно вынести повторяющийся кусок кода, тогда не будет ошибок при копировании-размножении, вставляете только имя процедуры, а код правите в одном месте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться