В Verilog процедурный интерфейс, можно ли сканировать через цикл итерации несколько раз?

Мы можем использовать 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, когда я закончу? Я думаю, что могу решить проблему, используя дополнительный контейнер (для сбора и хранения всех записей), но действительно ли это необходимо?

РЕДАКТИРОВАТЬ: 1. Я не хотел бы вызывать vpi_iterate более одного раза, так как это может быть дорого. 2. Предположим, я иду с дополнительным контейнерным решением. Есть ли способ узнать количество записей в цикле vpi_scan без фактического сканирования в цикле? Это может сделать реализацию проще.

1 ответ

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

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

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

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

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

Другие вопросы по тегам