Ошибка разрешения межмодульной ссылки из инструкции SV wait

#system-verilog

Вопрос:

Я хотел дождаться выходной переменной задачи.
например: wait(user_defined_task_name(output_variable_type_name) == 1)

В этом примере, показанном ниже, я намерен сделать wait оператор активным с 0 до 3 дней (в основном с начала метки времени до t2=1).

Вот рабочий пример;

 class cl;  task run(output bit t);  $display("time=%0t , t=",$realtime, t);   #1;  $display("time=%0t , t=",$realtime, t);   #2;  t = 1;  $display("time=%0t , t=",$realtime, t);   endtask endclass  class c2 extends cl;  bit t2;  task run1();  wait(run(t2) == 1); // error from this line, what am i violating here?  $display("t2 working t2= time = %0t", t2, $realtime);    endtask endclass  module tmp;  c2 c2_h=new;  initial begin   c2_h.run1();  $display("test msg");  end endmodule  

журнал выходных данных eda:

Модули верхнего уровня: шкала времени tmp составляет 1 нс / 1 нс

Ошибка-[XMREF] Ошибка разрешения межмодульной ссылки testbench.sv, Найдена ошибка 19 межмодульного эталонного разрешения. Функция ожидается, но фактическая цель не является функцией. Исходная информация: запуск(this.t2)

1 ошибка Время процессора: .116 секунд для компиляции кода выхода ожидаемое: 0, получено: 1

Ответ №1:

Пара проблем с вашим кодом. A task не возвращает значение и не может быть использовано в выражении. Вы можете назвать это только самостоятельным утверждением. Но если вы перейдете run на function функции, это не займет много времени.

В вашем конкретном примере вы не изменяете значение t аргумента до конца задачи, а output аргументы копируются при выходе из задачи, поэтому вы можете просто вызвать задачу run(t2) как оператор, и она будет заблокирована до возвращения.

 task run1();  run(t2);  $display("t2 working t2= time = %0t", t2, $realtime);  endtask  

Если, с другой стороны run , установить t аргумент где-то в середине задачи, и вы хотите продолжить выполнение run1 задачи, как только это произойдет, вместо этого вам пришлось бы использовать аргумент a fork/join_none и ref аргумент.

 class cl;  task run(ref bit t);  $display("time=%0t , t=",$realtime, t);   #1;  $display("time=%0t , t=",$realtime, t);   #2;  t = 1;  #2;  $display("time=%0t , t=",$realtime, t);   endtask endclass  class c2 extends cl;  bit t2;  task run1();  fork  run(t2);  join_none  wait(t2 == 1);  $display("t2 working t2= time = %0t", t2, $realtime);    endtask endclass  

Комментарии:

1. «Задача не возвращает значение и не может быть использована в выражении». — отвечает на мой вопрос. Бонусные очки отнимают; (1) задание в виде инструкции блокируется до возвращения, (2) Я также могу заставить вещи работать одновременно, используя fork join_none и ref . Спасибо!

Ответ №2:

Когда я запускаю ваш код на симуляторе каденции, я получаю другое сообщение:

 xmvlog: *E,INVCTX The task 'run' cannot be used in this context.  

Использование nchelp утилиты для получения дополнительной информации об этом сообщении:

Функция task или void не может быть передана в качестве фактического аргумента, поскольку они не возвращают значение, которое можно использовать. Они также не могут использоваться как часть выражения.

В вашем простом примере, похоже, нет необходимости использовать wait . Вы можете просто вызвать задачу самостоятельно:

 task run1();  run(t2);  $display("t2 working t2= time = %0t", t2, $realtime);   endtask