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

Включение кэширования в Microblaze

Работаю с Microblaze. Ниже приведен *.mhs файл проекта. В общем как настраивается кэш в mhs файле я вроде понял - 2 XCL канала подключаются и generic'и настраиваются ( выбираются размер кэша C_CACHE_BYTE_SIZE = 4096 ). Сам кэш располагается в BRAM насколько я понял.

 

Только вот загвоздка в том с какого адреса начинаются кэш данных и команд в BRAM, среда сама как-то распределяет а вот как неизвестно.

 

В программе кэш включается функцией microblaze_enable_icache(), но помимо этого нужно его проинициализировать, а вот для этого нужно знать адреса кэша в BRAM.

 

BEGIN microblaze
PARAMETER INSTANCE = microblaze_0
PARAMETER HW_VER = 7.10.a
PARAMETER C_USE_BARREL = 1
PARAMETER C_FAMILY = spartan3e
PARAMETER C_INSTANCE = microblaze_0
PARAMETER C_AREA_OPTIMIZED = 1
PARAMETER C_DEBUG_ENABLED = 1
PARAMETER C_USE_ICACHE = 1
PARAMETER C_USE_DCACHE = 1
PARAMETER C_ALLOW_ICACHE_WR = 1
PARAMETER C_ALLOW_DCACHE_WR = 1
PARAMETER C_ICACHE_ALWAYS_USED = 1
PARAMETER C_DCACHE_ALWAYS_USED = 1
PARAMETER C_CACHE_BYTE_SIZE = 4096
PARAMETER C_ICACHE_BASEADDR = 0x85000000
PARAMETER C_ICACHE_HIGHADDR = 0x85ffffff
# PARAMETER C_ICACHE_LINE_LEN = 8
PARAMETER C_DCACHE_BYTE_SIZE = 4096
PARAMETER C_DCACHE_BASEADDR = 0x85000000
PARAMETER C_DCACHE_HIGHADDR = 0x85ffffff
# PARAMETER C_DCACHE_LINE_LEN = 8
BUS_INTERFACE IXCL = ixcl
BUS_INTERFACE DXCL = dxcl
BUS_INTERFACE DPLB = mb_plb
BUS_INTERFACE IPLB = mb_plb
BUS_INTERFACE DLMB = dlmb
BUS_INTERFACE ILMB = ilmb
BUS_INTERFACE DEBUG = mdm_0_MBDEBUG_0
PORT MB_RESET = mb_reset
PORT DEBUG_RST = Debug_Rst
END

BEGIN lmb_v10
PARAMETER INSTANCE = ilmb
PARAMETER HW_VER = 1.00.a
PORT LMB_Clk = sys_clk_s
PORT SYS_Rst = sys_bus_reset
END

BEGIN lmb_v10
PARAMETER INSTANCE = dlmb
PARAMETER HW_VER = 1.00.a
PORT LMB_Clk = sys_clk_s
PORT SYS_Rst = sys_bus_reset
END

BEGIN lmb_bram_if_cntlr
PARAMETER INSTANCE = dlmb_cntlr
PARAMETER HW_VER = 2.10.a
PARAMETER C_BASEADDR = 0x00000000
PARAMETER C_HIGHADDR = 0x00001fff
BUS_INTERFACE SLMB = dlmb
BUS_INTERFACE BRAM_PORT = dlmb_port
END

BEGIN lmb_bram_if_cntlr
PARAMETER INSTANCE = ilmb_cntlr
PARAMETER HW_VER = 2.10.a
PARAMETER C_BASEADDR = 0x00000000
PARAMETER C_HIGHADDR = 0x00001fff
BUS_INTERFACE SLMB = ilmb
BUS_INTERFACE BRAM_PORT = ilmb_port
END

BEGIN bram_block
PARAMETER INSTANCE = lmb_bram
PARAMETER HW_VER = 1.00.a
BUS_INTERFACE PORTA = ilmb_port
BUS_INTERFACE PORTB = dlmb_port
END

