shems 0 31 марта, 2006 Опубликовано 31 марта, 2006 (изменено) · Жалоба Дорогие друзья, Вот недавно стал работать софтом Active-HDL. До этого только с ModelSim -ом. Многое понравилось в ActiveHDL-е, но иногда встречаю там "глюки", типа этого ....... reg reg1; wire a, b; always @(posedge clk) begin if( a ) reg1 <= 1'b0; else reg1 <= 1'b0; end always @(posedge clk) begin if( b ) reg1 <= 1'b0; else reg1 <= 1'b0; end Это ошибка, но ActiveHDL нечего не видит и ошибку (warnning, or Error) не видает. Я бы хотел узнать ваши мнения, какой из этих тулов годится для коммерческих проектов, и вообше, воши мнения. ModelSim- вроде стандартний EDA тул, но много IP Core-ов на ринке, которые продаются со скриптами только для ActiveHDL. Изменено 31 марта, 2006 пользователем shems Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 31 марта, 2006 Опубликовано 31 марта, 2006 · Жалоба reg reg1; wire a, b; always @(posedge clk) begin if( a ) reg1 <= 1'b0; else reg1 <= 1'b0; end always @(posedge clk) begin if( b ) reg1 <= 1'b0; else reg1 <= 1'b0; end Это ошибка, но ActiveHDL нечего не видит и ошибку (warnning, or Error) не видает. А где ошибка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 31 марта, 2006 Опубликовано 31 марта, 2006 · Жалоба ActiveHDL, скорее всего, просто оптимизирует до нуля. Ошибка, как минимум одна. И ,должно быть, как минимум 2 предупреждения времени синтеза. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shems 0 31 марта, 2006 Опубликовано 31 марта, 2006 (изменено) · Жалоба reg reg1; wire a, b; always @(posedge clk) begin if( a ) reg1 <= 1'b0; else reg1 <= 1'b0; end always @(posedge clk) begin if( b ) reg1 <= 1'b0; else reg1 <= 1'b0; end Это ошибка, но ActiveHDL нечего не видит и ошибку (warnning, or Error) не видает. А где ошибка? ModelSim выдает ошибку: только в одном always блоке можно регистру присвоить значение. И это правильно. Изменено 31 марта, 2006 пользователем shems Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 31 марта, 2006 Опубликовано 31 марта, 2006 · Жалоба ActiveHDL, скорее всего, просто оптимизирует до нуля. Ошибка, как минимум одна. В чем ошибка? В том, что присваивание объекту в разных блоках? Это синтезаторы такое не пропускают (и правильно), но с точки зрения языка Верилог разве это ошибка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MadMakc 0 31 марта, 2006 Опубликовано 31 марта, 2006 · Жалоба В чем ошибка? В том, что присваивание объекту в разных блоках? Это синтезаторы такое не пропускают (и правильно), Не факт.Синплифай с удовольствием синтезит такие конструкции( во всяком случае на VHDL, присваивание в разных процессах понимает). Хотя с точки зрения читабельности кода мне такое не нравится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба В чем ошибка? В том, что присваивание объекту в разных блоках? Это синтезаторы такое не пропускают (и правильно), Не факт.Синплифай с удовольствием синтезит такие конструкции( во всяком случае на VHDL, присваивание в разных процессах понимает). Хотя с точки зрения читабельности кода мне такое не нравится. Присваиваине одному и тому же объекту в разных параллельно исполняемых блоках с симуляторе чревато гонками и неопредленным результатом - завист от того, какой блок симулятор раньше обрабатывает. Это может быть семантической ошибкой, но не ошибкой языка, насколько я знаю, поэтому симулятор тут максимум может выдать предупреждение, но код обязан компилять. А вот при синтезе картина другая - представьте, что в одни и тот же триггер одновременно на вход D подаются разные по значению сигналы - какой использовать? Т.ч. с точки зрения имплементации на FPGA - это ошибка, и Синплифай, насколько помню, на это ругаецца и не синтезит такие вещи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gate 0 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба Синплифай с удовольствием синтезит такие конструкции( во всяком случае на VHDL, присваивание в разных процессах понимает). Думаю, что Вы что-то перепутали. Ни один синтезатор не позволяет изменять сигнал в разных процессах, поскольку не знает, что синтезировать. Пример always @(posedge clk) begin if (a) reg1 <= 1'b1; else reg1 <= 1'b0; end always @(posedge clk) begin if (b) reg1 <= 1'b1; else reg1 <= 1'b0; end при a=1 и b=0 какой будет reg1? PS dxp, сорри :( Не увидел Ваш пост и фактически написал тоже самое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба PS dxp, сорри :( Не увидел Ваш пост и фактически написал тоже самое. Да ерунда, не стоит обращать внимание. А Вы как считаете, с точки зрения языка Верилог есть ошибка? Должен ли симулятор ругацца? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MadMakc 0 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба Думаю, что Вы что-то перепутали. возможно.щас проверил- не синтезит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gate 0 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба А Вы как считаете, с точки зрения языка Верилог есть ошибка? Должен ли симулятор ругацца? :) Думаю, что для симулятора ошибок нет - сигналы типа reg хранят присвоенные значения. Например, я часто в тесбенчах задаю начальные неактивные значения сигналов в initial-блоке, а потом в другом блоке (initial или always) уже формирую нужные waveforms - никогда ошибок и предупреждений не было (хотя м.б. у меня у моделсима стоит слишком высокий warning level, так что в принципе симулятор мог бы выдавать предупреждение - но это на усмотрение авторов моделсима). А ведь на этапе компиляции моделсим видит, что сигнал изменяется в разных блоках. shems написал, что моделсим не позволяет изменять сигнал в разных always-блоках. Это очень странно, и я не уверен, что он прав. В приведенном в 1 посте примере, когда 2 блока срабатывают одновременно, как Вы и написали - чистейший race condition. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба Приветствую! К сожалению симулятор в Aldec хуже чем Modelsim. Медлнней работает (особенно на больших проектах) да еще и напарываешься на различные глюки. Например, приведенный ниже код симулируется не правильно. При очередном Clk значение регистра rB равно текущему! значению D , а не предыдущему значению rA. Причем проявляется это в зависимости от "настроения" симулятора во время компиляции исходников. Бывало перестановка строк меняет результаты симуляции :( А присваивать регистру значения в разных блоках можно для симуляции, но не для синтеза. Успехов! Rob. ... input Clk; input [15:0] D; wire wCl; reg [15:0] rA,rB; always @(posedge Clk) rA<=D; assign wCl=Clk; //!!! если написать так - аssign #1 wCl=Clk; то симулируется всегда правильно always @(posedge wCl) rB<=rA; ..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба Вот гадость. Оказывается, что актив и квеста глотают этот код так, что за ушами трещит. Причем верно утверждение, что синтезатор нормально проглатывает оригинальный код, когда происходит оптимизация на ноль. При устранении этого условия синтезатор выдает ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shems 0 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба Думаю, что Вы что-то перепутали. возможно.щас проверил- не синтезит. Интересно! Моделсим выдает Error, a ActiveHDL net. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shems 0 1 апреля, 2006 Опубликовано 1 апреля, 2006 (изменено) · Жалоба Дааа....! Modelsim выходит лудше!!! Мне в Active signal browser очень понравился. Сигналы каждего модуля SOC можно анализироват в отдельном листе а курсор и текушее время анализа-один. Очень удобно при анализе сигналов, скажем, бысто перейти из модуля CPU в модуль UART, и курсор будит паказивать тот момент, который анализировался в модуле CPU. В ModelSime между разными Wave Widow -ами нету "связи" курсора, что затрудняет процесс анализа сигналов SOC системы. Может есть решения или скрипты для етого? Изменено 1 апреля, 2006 пользователем shems Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться