在Verilog数组中查找未使用的索引?

时间:2014-03-10 22:38:52

标签: arrays verilog

我正在编写一个需要维护数组的Verilog模块。每个索引都可以使用或不使用。我在模块中提供了一个接口,允许客户端请求资源。我希望模块能够查找下一个未使用的索引&使用该索引将该资源分配给客户端。

我坚持在Verilog中找到未使用的索引的最佳方法。将未使用的索引粘贴在FIFO中是否有意义?或者在请求资源时,迭代数组以找到第一个未使用的资源?有没有其他更好的Verilog模式来处理这个问题?

感谢。

1 个答案:

答案 0 :(得分:3)

与所有事情一样,答案是"它取决于"!有些事情需要考虑:

  • 您的综合目标是什么,有哪些可用资源?
  • 阵列有多大?
  • 数组是一个连续的内存块吗?
  • 请求发生的频率是多少?
  • 提供回复的速度有多快?
  • 您的目标频率是什么?
  • 您的目标是优化实施与上市时间和设备资源使用情况?

如果不知道上述内容,则无法提供明确的答案,但以下是您可以考虑的一些技巧。显然,如果你可以利用你的特定用例的某些属性,可能会有一些优化(因为在某些情况下,@ dwikle状态就是一个简单的FIFO就足够了)。

注册位掩码

维护填充条目的位掩码。这适用于较小的阵列,可以接受为每个阵列位置使用1位寄存器。

如果您需要单周期响应时间并且必须处理连续的背对背请求,那么您可以使用位扫描,然后使用onehot到二进制编码器来派生下一个空闲索引。这通常用于仲裁或中断屏蔽,您可以在针对(上一代)FPGA优化的code snippets中找到Altera Advanced Synthesis Cookbook和解释。

这不会很好地扩展到大型阵列,但如果您不能在一个周期内处理需要的背对背请求,那么您可以管理多个周期。

内存

如果目标提供内存块且阵列大小很大,则可以使用内存块来存储状态。还有几种方法可以做到:

存储填充的标志

与使用寄存器类似,只需为每个存储器使用一位标志。这将扩展为支持大型阵列。要查找下一个空闲条目,请执行内存搜索。通常,您可以读取宽切片(比如64位),然后使用上面的位扫描技术在一个周期内扫描该向量,因此您的最大搜索时间为ARRAY_SIZE / 64。您还可以通过这种方式构建更多有趣的功能,例如CAM

存储阵列位置的地址

这样做的好处是你的数组不一定需要在内存中连续。管理它的最简单方法是使用未使用地址的FIFO和使用过的地址的FIFO。这不是最有效的机制,但使逻辑变得简单(分配和释放条目只是从一个FIFO读取地址并写入另一个FIFO的情况)。