novartis
Aug 24 2010, 01:46
Доброе утро всем, вот возникла следующая проблема.
Работаю над проектом в Quartus 9.1 Service Pack 2 на VHDL.
Проект вспомогательный, для симуляции и отладки в квартусовском симуляторе основного проекта.
На какой-то стадии проект компилится и удачно симулируется в соответствии с заложенной логикой работы.
В проект постоянно что то добавляю, новые куски программы, оптимизирую
(как могу, с языком VHDL знаком меньше года). Иногда после изменений проект перестает симулироваться.
Компилируется нормально, а в симуляторе выходные сигналы нули.
В этой ситуации экспериментально установил помогает следующее:
если в выходные сигналы добавить какой-либо один сигнал
qwerty : out std_logic_vector (31 downto 0), то в симуляторе все замечательно.
Если продолжать менять что то в программе, то симуляция опять может сломаться.
Тогда мне помагает удаление этого сигнала qwerty.
В последний раз добавление сигнала qwerty шириной 32 бит мне не много.
Я его последовательно увеличивал (с шагом в 50).
Симуляция прошла успешно после того как сигнал qwerty стал шириной 158 бит.
Сам этот сигнал ну никуда не идет, ничто ему не присваивается.
Что это может быть? баг, глюк, или мой косяк в программе?
Буду благодарен за ответы.
Shtirlits
Aug 24 2010, 05:38
Ну, всегда можно сменить симулятор, а иногда можно разобраться в чем дело.
Разбираться удобнее на мой взгляд, когда есть простая, наглядная демонстрация.
В идеале это два файла в 10 строк с отличием в одной букве, один нормальный, воторой глючный.
Мне нравится получать такие файлы по методу юных любителей природы "оторвали мушке лапку - жужжит мушка".
И так пока не останется минимум. Тогда и тут вам быстрее подскажут и в support не стыдно заслать.
S_Hawk
Aug 24 2010, 16:22
я в подобных непонятных ситуациях удаляю каталоги db и incremental_db, после чего перекомпилирую проект.
если глюк повторяется, то ищу его причину. Других танцев с бубнами не пробовал...
novartis
Aug 24 2010, 16:54
Пробовал собирать проект с нуля, и на другой машине. Глюки не исчезли.
novartis
Aug 24 2010, 16:54
Мои подозрения заключаются в строчках вида:
process (freq)
begin
if (rising_edge(freq)) then
if (flag='1') then
w(128 downto 0) <= q(128 downto 0);
else
w(128 downto 0) <= r(128 downto 0);
end if;
end process;
т.е. по идеи такие конструкции лучше выносить за пределы процесса, но логика в проекте сложная, пытаюсь ее упростить, а симулятор либо глючит (присваивает сигналу w совсем не то, что мне надо), либо вообще в сигнале w нули получаются на выходе.
P.S.: Когда писал код случайно нажимал табуляцию и пробел, поэтому сырое сообщение отправилось несколько раз.
Shtirlits
Aug 24 2010, 18:35
Я не понял, какие конструкции лучше выносить за пределы процесса?
Я правильно понимаю, что тактовый сигнал "freq" дрыгается, а векторы q и r к моменту фронта в нужных битах определны?
1. не хватает одного end if;
а идеальный или временной не проходит. Попробуйте сначала один, потом второй, я за квартусом не замечал таких глюков.
если не работает временной, то возможно вы не успеваете по времени.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.