andrew_b 17 2 августа, 2006 Опубликовано 2 августа, 2006 (изменено) · Жалоба Многие утверждают, что, мол, на списки чувствительности процесса в VHDLсинтезатор не смотрит. Был немало удивлен, когда своими глазами увидел, что Квартусовский синтезатор (как минимум, 5.1sp2) на списки чувствительности смотрит не так, как смотрю я. Взгляните на такойпроцесс: process(r, c) begin if (r = '1') then o0 <= '0'; elsif (rising_edge(c)) then o0 <= i0; o1 <= i1; end if; end process; Я по наивности рассчитывал на то, что для o1 будет синтезирован D-триггер, которому на вход D приходит i0, а на вход C -- тактовый сигнал. И все. Ан не тут-то было. Квартус еще на вход ENA заводит проинвертированный сигнал сброса r. В общем-то не смертельно, но неаккуратненько как-то... Мне эта лишняя веревка сршенно не нужна. В итоге сделал два процесса: один с асинхронным сбросом для o0, второй -- чисто синхронный без сброса для o1. Поэтому, если не хотите неожиданностей, не давайте синтезатору слишком много свободы. Пишите процессы так, чтобы все сигналы, перечисленные в списке чувствительности, в явном виде использовались для генерации всех сигналов в процессе. Как там в Verilog, не знаю. Другие синтезаторы не пробовал. Изменено 2 августа, 2006 пользователем andrew_b Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 2 августа, 2006 Опубликовано 2 августа, 2006 · Жалоба забавно )) а может дело в том,что все в одном if'е запихано? мол если клок общий,то и ресет? а если два if в одном процессе? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oval 0 2 августа, 2006 Опубликовано 2 августа, 2006 · Жалоба Многие утверждают, что, мол, на списки чувствительности процесса в VHDLсинтезатор не смотрит. Был немало удивлен, когда своими глазами увидел, что Квартусовский синтезатор (как минимум, 5.1sp2) на списки чувствительности смотрит не так, как смотрю я. Взгляните на такойпроцесс: process(r, c) begin if (r = '1') then o0 <= '0'; elsif (rising_edge(c)) then o0 <= i0; o1 <= i1; end if; end process; Я по наивности рассчитывал на то, что для o1 будет синтезирован D-триггер, которому на вход D приходит i0, а на вход C -- тактовый сигнал. И все. Ан не тут-то было. Квартус еще на вход ENA заводит проинвертированный сигнал сброса r. В общем-то не смертельно, но неаккуратненько как-то... Мне эта лишняя веревка сршенно не нужна. В итоге сделал два процесса: один с асинхронным сбросом для o0, второй -- чисто синхронный без сброса для o1. В данном случае синтезатор абсолютно прав. Он синтезировал то, что Вы описали. Причина кстати не в списке чувствительности процесса, а в том, что присвоение сигнала "o1" производиться не во всех ветвях условия. Получается, что при высоком "r", вне зависимости от фронта "c", требуется сохранить прежнее значение "о1". Синтезатор честно создает схему для выполнения этой функции. Большинство синтезаторов сообщает о такого рода ситуации предупреждением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jools 0 2 августа, 2006 Опубликовано 2 августа, 2006 (изменено) · Жалоба В общем-то не смертельно, но неаккуратненько как-то... Мне эта лишняя веревка сршенно не нужна. Просинтезировалось так, как и описывалось. ( Не описано поведение o1 при r='1' ) P.S. Очень долго отвечал. oval опередил. Изменено 2 августа, 2006 пользователем Jools Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klop 0 16 сентября, 2006 Опубликовано 16 сентября, 2006 · Жалоба Как то было такое: signal ctrl_reg : std_logic_vector(7 downto 0); xxx:process(nrst,clk) begin if(nrst='0') then ctrl_reg <= (others => '0'); elsif(clk='1' and clk'event) then ctrl_reg(ctrl_reg'high downto 1) <= ctrl_in; end if; end process; Так вот sinplify привязывал ctrl_reg(0) к нулю и все. А вот Synopsys создавал для этого бита latch(что кстати в принципе правильно) и сильно на это ругался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться