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

Очистка RAM на SystemVerilog

7 минут назад, Nick_K сказал:

Если стоит задача избавится от всех записей сразу и при этомиспользовать RAMпочему не реализовать на выходе памяти коммутатор валидности. По сути это будет просто набор регистров с сигналом сброса инверсным валидному. если данные не валидны, то не важно что читать - будет ноль. Если же нужно сбросить и потом перезаписать всё - идеальное решение. Если же в процессе работы будет периодическая перепроверка всего диапазона памяти, тогда не годится.

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

Если вы это имели в виду, то я держу в голове этот способ. Смущает, что он все таки прилично логики займёт. 

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


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

On 8/2/2019 at 6:04 PM, Perdachillo said:

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

Если вы это имели в виду, то я держу в голове этот способ. Смущает, что он все таки прилично логики займёт. 

Вообще я немного не то имел ввиду, но так тоже можно. Если количество записей ограниченное и имеет стандартный паттерн, то можно создать на максимальное количество регистр, а на входе повесить дешифратор адреса, который будет определять в какой зоне валидные, а в какой невалидные данные. Туда же можно будет добавить счётчик устаревания.

Если же данные с различной длиннной, тогда проще подключить ещё одну память (распределённую) и просто хранить указатели начала валидных записей.

В любом из вариантов скорее сложности в правильном описании, чем в физическом резальтате.

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


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

On 8/2/2019 at 6:04 PM, Perdachillo said:

Смущает, что он все таки прилично логики займёт. 

Можно и на RAM сделать, возьмите максимальную ширину шины данных N, но понимайте, что по каждому адресу этой памяти у вас хранится N флагов валидности основной памяти.

Тогда, по маске, на записи можете адресовать любой бит, а при "стирании" сразу по N бит будете "зачищать".  Ресурсоав минимум, но есть латенсия.

Trade-off между ресурсами и задержками Вам выбирать. 

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


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

30 минут назад, Mad_kvmg сказал:

Тогда, по маске, на записи можете адресовать любой бит, а при "стирании" сразу по N бит будете "зачищать".  Ресурсоав минимум, но есть латенсия.

Trade-off между ресурсами и задержками Вам выбирать. 

Хорошая идея, получится настраиваемый компромисс между количеством тактов для сброса и объёмом памяти. 

1 час назад, Nick_K сказал:

Туда же можно будет добавить счётчик устаревания.

Да, надо весь механизм с устареванием сюда грамотно засунуть. Если использовать ram для хранения информации о валидности, а не регистры, то это несколько усложняет это дело

1 час назад, Nick_K сказал:

В любом из вариантов скорее сложности в правильном описании, чем в физическом резальтате.

По простому походу не выйдет) придётся засесть.. 

Смотрю ещё протокол RSTP, и он подразумевает такие случаи, когда необходимо не просто очистить таблицу, а очистить только записи маков, которые относятся к определённому порту назначения. Чувствую, что с этим тоже повожусь. 

 

Спасибо за помощь! 

 

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


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

52 minutes ago, Perdachillo said:

Да, надо весь механизм с устареванием сюда грамотно засунуть. Если использовать ram для хранения информации о валидности, а не регистры, то это несколько усложняет это дело

Наоборот проще некуда. При заполнении таблицы актуальности данных сформируйте для каждой записи в таблицу счётчик максимальной величины (к примеру по 4 бита на счётчик) тогда при проходе состояния актуализации декрементируйте все значения на 1, в результате у вас данные устареют на 16 проходе без обновления. Что в RAM, что на распределённой логике - описание раз плюнуть.

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


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

Вспоминая рекомендации в соответствующем упоминавшемся здесь документе "Recommended styles...", я в подобном случае поместил память в отдельный файл.
Получилось более громоздко, чем через generate в том же модуле, где память используется.

Но синтезатору это более понятно.

Так что отделите шины каждого блока памяти, вынесите память в отдельный модуль, а в основном модуле в generate добавьте instance этих модулей памяти.

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


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

26 минут назад, Nick_K сказал:

Наоборот проще некуда. При заполнении таблицы актуальности данных сформируйте для каждой записи в таблицу счётчик максимальной величины (к примеру по 4 бита на счётчик) тогда при проходе состояния актуализации декрементируйте все значения на 1, в результате у вас данные устареют на 16 проходе без обновления. Что в RAM, что на распределённой логике - описание раз плюнуть.

Получается память будет двухпортовая? Один порт будет добавлять (или перезаписывать) записи во время поступления нового Mac адреса, а второй порт (параллельно этому) будет опрашивать последовательно все записи и декрементировать счётчики реализуя механизм устаревания?

33 минуты назад, Juzujka сказал:

Вспоминая рекомендации в соответствующем упоминавшемся здесь документе "Recommended styles...", я в подобном случае поместил память в отдельный файл.
Получилось более громоздко, чем через generate в том же модуле, где память используется.

Но синтезатору это более понятно.

Так что отделите шины каждого блока памяти, вынесите память в отдельный модуль, а в основном модуле в generate добавьте instance этих модулей памяти.

Попробую. Я почему-то думал, что generate сам по себе создаёт несколько отдельных модулей

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


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

48 minutes ago, Perdachillo said:

Получается память будет двухпортовая? Один порт будет добавлять (или перезаписывать) записи во время поступления нового Mac адреса, а второй порт (параллельно этому) будет опрашивать последовательно все записи и декрементировать счётчики реализуя механизм устаревания?

Вообще вся память на кристалле двухпортовая - не принципиально. Но всё зависит от верхнего автомата. Если у вас есть Управляющий FSM у которого одно положение - приём Маков (самое длительное по времени), но есть и состояния актуализации, перезаписи, другие состояния (минимальные по времени), тогда можно обойтись однопортовой RAM. В противном случае задействуйте 2 порта. Напоминание: с некоторыми оговорками нельзя писать/читать по одной и той же ячейке памяти (да оно вам и не нужно, но возможна коллизия раз в год)

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


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

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

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

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

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

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

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

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

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

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