2014-10-19 3 views
4

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

Мои вопросы:

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

2) Это, в общем, правильный способ продолжения?

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

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

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

ответ

0

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

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

2

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

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

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

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

0

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

0

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

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

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

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