BEGIN mpmc
PARAMETER INSTANCE = mpmc_0
PARAMETER HW_VER = 4.00.a
PARAMETER C_MEM_PARTNO = CUSTOM
PARAMETER C_MEM_TYPE = SDRAM
PARAMETER C_MPMC_CLK0_PERIOD_PS = 10000
PARAMETER C_MEM_DATA_WIDTH = 32
PARAMETER C_MEM_PART_DATA_DEPTH = 4
PARAMETER C_MEM_PART_DATA_WIDTH = 32
PARAMETER C_MEM_PART_NUM_ROW_BITS = 12
PARAMETER C_MEM_PART_NUM_COL_BITS = 8
PARAMETER C_MEM_PART_CAS_A_FMAX = 100
PARAMETER C_MEM_PART_CAS_A = 6
PARAMETER C_MEM_PART_TRAS = 4200
PARAMETER C_MEM_PART_TRASMAX = 12000000
PARAMETER C_MEM_PART_TRC = 70000
PARAMETER C_MEM_PART_TWR = 14000
PARAMETER C_MEM_PART_TRRD = 14000
PARAMETER C_MEM_PART_TRCD = 20000
PARAMETER C_MEM_PART_TREFI = 5625000
PARAMETER C_MEM_PART_TRFC = 70000
PARAMETER C_MEM_PART_TRP = 10000
PARAMETER C_MEM_PART_NUM_BANK_BITS = 2
PARAMETER C_NUM_PORTS = 3
PARAMETER C_PIM0_BASETYPE = 1
PARAMETER C_PIM2_BASETYPE = 2
PARAMETER C_SPLB2_NATIVE_DWIDTH = 32
PARAMETER C_MPMC_BASEADDR = 0x85000000
PARAMETER C_MPMC_HIGHADDR = 0x85FFFFFF
PARAMETER C_PIM1_BASETYPE = 1
PARAMETER C_USE_STATIC_PHY = 1
BUS_INTERFACE SPLB2 = mb_plb
BUS_INTERFACE XCL0 = ixcl
BUS_INTERFACE XCL1 = dxcl
PORT SDRAM_DM = SDRAM_DM
PORT SDRAM_DQ = SDRAM_DQ
PORT SDRAM_Addr = SDRAM_Addr
PORT SDRAM_BankAddr = SDRAM_BankAddr
PORT SDRAM_WE_n = SDRAM_WE_n
PORT SDRAM_CAS_n = SDRAM_CAS_n
PORT SDRAM_RAS_n = SDRAM_RAS_n
PORT SDRAM_CE = SDRAM_CE
PORT SDRAM_CS_n = SDRAM_CS_n
PORT SDRAM_Clk = SDRAM_Clk
PORT MPMC_InitDone = SDRAM_INITDONE
PORT MPMC_Rst = sys_periph_reset
PORT MPMC_Clk0 = v4_sys_clk_s
PORT MPMC_Clk_Mem = v4_sys_clk_s
PORT MPMC_Clk90 = v4_sys_clk_90_s
END

 

Как найти где находится кэш в BRAM ? Помогите пожалуйста.

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


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

Работаю с Microblaze. Ниже приведен *.mhs файл проекта. В общем как настраивается кэш в mhs файле я вроде понял - 2 XCL канала подключаются и generic'и настраиваются ( выбираются размер кэша C_CACHE_BYTE_SIZE = 4096 ). Сам кэш располагается в BRAM насколько я понял.

...

Как найти где находится кэш в BRAM ? Помогите пожалуйста.

 

:bb-offtopic: PowerPC починили, теперь за Микроблейз принялись :)

 

Что такое адрес кэша?

Если вы под адресом понимаете параметр функции

void microblaze_init_dcache_range(int cache_addr, int cache_size)

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

 

Поэтому для "инициализации" всего кэша нужно писать

microblaze_init_icache_range(0, ICACHE_SIZE);

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


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

:bb-offtopic: PowerPC починили, теперь за Микроблейз принялись :)

 

Что такое адрес кэша?

Если вы под адресом понимаете параметр функции

void microblaze_init_dcache_range(int cache_addr, int cache_size)

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

 

Поэтому для "инициализации" всего кэша нужно писать

microblaze_init_icache_range(0, ICACHE_SIZE);

Как я понял первый параметр это начальный адрес кэша в адресном пространстве проца.

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


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

