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

Инициализация синалов. VHDL

Здравствуйте.

При использовании связки библиотек STD_LOGIC_ARITH/STD_LOGIC_UNSIGNED и целевом использовании сброса, в который уже раз нарвался на Х-ы при моделировании. Коллеги на работе агитируют за полную начальную инициализацию при декларации сигналов в VHDL.

В связи с этим хотелось бы узнать, что думает общественность по этому поводу? Есть ли аргументы за инициализацию, либо против?

Ну или альтернативные варианты.

Спасибо.

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


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

Сигнал сброса симулируется элементарно из тест-бенча. Если вы завели сброс и в ходе симуляции у вас полезли Х-ы, то очевидно, что у каких-то триггеров, которые требуют сброс, он описан неверно или не описан вовсе. В моём понимание это ошибка. Нет никакой необходимости сбрасывать каждый регистр, но при разработке дизайна надо определить какие регистры сбросить надо и описать этот сброс (синхронный или асинхронный, в зависимости от задачи/убеждений/пожеланий). Инициализацию переменных при объявлении стараюсь делать только в тест-бенчах.

Изменено пользователем serjj

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


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

Сигнал сброса симулируется элементарно из тест-бенча. Если вы завели сброс и в ходе симуляции у вас полезли Х-ы, то очевидно, что у каких-то триггеров, которые требуют сброс, он описан неверно или не описан вовсе. В моём понимание это ошибка. Нет никакой необходимости сбрасывать каждый регистр, но при разработке дизайна надо определить какие регистры сбросить надо и описать этот сброс (синхронный или асинхронный, в зависимости от задачи/убеждений/пожеланий). Инициализацию переменных при объявлении стараюсь делать только в тест-бенчах.

Я имею ввиду именно начальную инициализацию. И прежде всего сигналов, на которые не заведен ресет.

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


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

Я имею ввиду именно начальную инициализацию

А какая, простите, ещё бывает инициализация? ;)

 

И прежде всего сигналов, на которые не заведен ресет.

Если из-за такого сигнала происходит "размножение" Х-ов, то очевидно, что ресет на него завести следует. Это например счётчики и аккумуляторы. А если это регистр, который хранит результат умножения или сложения двух других сигналов к примеру, то сбрасывать его не нужно, а на Х-ы в самом начале симуляции можно не обращать внимание. С другой стороны в таких вот случаях Х-ы это даже хорошо. Потому что они позволяют а) оценить когда схема "пошла", т.е. когда результат можно анализировать, до этого её выход считаем хламом и б) отследить регистры накопители, на которые забыли добавить сброс.

 

Кстати ещё один момент. При симуляции шин с множественным доступом по адресу бывает очень полезным выставлять в данные Х-ы, когда нет сигнала валидности, т.к. это позволяет отследить ошибки работы с шиной. Если в целевом модуле ни с того ни с сего появились Х-ы, значит модуль неверно отрабатывает операции на шине. Х-ы в данном случае являются аналогами мусора, который валит по загруженным шинам вроде Авалона или AXI в отсутствии валидности данных.

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


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

Если из-за такого сигнала происходит "размножение" Х-ов, то очевидно, что ресет на него завести следует.

Категорически не согласен. Простой пример:

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 может быть использован "для дела".

 

При симуляции шин с множественным доступом по адресу бывает очень полезным выставлять в данные Х-ы, когда нет сигнала валидности.

Спасибо, учту.

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


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

В данном частном случае можно сделать инициализацию под дефайном, т.е. если код для синтеза, то инициализацию не делать, если для симулятора - то делать. В верилоге это что-то вроде `ifndef SYNTHESIS, при этом дефайн SYNTHESIS глобальный, что позволяет легко переключать весь проект между синтезируемым и симулируемым. Как в VHDL такое делается, я не помню, но думаю, что подобным же образом. Кроме инициализаций под `ifndef SYNTHESIS можно поместить ещё много полезного, с чем будет работать только симулятор. Впрочем это моё ИМХО.

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


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

вот нет что бы использовать vcom/vlog +initreg+0 и vsim +initreg+0 всякие ресеты вводят, логику раздувающие ....

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


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

а что плохого всем регистрам и сигналам задать правильное начальное значение?

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


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

Категорически не согласен. Простой пример:

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, чтобы точно быть уверен в начальных значения.

Да, кажется по умолчанию все регистры в ПЛИС программируются в нулевое состояние, но все таки...

 

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


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

Если прописать начальные значения триггерам это дополнительных ресурсов не съест, а проблем, в частности с симуляцией, убавится. И не нужно никаких дефайнов для синтеза/симуляции - Вы ничего не экономите.

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


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

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" *), то синтезатор завалит вас предупреждениями о том, что асинхронный сброс порта адреса в цикле чтения может повредить содержимое памяти.

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


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

SIGNAL zzz_OOUT : std_logic:='0';

чем так плохо объявлять сигнал?

 

Слышал, что для ASIC эта фишка не сработает. Но так как не программировал, то не знаю.

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


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

Слышал, что для ASIC эта фишка не сработает. Но так как не программировал, то не знаю.

правильно, это ж только для симуляции ;)

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


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

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

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

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

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

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

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

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

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

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