0

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

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

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

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

4

1 回答 1

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

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

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

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

you can get all additional information for LRM or a verilog pli handbook.

于 2018-11-20T17:56:31.240 回答