#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