Как создать задачу, которая управляет выводом во времени без использования глобальных переменных?

Я хочу написать некоторые задачи в пакете, а затем импортировать этот пакет в некоторые файлы, которые используют эти задачи.

Одна из этих задач переключает сигнал сброса. Задачей является reset_board, а код выглядит следующим образом:

package tb_pkg;
 task reset_board(output logic rst);
 rst <= 1'b0;
 #1;
 rst <= 1'b1;
 #1;
 rst <= 1'b0;
 #1;
 endtask
endpackage

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

Если эта задача была объявлена локально в модуле, в котором она используется, я могу напрямую обратиться к rst сигналу (поскольку он объявлен в модуле). Однако это не позволило бы мне поставить задачу в отдельный пакет. Я мог бы поставить задачу в файл, а затем включить ее в модуль, но я стараюсь избегать неприятных осложнений, связанных с тем, как обрабатываются дескрипторы SystemVerilog (длинный, короткий, он не работает так, как C делает).

Итак, есть ли способ, которым задача может управлять выводом с разными значениями в течение всего времени его выполнения без необходимости ссылаться на глобальную переменную?

1 ответ

Быстрое решение - использовать ref который передает аргумент задачи по ссылке вместо output аргумента, который копируется после возвращения из задачи.

task reset_board (ref logic rst);

Есть несколько недостатков в этом. Вы можете передавать только переменные соответствующих типов по ссылке, поэтому, когда вы вызываете reset_board(*signal*), сигнал не может быть проводом. Другая проблема заключается в том, что вы не можете использовать NBA <= для назначения переменной, переданной по ссылке, вы должны использовать назначение блокировки =. Это связано с тем, что вам разрешено передавать автоматические переменные по ссылке на задание, но автоматическая переменная не разрешается назначать НБА. Невозможно проверить задачу типа хранения аргумента, переданного ему.

Стандартные методологии, такие как UVM, рекомендуют использовать виртуальные интерфейсы или абстрактные классы для создания таких соединений из тестового узла в тестируемое устройство. Для получения дополнительной информации см. Мою документацию DVCon.

licensed under cc by-sa 3.0 with attribution.