Цитата(Шаманъ @ Aug 16 2017, 18:02)

У меня параметры кэширования выставлены WBWA - последнее обозначает Write Allocate, т.е. при записи произойдет выделение и заполнение (=чтение) линии кэша (32байта). Соответственно кэш-контроллер с памятью общаются только словами (точнее блоками по 8 32битных слов).
А как же эффективность? Это-ж при случайном произвольном доступе будет каждый раз вместо записи 1го байта по шине сначала производиться 16 операций чтения, потом ещё 1 запись!
Цитата(Шаманъ @ Aug 16 2017, 18:02)

Попробовал записал 0xEEEEFFFF по адресу 0x7000_0000, потом байт по адресу 0х7000_0000, потом слово по адресу 0х7000_0001 (невыровненный доступ, у меня такой доступ не используется, но проверить было интересно

), потом сбросил кэш - результат все записалось в точности как и должно было быть

.
Ну - это не корректная проверка, так как перед записью байта не было сброса кеша: байт просто обновит предыдущие записанные данные, находящиеся ещё во write buffer-е.
Цитата(Шаманъ @ Aug 16 2017, 18:02)

На всякий случай проверил с промежуточным сбросом и инвалидацией кеша. Работает как и ожидалось:
Хм... видимо сигналы эти (NBL_0, NBL_1) опциональны и можно и без них пожертвовав производительностью произвольной записи.
Цитата(Шаманъ @ Aug 16 2017, 18:02)

Дальше интересней - отключил кэш и проверил это дело без кэша - байтовый доступ на запись просто проигнорирован, а вот невыровненный доступ как ни странно прошел нормально:
А это странно. Как такое может быть? Если кеш реально выключен, то откуда взялись данные из немодифицируемых байтов?
Опять-же - Вы выключили кеш, а выключили-ли write buffer?
Возможно в этом и причина успешных тестов: сбрасываете кеш, а содержимое write buffer остаётся, объединяется со значением из предыдущей записи слова, и как будто всё ок. Хотя на самом деле...
PS: Да и выбор такого шаблона для тестов некорректен - у Вас при записи байта на неиспользуемых этим байтом линиях будут например все '1' и в результате эти единицы перепишутся поверх старых, а Вы и не заметите.
Тестить надо имхо на случайном паттерне, да ещё в несколько итераций со сменой паттерна.
И не один адрес писать, а писать сразу массив, заведомо превосходящий размер кеша.
Например:
1. Заполнить регион ОЗУ (больше размера кеша) 16-битными записями случайного паттерна.
2. В этот же регион записать побайтовый случайный паттерн (с шагом == 2 - например только все младшие или только старшие байты).
3. Верифицировать.
4. Повторить пп.1-3 с несколькими другими случайными паттернами.