我正在编写一个需要维护数组的Verilog模块。每个索引都可以使用或不使用。我在模块中提供了一个接口,允许客户端请求资源。我希望模块能够查找下一个未使用的索引&使用该索引将该资源分配给客户端。
我坚持在Verilog中找到未使用的索引的最佳方法。将未使用的索引粘贴在FIFO中是否有意义?或者在请求资源时,迭代数组以找到第一个未使用的资源?有没有其他更好的Verilog模式来处理这个问题?
感谢。
答案 0 :(得分:3)
与所有事情一样,答案是"它取决于"!有些事情需要考虑:
如果不知道上述内容,则无法提供明确的答案,但以下是您可以考虑的一些技巧。显然,如果你可以利用你的特定用例的某些属性,可能会有一些优化(因为在某些情况下,@ dwikle状态就是一个简单的FIFO就足够了)。
维护填充条目的位掩码。这适用于较小的阵列,可以接受为每个阵列位置使用1位寄存器。
如果您需要单周期响应时间并且必须处理连续的背对背请求,那么您可以使用位扫描,然后使用onehot到二进制编码器来派生下一个空闲索引。这通常用于仲裁或中断屏蔽,您可以在针对(上一代)FPGA优化的code snippets中找到Altera Advanced Synthesis Cookbook和解释。
这不会很好地扩展到大型阵列,但如果您不能在一个周期内处理需要的背对背请求,那么您可以管理多个周期。
如果目标提供内存块且阵列大小很大,则可以使用内存块来存储状态。还有几种方法可以做到:
与使用寄存器类似,只需为每个存储器使用一位标志。这将扩展为支持大型阵列。要查找下一个空闲条目,请执行内存搜索。通常,您可以读取宽切片(比如64位),然后使用上面的位扫描技术在一个周期内扫描该向量,因此您的最大搜索时间为ARRAY_SIZE / 64。您还可以通过这种方式构建更多有趣的功能,例如CAM。
这样做的好处是你的数组不一定需要在内存中连续。管理它的最简单方法是使用未使用地址的FIFO和使用过的地址的FIFO。这不是最有效的机制,但使逻辑变得简单(分配和释放条目只是从一个FIFO读取地址并写入另一个FIFO的情况)。