VladimirB вы оказались правы, первый параметр это действительно начальный адрес инициализации.

 

Не смотря на это кэш все равно не включается.

 

Программа Microblaze падает при вызове функций работы с кэшем.

 

В чем дело?

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


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

Только вот загвоздка в том с какого адреса начинаются кэш данных и команд в BRAM, среда сама как-то распределяет а вот как неизвестно.

 

В программе кэш включается функцией microblaze_enable_icache(), но помимо этого нужно его проинициализировать, а вот для этого нужно знать адреса кэша в BRAM.

Вы хотите просто включить кэш инструкций или что-то другое? У меня в программе для этого две функции по умолчанию. Работает, никто не жалуется.

    microblaze_invalidate_icache();
    microblaze_enable_icache();

 

А у меня другая проблема: как отключить кэширование данных для части адресного пространства MicroBlaze. Подскажите, кто знает.

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


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

Вы хотите просто включить кэш инструкций или что-то другое? У меня в программе для этого две функции по умолчанию. Работает, никто не жалуется.

    microblaze_invalidate_icache();
    microblaze_enable_icache();

 

А у меня другая проблема: как отключить кэширование данных для части адресного пространства MicroBlaze. Подскажите, кто знает.

Никак.

Надо заранее указывать (еще перед синтезом FPGA) диапазон памяти который будет под кешем работать.

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


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

Никак.

Надо заранее указывать (еще перед синтезом FPGA) диапазон памяти который будет под кешем работать.

 

Это, я так понимаю здесь задается? Пробовал так делать - запись в память вообще не проходит. Сейчас заметил чекбокс Use Cache Links for All Memory Accesses. Он меня спасет?

2YMycuqD.png

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


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

Это, я так понимаю здесь задается? Пробовал так делать - запись в память вообще не проходит. Сейчас заметил чекбокс Use Cache Links for All Memory Accesses. Он меня спасет?

2YMycuqD.png

Да - здесь.

Что значит "Пробовал так делать - запись в память вообще не проходит" ?

 

Use Cache Links for All Memory Accesses

Согласно документации - это доступ ко всей памяти по шине XCL/AXI вне зависимости от вкл/выкл кеша процессора (функции типа microblaze_enable_icache(); )

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

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


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

Да - здесь.

Что значит "Пробовал так делать - запись в память вообще не проходит" ?

У меня к AXI шине подключена корка, которая имеет внутренню память и, соответственно, диапазон адресного пространства для чтения/записи. При включенном Dcache запись/чтение из MicroBlaze хорошо работает, но приходится делать постоянный Flush кэша, чтобы заставить MicroBlaze обновить данные в корке. После исключения диапазона адресного пространства корки из кэширования и попытке чтения/записи обращений к корке по AXI шине нет. Из окошка Memory в Eclipse (среда SDK) по всему адресному пространству - нули и попытка записать туда что-либо ни к чему не приводит. Данные не изменяются, обращений к корке нет.

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


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

У меня к AXI шине подключена корка, которая имеет внутренню память и, соответственно, диапазон адресного пространства для чтения/записи. При включенном Dcache запись/чтение из MicroBlaze хорошо работает, но приходится делать постоянный Flush кэша, чтобы заставить MicroBlaze обновить данные в корке. После исключения диапазона адресного пространства корки из кэширования и попытке чтения/записи обращений к корке по AXI шине нет. Из окошка Memory в Eclipse (среда SDK) по всему адресному пространству - нули и попытка записать туда что-либо ни к чему не приводит. Данные не изменяются, обращений к корке нет.

EDK проект в студию...

"Рабочий" и "не рабочий" вариант проекта.

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


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

Полез повторять эксперимент и кажется разобрался в чем дело.

 

При записи/чтении в мою корку из MicroBlaze данные проходят через кэш и с порта M_AXI_DC попадают в мою корку. Если я отключаю кэш, транзакции на M_AXI_DC пропадают. Подключил к своей корке порт M_AXI_DP от MicroBlaze, отключил кэширование адресов корки и все заработало. Время записи в мою корку сократилось в несколько раз после отказа от flush. Но осталось не понятным почему при отключении кэширования данные на M_AXI_DC не проходят? Ведь это основной порт для выхода на AXI шину.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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