在 Verilog 过程接口中,是否可以多次扫描迭代循环?

In Verilog Procedural Interface, is it possible to scan through iteration loop several times?

我们可以通过以下方式使用vpi_scan:

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

iter 将在 vpi_scan() returns NULL 时被释放。 但是,如果我需要多次扫描循环怎么办?有没有办法告诉 vpi_scan 不要释放迭代器,以便我可以在完成后 vpi_free_object ? 我想我可以使用额外的容器(收集并保留所有条目)来解决问题,但真的需要吗?

编辑: 1. 我不想多次调用 vpi_iterate,因为它可能很昂贵。 2. 假设我使用了一个额外的容器解决方案。有没有办法在不实际扫描循环的情况下找出 vpi_scan 循环中的条目数?这可以使实施更简单。

  1. ut 如果我需要多次扫描循环怎么办? vpi_iterate returns 一个指向迭代器的初始化指针.每个 vpi_scan 从列表中删除一个元素并释放它。如果 vpi_scan 没有 运行 到最后,你最好使用 vpi_free_object 清理迭代器列表的其余部分。如果您需要再次重新扫描同一个对象,您可以再次调用 vpi_iterate 它会 return 一个您可以重新扫描的新迭代器对象。

  2. 有没有办法告诉 vpi_scan 不要释放迭代器,这样我就可以在完成后 vpi_free_object? 不,(1) 是唯一可用于访问和释放迭代器元素的机制。标准中没有其他存在。

  3. 我想我可以使用额外的容器(收集并保留所有条目)来解决问题,但真的需要吗? -- 这是如果您想重新扫描数据结构,这是个好主意。从性能的角度来看,它可能会好得多。 Verilog 模拟器通常有一个单独生成的 vpi 数据库,它需要查阅,可能多次为您提供 vpi 访问信息。

  4. 有没有办法在不实际扫描整个循环的情况下找出 vpi_scan 循环中的条目数? 不是。没有定义的方法来从迭代器中查询此信息。使用 vpi_handle(vpiUse, iterator) 可能有变通方法,但这取决于基础数据和迭代类型。使用第一次扫描循环创建的链表要容易得多。

您可以获得 LRM 的所有附加信息或 verilog pli 手册