Общие переменные UVM

У меня есть сомнения по поводу УВМ. Предположим, у меня есть DUT с двумя интерфейсами, каждый со своим агентом, генерирующим транзакции с одними и теми же часами. Эти транзакции обрабатываются с помощью импорта анализа (и функций записи) на табло. Моя проблема в том, что обе эти транзакции читают/изменяют общие переменные табло.

Мои вопросы:

1) Должен ли я явно гарантировать взаимное исключение через семафор? (полагаю да)

2) Это вообще правильный путь?

3) и основная проблема, можно ли как-то зафиксировать порядок выполнения?

В зависимости от этого порядка значения общих переменных могут изменяться, что приводит к несогласованности. Более того, этот порядок фиксируется спецификациями.

Заранее спасибо.


person arandomuser    schedule 19.10.2014    source источник


Ответы (4)


Хотя задачи и функции SystemVerilog выполняются одновременно, они не выполняются параллельно. Важно понимать разницу между параллелизмом и параллелизмом, и она хорошо объяснена здесь .

Таким образом, несмотря на то, что задача или функция SystemVerilog может выполняться одновременно с другой задачей или функцией, на самом деле она фактически не запускается одновременно (контекст времени выполнения). Планировщик SystemVerilog хранит список всех задач и функций, которые должны выполняться в одно и то же время моделирования, и в это время он выполняет их одну за другой (последовательно) на одном и том же процессоре (параллелизм), а не вместе на нескольких процессорах ( параллелизм). В результате взаимное исключение является неявным, и вам не нужно использовать семафоры для этой учетной записи.

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

Если спецификации требуют определенного порядка выполнения, вам необходимо обеспечить этот порядок, заставив одну из этих задач/функций ожидать другую. В вашем примере с табло, поскольку вы используете порт анализа, у вас будут две функции «записи» (возможно, с использованием макроса uvm_analysis_imp_decl), выполняющиеся одновременно. Чтобы обеспечить порядок (поскольку функции не могут ждать), вы можете разветвить потоки join_none и заставить один из потоков ждать другого, введя событие, которое запускается при завершении первого потока, а другой поток ожидает этого события. на старте.

person Puneet Goel    schedule 19.10.2014

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

Семафоры помогают вам только в том случае, если у вас есть параллельные потоки, которые занимают время (симуляции) и пытаются получить доступ к общему ресурсу. Если вы получаете вещи из порта анализа, то вы получаете их в 0 раз, поэтому семафоры вам здесь не помогут.

person Tudor Timi    schedule 19.10.2014

Насколько я понимаю, ответ таков: компилятор/поставщик/uvm не может обеспечить порядок выполнения. Если вам нужно обеспечить порядок, который на самом деле происходит на одном и том же временном шаге, вам нужно правильно использовать семафор, чтобы он работал так, как вы хотите. Другое дело, что только вы сами знаете, какие из них должны выполняться после других, если они находятся в одном и том же времени симуляции.

person awill    schedule 11.12.2014

это классическое состояние гонки, когда результат зависит от фактического порядка потоков...

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

  • если доступ не является атомарным, вам может понадобиться семафор, чтобы гарантировать, что только один доступ обрабатывается за раз, а следующий ждет, пока не завершится первый.

  • вы также можете попытаться управлять порядком, изменив структуру или введя порядок потоков (wait_order) или, если возможно, вы вообще удалите время (здесь вместо того, чтобы напрямую работать с данными, которые вы получаете, вы просто сохраняете данные в течение некоторого времени, а затем позже вы работаете в теме.

person uwes    schedule 09.12.2015