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

Дорогие друзья,

Вот недавно стал работать софтом 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.

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

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


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

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) не видает.

А где ошибка?

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


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

ActiveHDL, скорее всего, просто оптимизирует до нуля.

Ошибка, как минимум одна. И ,должно быть, как минимум 2 предупреждения времени синтеза.

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


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

 

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 блоке можно регистру присвоить значение. И это правильно.

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

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


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

ActiveHDL, скорее всего, просто оптимизирует до нуля.

Ошибка, как минимум одна.

В чем ошибка? В том, что присваивание объекту в разных блоках? Это синтезаторы такое не пропускают (и правильно), но с точки зрения языка Верилог разве это ошибка?

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


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

В чем ошибка? В том, что присваивание объекту в разных блоках? Это синтезаторы такое не пропускают (и правильно),

Не факт.Синплифай с удовольствием синтезит такие конструкции( во всяком случае на VHDL, присваивание в разных процессах понимает).

Хотя с точки зрения читабельности кода мне такое не нравится.

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


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

В чем ошибка? В том, что присваивание объекту в разных блоках? Это синтезаторы такое не пропускают (и правильно),

Не факт.Синплифай с удовольствием синтезит такие конструкции( во всяком случае на VHDL, присваивание в разных процессах понимает).

Хотя с точки зрения читабельности кода мне такое не нравится.

Присваиваине одному и тому же объекту в разных параллельно исполняемых блоках с симуляторе чревато гонками и неопредленным результатом - завист от того, какой блок симулятор раньше обрабатывает. Это может быть семантической ошибкой, но не ошибкой языка, насколько я знаю, поэтому симулятор тут максимум может выдать предупреждение, но код обязан компилять.

 

А вот при синтезе картина другая - представьте, что в одни и тот же триггер одновременно на вход D подаются разные по значению сигналы - какой использовать? Т.ч. с точки зрения имплементации на FPGA - это ошибка, и Синплифай, насколько помню, на это ругаецца и не синтезит такие вещи.

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


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

Синплифай с удовольствием синтезит такие конструкции( во всяком случае на 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, сорри :( Не увидел Ваш пост и фактически написал тоже самое.

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


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

PS dxp, сорри :( Не увидел Ваш пост и фактически написал тоже самое.

Да ерунда, не стоит обращать внимание. А Вы как считаете, с точки зрения языка Верилог есть ошибка? Должен ли симулятор ругацца? :)

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


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

Думаю, что Вы что-то перепутали.

возможно.щас проверил- не синтезит.

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


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

А Вы как считаете, с точки зрения языка Верилог есть ошибка? Должен ли симулятор ругацца? :)

Думаю, что для симулятора ошибок нет - сигналы типа reg хранят присвоенные значения. Например, я часто в тесбенчах задаю начальные неактивные значения сигналов в initial-блоке, а потом в другом блоке (initial или always) уже формирую нужные waveforms - никогда ошибок и предупреждений не было (хотя м.б. у меня у моделсима стоит слишком высокий warning level, так что в принципе симулятор мог бы выдавать предупреждение - но это на усмотрение авторов моделсима). А ведь на этапе компиляции моделсим видит, что сигнал изменяется в разных блоках.

 

shems написал, что моделсим не позволяет изменять сигнал в разных always-блоках. Это очень странно, и я не уверен, что он прав.

 

В приведенном в 1 посте примере, когда 2 блока срабатывают одновременно, как Вы и написали - чистейший race condition.

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


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

Приветствую!

 

К сожалению симулятор в 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;

.....

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


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

Вот гадость. Оказывается, что актив и квеста глотают этот код так, что за ушами трещит.

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

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


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

Думаю, что Вы что-то перепутали.

возможно.щас проверил- не синтезит.

Интересно! Моделсим выдает Error, a ActiveHDL net.

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


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

Дааа....! Modelsim выходит лудше!!! Мне в Active signal browser очень понравился. Сигналы каждего модуля SOC можно анализироват в отдельном листе а курсор и текушее время анализа-один. Очень удобно при анализе сигналов, скажем, бысто перейти из модуля CPU в модуль UART, и курсор будит паказивать тот момент, который анализировался в модуле CPU. В ModelSime между разными Wave Widow -ами нету "связи" курсора, что затрудняет процесс анализа сигналов SOC системы. Может есть решения или скрипты для етого?

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

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


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

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

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

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

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

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

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

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

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

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