#arrays #comparison #verilog #priority-queue #system-verilog
#массивы #сравнение #verilog #приоритет-очередь #система-verilog
Вопрос:
Я довольно новичок в 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,-,-,-}
Ответ №1:
Простой подход, если у вас нет необходимости уменьшать количество вентилей или 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 = min (C0, C1)
На каждом шаге также передавайте индекс той записи, которая меньше.
Для этого требуется доступ ко всем данным одновременно, поэтому это подразумевает, что все хранилище находится в триггерах, а не в оперативной памяти.
Учитывая, что все данные находятся во триггерах, перепаковка не слишком сложна, просто создайте некоторую логику для условной загрузки каждой записи из следующей более высокой записи в хранилище и декодируйте индекс удаляемого элемента в вектор, позволяющий сдвиг вниз для каждой записи над удаляемым элементом.
Одна из переменных, с которой следует поиграть, если вы хотите сделать ее более эффективной, заключается в том, выполняется ли сравнение во время постановки в очередь или снятия с очереди. Вы также можете подумать, действительно ли необходима повторная упаковка после каждого удаления из очереди.
Комментарии:
1. Спасибо. Я обязательно прислушаюсь ко всем вашим предложениям. Я все еще не уверен в проблеме переупаковки очереди. Причина, по которой я играл с этой идеей, заключается в том, что это кажется «потраченным впустую пространством», если я не переупаковываю его в непрерывное хранилище.
2. будет ли это потрачено впустую, зависит от вашей политики перераспределения. Если вам не нужно отслеживать порядок, в котором объекты были поставлены в очередь, вы можете сохранить вектор допустимых / пустых битов для массива и выполнить поиск по нему, чтобы найти свободную запись. Это требует определенных затрат, но это намного дешевле, чем логика поиска минимального значения.
3. Массив пустых / полных записей звучит как действительно хорошая идея на самом деле. Возможно, я рассмотрю возможность реализации этого. На самом деле, все, о чем я забочусь, это удаление минимальной записи из очереди, поэтому на самом деле не имеет значения, где она расположена. Спасибо за помощь. Я действительно ценю это.
Ответ №2:
SystemVerilog предоставляет sort
метод для массивов. Обратитесь к «Методам упорядочения массива», раздел 7.12.2 стандарта IEEE 1800-2009.
Комментарии:
1.
sort
метод используется для изменения массива с минимального на максимальный. Но я думаю, что здесь, в этом контексте,min
метод более полезен для нахождения минимального числа.