TRILLER 0 3 сентября, 2015 Опубликовано 3 сентября, 2015 · Жалоба Здравствуйте. При использовании связки библиотек STD_LOGIC_ARITH/STD_LOGIC_UNSIGNED и целевом использовании сброса, в который уже раз нарвался на Х-ы при моделировании. Коллеги на работе агитируют за полную начальную инициализацию при декларации сигналов в VHDL. В связи с этим хотелось бы узнать, что думает общественность по этому поводу? Есть ли аргументы за инициализацию, либо против? Ну или альтернативные варианты. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 3 сентября, 2015 Опубликовано 3 сентября, 2015 (изменено) · Жалоба Сигнал сброса симулируется элементарно из тест-бенча. Если вы завели сброс и в ходе симуляции у вас полезли Х-ы, то очевидно, что у каких-то триггеров, которые требуют сброс, он описан неверно или не описан вовсе. В моём понимание это ошибка. Нет никакой необходимости сбрасывать каждый регистр, но при разработке дизайна надо определить какие регистры сбросить надо и описать этот сброс (синхронный или асинхронный, в зависимости от задачи/убеждений/пожеланий). Инициализацию переменных при объявлении стараюсь делать только в тест-бенчах. Изменено 3 сентября, 2015 пользователем serjj Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 3 сентября, 2015 Опубликовано 3 сентября, 2015 · Жалоба Сигнал сброса симулируется элементарно из тест-бенча. Если вы завели сброс и в ходе симуляции у вас полезли Х-ы, то очевидно, что у каких-то триггеров, которые требуют сброс, он описан неверно или не описан вовсе. В моём понимание это ошибка. Нет никакой необходимости сбрасывать каждый регистр, но при разработке дизайна надо определить какие регистры сбросить надо и описать этот сброс (синхронный или асинхронный, в зависимости от задачи/убеждений/пожеланий). Инициализацию переменных при объявлении стараюсь делать только в тест-бенчах. Я имею ввиду именно начальную инициализацию. И прежде всего сигналов, на которые не заведен ресет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 3 сентября, 2015 Опубликовано 3 сентября, 2015 · Жалоба Я имею ввиду именно начальную инициализацию А какая, простите, ещё бывает инициализация? ;) И прежде всего сигналов, на которые не заведен ресет. Если из-за такого сигнала происходит "размножение" Х-ов, то очевидно, что ресет на него завести следует. Это например счётчики и аккумуляторы. А если это регистр, который хранит результат умножения или сложения двух других сигналов к примеру, то сбрасывать его не нужно, а на Х-ы в самом начале симуляции можно не обращать внимание. С другой стороны в таких вот случаях Х-ы это даже хорошо. Потому что они позволяют а) оценить когда схема "пошла", т.е. когда результат можно анализировать, до этого её выход считаем хламом и б) отследить регистры накопители, на которые забыли добавить сброс. Кстати ещё один момент. При симуляции шин с множественным доступом по адресу бывает очень полезным выставлять в данные Х-ы, когда нет сигнала валидности, т.к. это позволяет отследить ошибки работы с шиной. Если в целевом модуле ни с того ни с сего появились Х-ы, значит модуль неверно отрабатывает операции на шине. Х-ы в данном случае являются аналогами мусора, который валит по загруженным шинам вроде Авалона или AXI в отсутствии валидности данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 3 сентября, 2015 Опубликовано 3 сентября, 2015 · Жалоба Если из-за такого сигнала происходит "размножение" Х-ов, то очевидно, что ресет на него завести следует. Категорически не согласен. Простой пример: process (clk) begin if (clk = '1' and clk'event) then countert <= (countert + 1); if countert = X"FF" then flag <= (not flag); else flag <= flag; end if; end if; end process; Мне совершенно не важно откуда начнёт считать счётчик и чему изначально будет равен flag. При разработке схемы я это учитываю. Однако если в железке у меня всё будет работать чётко, то в симуляции я получу надёжный "Х". И заводить ресет на эти сигналы - точно не верно, так как в более сложном случае вход rst может быть использован "для дела". При симуляции шин с множественным доступом по адресу бывает очень полезным выставлять в данные Х-ы, когда нет сигнала валидности. Спасибо, учту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 3 сентября, 2015 Опубликовано 3 сентября, 2015 · Жалоба В данном частном случае можно сделать инициализацию под дефайном, т.е. если код для синтеза, то инициализацию не делать, если для симулятора - то делать. В верилоге это что-то вроде `ifndef SYNTHESIS, при этом дефайн SYNTHESIS глобальный, что позволяет легко переключать весь проект между синтезируемым и симулируемым. Как в VHDL такое делается, я не помню, но думаю, что подобным же образом. Кроме инициализаций под `ifndef SYNTHESIS можно поместить ещё много полезного, с чем будет работать только симулятор. Впрочем это моё ИМХО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 3 сентября, 2015 Опубликовано 3 сентября, 2015 · Жалоба вот нет что бы использовать vcom/vlog +initreg+0 и vsim +initreg+0 всякие ресеты вводят, логику раздувающие .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 4 сентября, 2015 Опубликовано 4 сентября, 2015 · Жалоба а что плохого всем регистрам и сигналам задать правильное начальное значение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 4 сентября, 2015 Опубликовано 4 сентября, 2015 · Жалоба Категорически не согласен. Простой пример: process (clk) begin if (clk = '1' and clk'event) then countert <= (countert + 1); if countert = X"FF" then flag <= (not flag); else flag <= flag; end if; end if; end process; Мне совершенно не важно откуда начнёт считать счётчик и чему изначально будет равен flag. При разработке схемы я это учитываю. Однако если в железке у меня всё будет работать чётко, то в симуляции я получу надёжный "Х". И заводить ресет на эти сигналы - точно не верно, так как в более сложном случае вход rst может быть использован "для дела". Спасибо, учту. здесь бы я сбрасывал countert и flag, чтобы точно быть уверен в начальных значения. Да, кажется по умолчанию все регистры в ПЛИС программируются в нулевое состояние, но все таки... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bugdesigner 0 4 сентября, 2015 Опубликовано 4 сентября, 2015 · Жалоба Если прописать начальные значения триггерам это дополнительных ресурсов не съест, а проблем, в частности с симуляцией, убавится. И не нужно никаких дефайнов для синтеза/симуляции - Вы ничего не экономите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 16 4 сентября, 2015 Опубликовано 4 сентября, 2015 · Жалоба Xilinx, ug474_7Series_CLB, page 45: Control Signals • Use control signals only as necessary. • Avoid using a routed global reset signal and minimize use of local resets to maximize opportunity to use FPGA resources. • Use active-High control signals. • Avoid having both set and reset on the same flip-flop. • Avoid control signals on small shift registers and storage arrays in order to use LUTs instead of flip-flops, to maximize utilization and minimize power. В частности, если у регистра сдвига явно прописан сигнал сброса, то синтезатор не сможет имплементировать этот регистр в примитиве "SLICEM SRL Shift Register" и сделает все на FFs. /См. UG474, page 50/ Точно так же, если одно-/двух-портовая память реализована с использованием templates и у регистра порта адреса явно прописан сигнал сброса, то синтезатор не сможет имплементировать эту память в примитиве BRAM. Если же синтезатору при этом явно указать атрибут (* ram_style = "block" *), то синтезатор завалит вас предупреждениями о том, что асинхронный сброс порта адреса в цикле чтения может повредить содержимое памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 4 сентября, 2015 Опубликовано 4 сентября, 2015 · Жалоба SIGNAL zzz_OOUT : std_logic:='0'; чем так плохо объявлять сигнал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bugdesigner 0 4 сентября, 2015 Опубликовано 4 сентября, 2015 · Жалоба чем так плохо объявлять сигнал?Ничем не плохо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dworfik 0 4 сентября, 2015 Опубликовано 4 сентября, 2015 · Жалоба SIGNAL zzz_OOUT : std_logic:='0'; чем так плохо объявлять сигнал? Слышал, что для ASIC эта фишка не сработает. Но так как не программировал, то не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 4 сентября, 2015 Опубликовано 4 сентября, 2015 · Жалоба Слышал, что для ASIC эта фишка не сработает. Но так как не программировал, то не знаю. правильно, это ж только для симуляции ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться