Arrays 使用Verilog查找数字数组中的最小值以实现优先级队列

Arrays 使用Verilog查找数字数组中的最小值以实现优先级队列,arrays,comparison,verilog,priority-queue,system-verilog,Arrays,Comparison,Verilog,Priority Queue,System Verilog,我是Verilog的新手,但我有一个16个元素的数组(每个元素有16位长),我希望找到数组中的最小项,返回最小值,并重新排列数组中最小值之后的所有项,以便数组是一个连续的项块。我知道我必须使用比较器,但我真的不知道从哪里开始比较一大组数字并确定最小值 编辑:我实际上做的是一个优先级队列。我实现了队列功能,但是我不想返回队列头部的内容,而是希望返回具有最小值的条目,并保持存储连续 e.g. {2,3,4,1,5,6,-,-} min is 1 --> {2,3,4,-,5,6,-,-}

我是Verilog的新手,但我有一个16个元素的数组(每个元素有16位长),我希望找到数组中的最小项,返回最小值,并重新排列数组中最小值之后的所有项,以便数组是一个连续的项块。我知道我必须使用比较器,但我真的不知道从哪里开始比较一大组数字并确定最小值

编辑:我实际上做的是一个优先级队列。我实现了队列功能,但是我不想返回队列头部的内容,而是希望返回具有最小值的条目,并保持存储连续

e.g. {2,3,4,1,5,6,-,-} 
min is 1 --> {2,3,4,-,5,6,-,-} 
Rearrange so everything following the returned min is moved to the index preceding it-->
{2,3,4,5,6,-,-,-}

如果您没有减少门或LUT数量的压力,一个简单的方法是实现树型结构

如果队列中的条目是A0、A1、。。。A7,执行以下步骤:

  • 计算B0=min(A0,A1),B1=min(A2,A3),B2=min(A4,A5),B3=min(A6,A7)
  • 计算C0=min(B0,B1),C1=min(B2,B3)
  • 计算D=最小值(C0,C1)
  • 在每个步骤中,也要传递较小条目的索引

    这需要同时访问所有数据,因此它意味着整个存储是在触发器中,而不是在RAM中

    假设所有数据都在触发器中,重新打包并不太困难,只需创建一些逻辑,有条件地从存储器中的下一个更高的条目加载每个条目,并将要删除的元素的索引解码为一个向量,使要删除的元素上方的每个条目都能下移


    如果您想提高效率,可以使用一个变量,即比较是在排队时进行还是在退队时进行。您可能还想考虑是否需要在每个队列中重新打包。

    < P>一个简单的方法,如果您没有减少门或LUT的数量的压力,就是实现树型结构。 如果队列中的条目是A0、A1、。。。A7,执行以下步骤:

  • 计算B0=min(A0,A1),B1=min(A2,A3),B2=min(A4,A5),B3=min(A6,A7)
  • 计算C0=min(B0,B1),C1=min(B2,B3)
  • 计算D=最小值(C0,C1)
  • 在每个步骤中,也要传递较小条目的索引

    这需要同时访问所有数据,因此它意味着整个存储是在触发器中,而不是在RAM中

    假设所有数据都在触发器中,重新打包并不太困难,只需创建一些逻辑,有条件地从存储器中的下一个更高的条目加载每个条目,并将要删除的元素的索引解码为一个向量,使要删除的元素上方的每个条目都能下移


    如果您想提高效率,可以使用一个变量,即比较是在排队时进行还是在退队时进行。您可能还想考虑是否需要在每个队列中重新打包。

    < P> System Verilog为数组提供了<代码>排序< /代码>方法。请参阅IEEE标准1800-2009第7.12.2节中的“阵列排序方法”。

    SystemVerilog为阵列提供了一种排序方法。请参阅IEEE标准1800-2009第7.12.2节中的“阵列订购方法”。

    谢谢。我一定听从你的建议。我仍然不确定重新打包队列的问题。我之所以玩弄这个想法,是因为如果我不将其重新打包到连续存储中,它看起来像是“浪费了空间”。是否浪费空间取决于您的重新分配策略。如果不需要跟踪事物排队的顺序,可以为数组保留一个有效/空位向量,然后搜索它以找到一个空闲条目。这有一定的成本,但比查找最小值逻辑要便宜得多。实际上,空/满条目数组听起来是个不错的主意。也许我会考虑实施这一点。实际上,我所关心的只是从队列中删除最小条目,因此它位于何处并不重要。谢谢你的帮助。我真的很感激,谢谢。我一定听从你的建议。我仍然不确定重新打包队列的问题。我之所以玩弄这个想法,是因为如果我不将其重新打包到连续存储中,它看起来像是“浪费了空间”。是否浪费空间取决于您的重新分配策略。如果不需要跟踪事物排队的顺序,可以为数组保留一个有效/空位向量,然后搜索它以找到一个空闲条目。这有一定的成本,但比查找最小值逻辑要便宜得多。实际上,空/满条目数组听起来是个不错的主意。也许我会考虑实施这一点。实际上,我所关心的只是从队列中删除最小条目,因此它位于何处并不重要。谢谢你的帮助。我真的很感激。
    sort
    方法用于将数组从最小值重新排列到最大值。但我认为在此上下文中,
    min
    方法对于查找最小值更有用。
    sort
    方法用于将数组从最小值重新排列到最大值。但我认为在此上下文中,
    min
    方法对于查找最小值更有用。