Можно ли в процедурном интерфейсе Verilog сканировать через итерационный цикл несколько раз? - PullRequest
0 голосов
/ 20 ноября 2018

Мы можем использовать vpi_scan следующим образом:

vpiHandle iter = vpi_iterate(property, handle);
if (iter)
  while ( entry = vpi_scan(iter) )
    /*code*/;

iter будет освобожден, когда vpi_scan () вернет NULL. Но что, если мне нужно несколько раз просмотреть петлю? Есть ли способ сказать vpi_scan не освобождать итератор, чтобы я мог vpi_free_object, когда я закончу? Я думаю, что могу решить проблему, используя дополнительный контейнер (для сбора и хранения всех записей), но действительно ли это необходимо?

EDIT: 1. Я не хотел бы вызывать vpi_iterate более одного раза, так как это может быть дорого. 2. Предположим, я иду с дополнительным контейнерным решением. Есть ли способ узнать количество записей в цикле vpi_scan без фактического сканирования в цикле? Это может упростить реализацию.

1 Ответ

0 голосов
/ 20 ноября 2018
  1. но что если мне нужно несколько раз просмотреть цикл? vpi_iterate возвращает инициализированный указатель на итератор. Каждый vpi_scan удаляет элемент из списка и освобождает его. Если vpi_scan не запустился до конца, лучше использовать vpi_free_object для очистки остальной части списка итераторов. Если вам нужно повторно сканировать тот же объект еще раз, вы можете снова вызвать vpi_iterate, и он вернет новый объект итератора, который вы можете повторно просмотреть.

  2. s есть способ сказать vpi_scan не освобождать итератор, чтобы я мог vpi_free_object, когда я закончил? Нет, (1) единственный механизм, который можно использовать для доступ и бесплатные элементы итератора. В стандарте не существует ничего другого.

  3. Я думаю, что могу решить проблему, используя дополнительный контейнер (для сбора и хранения всех записей), но действительно ли это необходимо? - это хорошая идея, если вы хотите повторно -сканировать ваши данные структуры. Это может быть намного лучше с точки зрения производительности. В симуляторе Verilog обычно есть отдельно сгенерированная база данных vpi, к которой нужно обращаться, возможно, несколько раз, чтобы предоставить вам информацию о доступе vpi.

  4. Есть ли способ узнать количество записей в цикле vpi_scan без фактического сканирования в цикле? не совсем. не существует определенного способа запроса этой информации от итератора. Можно использовать обходной путь с использованием vpi_handle(vpiUse, iterator), но это зависит от базовых данных и типа итерации. Гораздо проще использовать связанные списки, созданные в первом цикле сканирования.

Вы можете получить всю дополнительную информацию для LRM или справочник verilog pli .

...