Добавление формы волны абстрактного класса - PullRequest
0 голосов
/ 27 мая 2019

У меня есть абстрактный класс с четырьмя дочерними классами. В Modelsim (SE 10.5b) я хочу добавить некоторые формы сигналов, какой бы дочерний элемент в данный момент не активен. это может измениться во время симуляции. В своих экспериментах я обнаружил, что при использовании команды add wave при первом вызове делается снимок и запоминается, какой дочерний элемент был активным в данный момент. Все будущие вызовы добавления волны будут относиться к этому ребенку, даже если ребенок тем временем изменился.

Я пробовал как добавлять через код TCL, так и через просмотрщик экземпляров класса. Через просмотрщик экземпляров класса я получаю ошибки в построении пути; См. Первый пример кода ниже, включая соответствующую ошибку. Эта команда автоматически генерируется при использовании окна экземпляра класса.

Когда я удаляю секцию super., она добавляет волну, но эта волна всегда относится к дочернему элементу «снимка».

Строка ошибки:

add wave sim:/@spi_test@1.super.m_spi_env.current_driver.super.name

Error: Child not found while constructing path expression: super

«Правильная» строка (всегда относится к «дочернему снимку»):

add wave sim:/@spi_test@1.super.m_spi_env.current_driver.name

Я бы хотел, чтобы форма волны изменяла, к какому дочернему элементу она относится внутри, всякий раз, когда этот дочерний элемент изменяется в коде. В настоящее время он просто выдает пустую волну, когда текущий дочерний элемент не равен «дочернему снимку».

Обходной путь, с которым я мог бы работать, был бы, например. добавление строки в скрипт TCL, чтобы сказать modelsim переоценить этих потомков. (Я пытался найти его в справочном руководстве по командам, но не смог найти такую ​​вещь).


Я больше играл с ним, пытаясь сделать MCVE, и обнаружил, что это гораздо более сложная проблема, чем я думал. Насколько я могу судить, я получил все, что имеет отношение к MCVE, за исключением интеграции в UVM, и проблема не возникает при попытке MCVE.

Ниже я расскажу еще немного кода из используемого мной сценария TCL и соответствующих им форм сигналов, возможно, это заставит задуматься об одном из вас. Тем временем я продолжу пытаться придумать, что добавить в MCVE-попытку, что не является уву, и надеюсь, что проблема начнет проявляться.

add wave -expand -label "Attempt global" sim:/@spi_basic_test@1.super.m_spi_env.m_spi.m_dri.current_driver
# add wave -expand -label "Attempt global" sim:/@spi_basic_test@1.super.m_spi_env.m_spi.m_dri.current_driver.super.name
add wave -expand -label "Attempt from test" sim:/@spi_basic_test@1.super.m_spi_env.m_spi.m_dri.current_driver.name
add wave -expand -label "Attempt from env"  sim:/@spi_env@1.m_spi.m_dri.current_driver.name
add wave -expand -label "Attempt from agt"  sim:/@spi_agent@1.m_dri.current_driver.name
add wave -expand -label "Attempt from dri"  sim:/@spi_uvm_driver__1@1.current_driver.name

Первая строка, «Попытка глобального», необходима по некоторым причинам; без этой строки или закомментированной строки требуется для предотвращения ошибки «объект не найден» (vish-4014). Обратите внимание, что если от меня потребуется пропустить .super во всех последующих вызовах, в противном случае modelsim выдаст ошибку «Не найден дочерний элемент», показанную выше.

Следующий скриншот - результат моих сигналов: https://i.stack.imgur.com/DHQTE.png

Как видно, самый первый сигнал обновляется правильно. Тем не менее, он не показывает ни одного из членов этого класса, что я пытаюсь получить. Любая попытка получить прямой доступ к этим членам теряет из виду членов класса, когда текущий водитель (вышеупомянутый ребенок) выключен. Только когда исходная форма волны снова включена, волны продолжаются. Ниже приведены две строки кодов, которые печатаются для расшифровки при выборе нового дочернего элемента. Это строки 51 и 52 в файле spi_uvm_driver.sv, который в агенте создается как m_dri. Таким образом, команды add wave выше ссылаются на эту же переменную current_driver. Есть аналогичные строки для других дочерних опций. Я использую два уровня операторов if, чтобы выбрать, какой дочерний элемент подходит для выбора, на основе транзакции конфигурации.

current_driver = driver_4_02;
`uvm_info(get_type_name(),$sformatf("New driver selected, now selecting : %s", current_driver.name), UVM_MEDIUM)

И полученная расшифровка:

UVM_INFO /home/../verification/agents/spi/spi_uvm_driver.sv(52) @ 499992: uvm_test_top.m_spi_env.m_spi.spi_uvm_driver [spi_uvm_driver] New driver selected, now selecting : driver_4_02
UVM_INFO /home/../verification/agents/spi/spi_uvm_driver.sv(61) @ 1249980: uvm_test_top.m_spi_env.m_spi.spi_uvm_driver [spi_uvm_driver] New driver selected, now selecting : driver_3_02
UVM_INFO /home/../verification/agents/spi/spi_uvm_driver.sv(55) @ 1624974: uvm_test_top.m_spi_env.m_spi.spi_uvm_driver [spi_uvm_driver] New driver selected, now selecting : driver_4_13
UVM_INFO /home/../verification/agents/spi/spi_uvm_driver.sv(64) @ 1999968: uvm_test_top.m_spi_env.m_spi.spi_uvm_driver [spi_uvm_driver] New driver selected, now selecting : driver_3_13
UVM_INFO /home/../verification/agents/spi/spi_uvm_driver.sv(52) @ 2374962: uvm_test_top.m_spi_env.m_spi.spi_uvm_driver [spi_uvm_driver] New driver selected, now selecting : driver_4_02
UVM_INFO /home/../verification/agents/spi/spi_uvm_driver.sv(61) @ 2749956: uvm_test_top.m_spi_env.m_spi.spi_uvm_driver [spi_uvm_driver] New driver selected, now selecting : driver_3_02

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

И снова: я работаю над MCVE, но мне еще предстоит найти фрагмент кода, который его нарушает; Я боюсь, что это может быть что-то или внутри UVM, или в сотрудничестве с UVM, так как я не могу придумать никакого дополнительного кода, который не является UVM, чтобы добавить к MCVE-попытке.

...