Jump to content

    
Sign in to follow this  
Krys

бага Aldec Active HDL: неверно симулирует условия с неопределёнными состояниями (x) в task

Recommended Posts

Здравствуйте. Хочу поделиться багой Aldec Active HDL: неверно симулирует условия с неопределёнными состояниями (x) в task. Ну или у меня лыжи не едут )))

 

Условия задачи:

Код с таском:

task ovfl_proc;
output res;
input  inp;
   if(rst) begin
       res <= 1'b1;
   end else begin
       if(1'bx) begin
           res <= 1'b0;
       end else begin
           res <= inp;
       end
   end
endtask
always @(*) begin
   ovfl_proc(fifo_ovfl, fifo_ovfl_r);      // output value, old value
end

 

и без таска:

 

always @(*) begin
   if(rst) begin
       fifo_ovfl <= 1'b1;
   end else begin
       if(1'bx) begin
           fifo_ovfl <= 1'b0;
       end else begin
           fifo_ovfl <= fifo_ovfl_r;
       end
   end
end

 

В момент действия сигнала rst код с таском даёт неопределённое состояние:

 

post-13271-1440037803_thumb.png

 

А код без таска даёт единицу, как и должно быть (или у меня лыжи не едут?).

 

post-13271-1440037812_thumb.png

 

Как я понимаю, согласно коду, в момент действия rst работает верхняя ветвь условия, поэтому должно быть пофигу, какие условия (определённые или нет) находятся в нижней ветви.

 

Если неопределённое состояние в условии заменить на любое определённое, то отрабатывает корректно в обоих случаях.

Share this post


Link to post
Share on other sites

Потому, что в таск не заходит rst. В sensitivity list "always @*" заходят только входы в таск.

Если используется SystemVerilog, то рекомендуют использовать "void functions".

Share this post


Link to post
Share on other sites

Спасибо за версию. Насколько я понял, всё, что не указано в шапке task, не является подставляемыми параметрами и берётся из переменных, объявленных вне task (как глобальные). Таким образом, rst в таск заходить должен, как и куча других сигналов, которые я в шапке таска не объявил (куча других сигналов у меня используется в "боевой версии", а когда я сюда выкладывал пример - упростил его до предела, чтобы выявить суть). То, что rst заходит в таск, косвенно подтверждает и то, что всё работает, как надо, если поменять условие в нижней ветви на определённое, скажем, 1'b0.

Использую pure verilog.

Share this post


Link to post
Share on other sites

Не в этом дело. Он заходит, но при симуляции изменение сигнала rst (при условии, что никакие другие сигналы не меняются) таск выполняться не будет (в этом конкретном примере).

always @(*) begin
    ovfl_proc(fifo_ovfl, fifo_ovfl_r);      // output value, old value
end

и

always @(*) begin
    ovfl_proc(fifo_ovfl, fifo_ovfl_r, rst);      // output value, old value
end

при симуляции дадут разные результаты.

Share this post


Link to post
Share on other sites

Да, Вы говорите очень логично. Но как быть с этим:

То, что rst заходит в таск, косвенно подтверждает и то, что всё работает, как надо, если поменять условие в нижней ветви на определённое, скажем, 1'b0.

 

?

Share this post


Link to post
Share on other sites

Короче завёл полностью тот же текст под функцию - проблема исчезла. Так что такой вот workarround этого бага. Если кому-то допустимо менять таск на функцию.

Share this post


Link to post
Share on other sites

И всё же ув. masics был прав. Когда переделал в функцию всё вроде бы заработало как надо. Но спустя время выяснилось, что всё равно работает не так, как хотелось. Вспомнил его подсказку, добавил список чувствительности, всё заработало.

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites
И всё же ув. masics был прав. Когда переделал в функцию всё вроде бы заработало как надо. Но спустя время выяснилось, что всё равно работает не так, как хотелось. Вспомнил его подсказку, добавил список чувствительности, всё заработало.
Хотел ещё уточнить, что ув. masics был прав, но и обозначенная мной проблема в первом сообщении тоже имеет место. А именно: когда меняем условие на 1'bx в ветке, куда симулятор никогда не зайдёт, поведение становится неправильным. А когда в этой ветке что-то определённое - то поведение предсказуемое и адекватное.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this