Перейти к содержанию
    

Работа с двумерными массивами с точки зрения планеты "Железяка"

Уважаемые пользователи форума - у меня такой вопрос (дабы посоветоваться):

Дано:

1)Есть математический объект -> представляет собой 5 переменных шириной 32 бита , глубиной 160

logic [31:0] obj [160][5];

2)Есть шина загрузки ld[63:0] шириной 64 бита.

Вопрос как сделать вернее?

 

За один шаг я могу грузить сразу 2 переменные, в двумерном массиве это выглядит так если привязаться к строкам:

[0] [0] , [0] [1];

[0] [2] , [0] [3];

[0] [4] , [x] [x];

[1] [0] , [1] [1];

Такой стиль удобен с точки зрения написания функции записи.

Второй вариант не привязываться к строке.

[0] [0] , [0] [1];

[0] [2] , [0] [3];

[0] [4] , [1] [0];

[1] [1] , [1] [2];

Прирост к скорости загрузки становится *1/6; Однако не очень удобно оперировать такими значениями - наверно придется ручками прописывать (возможно через generate) все 400 комбинаций

Третий вариант уйти от реального двумерного объекта к абстрактному одномерному и оперировать с ним.

logic [31:0] obj [800]

 

Кто как считает? Заранее спасибо и + к карме.

//P.S. - синтез будет не на ПЛИС, а как starblock SoC.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Уважаемые пользователи форума - у меня такой вопрос (дабы посоветоваться):

Дано:

1)Есть математический объект -> представляет собой 5 переменных шириной 32 бита , глубиной 160

logic [31:0] obj [160][5];

...

//P.S. - синтез будет не на ПЛИС, а как starblock SoC.

А с противоположной стороне загрузки каков предполагаемый "ландшафт" этого объекта - плоская равнина усеянная булыжниками регистров

или приятная взору холмистая местность блоков памяти ? А может это будет единственный горный пик :yeah: ?

 

Удачи! Rob

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые пользователи форума - у меня такой вопрос (дабы посоветоваться):

Дано:

1)Есть математический объект -> представляет собой 5 переменных шириной 32 бита , глубиной 160

logic [31:0] obj [160][5];

2)Есть шина загрузки ld[63:0] шириной 64 бита.

Вопрос как сделать вернее?

 

За один шаг я могу грузить сразу 2 переменные, в двумерном массиве это выглядит так если привязаться к строкам:

[0] [0] , [0] [1];

[0] [2] , [0] [3];

[0] [4] , [x] [x];

[1] [0] , [1] [1];

Такой стиль удобен с точки зрения написания функции записи.

Второй вариант не привязываться к строке.

[0] [0] , [0] [1];

[0] [2] , [0] [3];

[0] [4] , [1] [0];

[1] [1] , [1] [2];

Прирост к скорости загрузки становится *1/6; Однако не очень удобно оперировать такими значениями - наверно придется ручками прописывать (возможно через generate) все 400 комбинаций

Третий вариант уйти от реального двумерного объекта к абстрактному одномерному и оперировать с ним.

logic [31:0] obj [800]

 

Кто как считает? Заранее спасибо и + к карме.

//P.S. - синтез будет не на ПЛИС, а как starblock SoC.

двухпортовая память чем не устраивает?

PS изобретаем велосипед?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и почему математики и программисты всегда любят структуры, с которыми невозможно работать в железе?

про одновременный доступ к двумерному массиву - забудьте, это вам не процессор с линейной памятью. надо менять шаблон поведения.

 

возьмите 32*5=160 бит (читай: любую удобную) ширину, и 2^N глубину, в виде двухпортового ОЗУ. это будут более-менее вменяемый вариант в ASIC/SoC.

таких двухпортовых ОЗУ может быть несколько, 2-4-8, что может помочь, например, при квазицикличности в применяемых формулах, или прочих удобных приемах.

 

при этом удобно вычисления разбить, и выполнять вычисления по шагам 1-2-3-4-5, таким образом сохраняя результат на каждом шаге в новой структуре (следующем ОЗУ, нужной разрядности), формируя таким образом конвейер.

 

общее правило: формируйте ОЗУ так, чтобы непосредственно вынимаемые из него данные было удобно сразу использовать.

Это правило сформулировано так, поскольку тайминги вывода сигналов из памяти - весьма неважные, и их надо либо сразу использовать, либо регистрить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

 

А с противоположной стороне загрузки каков предполагаемый "ландшафт" этого объекта - плоская равнина усеянная булыжниками регистров

или приятная взору холмистая местность блоков памяти ? А может это будет единственный горный пик :yeah: ?

 

Удачи! Rob

 

С противоположной стороны зада в виде выгрузки либо по 160 бит (5) переменных либо по 128 (4) переменные. И так по кругу - так сказать циклическая память.

Скорей всего эту задачу можно решить с точки зрения памяти...

 

Однако есть схожая задача где нужно иметь доступ сразу к 20ти ячейкам одномерного массива... что наверно будет представлять из себя регистры и много... много проводков...

 

и почему математики и программисты всегда любят структуры, с которыми невозможно работать в железе?

про одновременный доступ к двумерному массиву - забудьте, это вам не процессор с линейной памятью. надо менять шаблон поведения.

 

возьмите 32*5=160 бит (читай: любую удобную) ширину, и 2^N глубину, в виде двухпортового ОЗУ. это будут более-менее вменяемый вариант в ASIC/SoC.

таких двухпортовых ОЗУ может быть несколько, 2-4-8, что может помочь, например, при квазицикличности в применяемых формулах, или прочих удобных приемах.

 

при этом удобно вычисления разбить, и выполнять вычисления по шагам 1-2-3-4-5, таким образом сохраняя результат на каждом шаге в новой структуре (следующем ОЗУ, нужной разрядности), формируя таким образом конвейер.

 

общее правило: формируйте ОЗУ так, чтобы непосредственно вынимаемые из него данные было удобно сразу использовать.

Это правило сформулировано так, поскольку тайминги вывода сигналов из памяти - весьма неважные, и их надо либо сразу использовать, либо регистрить.

 

Вот так и я о том же... Я вообщем то всегда оперировал битами. И вообщем-то была у меня схожая структура (память регистрового типа). Так вот моего начальника смутила размерность разводки для 56000 бит. Вот и говорили сегодня о том что нужно применять объектный подход и оперировать объектами. Что абстрактный массив памяти не может быть верным. А вот переменная (в данном случае 32 бита) это объект реальный. И для верности схемы нужно отталкиваться от объектов. Собственно и создал тему посоветоваться.

 

Вообщем понял что у меня провал в области ОЗУ и использования ее в проектах на verilog. Кто может посоветовать, что почитать? :(

 

Я вообщем-то думал что память создается массивом reg, а потом синтезируется с помощью специальной программы.

Изменено пользователем Sergiysss

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я вообщем то всегда оперировал битами. И вообщем-то была у меня схожая структура (память регистрового типа).
Извините, но запомните ради всего святого:

В общем, слова "вообщем" не существует. Вообще не существует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...