В 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 ответ
но что, если мне нужно сканировать через цикл несколько раз?
vpi_iterate
возвращает инициализированный указатель на итератор. каждыйvpi_scan
удаляет элемент из списка и освобождает его Еслиvpi_scan
не бежал до конца, тебе лучше использоватьvpi_free_object
очистить остальную часть списка итераторов. Если вам нужно повторно сканировать тот же объект снова, вы можете позвонитьvpi_iterate
снова, и он вернет новый объект итератора, который вы можете повторно сканировать.Есть ли способ сказать vpi_scan не освобождать итератор, чтобы я мог vpi_free_object, когда я закончу? Нет, (1) является единственным механизмом, который можно использовать для доступа и освобождения элементов итератора. В стандарте нет других.
Я думаю, что могу решить проблему, используя дополнительный контейнер (для сбора и хранения всех записей), но действительно ли это необходимо? - это хорошая идея, если вы хотите пересмотреть ваши структуры данных. Это может быть намного лучше с точки зрения производительности. В симуляторе Verilog обычно есть отдельно сгенерированная база данных vpi, к которой нужно обращаться, возможно, несколько раз, чтобы предоставить вам информацию о доступе vpi.
Есть ли способ узнать количество записей в цикле vpi_scan без фактического сканирования в цикле? на самом деле, нет. не существует определенного способа запроса этой информации от итератора. Там может быть обходной путь с использованием
vpi_handle(vpiUse, iterator)
но это зависит от базовых данных и типа итерации. Гораздо проще использовать связанные списки, созданные в первом цикле сканирования.
Вы можете получить всю дополнительную информацию для LRM или справочника verilog pli.