|
Включение кэширования в Microblaze |
|
|
|
Jan 12 2012, 18:45
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 24-02-10
Из: Пенза
Пользователь №: 55 642

|
Работаю с 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 ? Помогите пожалуйста.
--------------------
Нелегко оказаться на верном пути, но куда труднее его пройти. (с) Уилл Роджерс
|
|
|
|
|
 |
Ответов
(1 - 10)
|
Jan 12 2012, 21:03
|
Знающий
   
Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219

|
Цитата(D-Luxe @ Jan 12 2012, 22:45)  Работаю с Microblaze. Ниже приведен *.mhs файл проекта. В общем как настраивается кэш в mhs файле я вроде понял - 2 XCL канала подключаются и generic'и настраиваются ( выбираются размер кэша C_CACHE_BYTE_SIZE = 4096 ). Сам кэш располагается в BRAM насколько я понял. ... Как найти где находится кэш в BRAM ? Помогите пожалуйста.  PowerPC починили, теперь за Микроблейз принялись  Что такое адрес кэша? Если вы под адресом понимаете параметр функции void microblaze_init_dcache_range(int cache_addr, int cache_size) дык в гугле написано, что параметры этой функции определяют область кэша, которая "инициализируется-инвалидируется". Поэтому для "инициализации" всего кэша нужно писать microblaze_init_icache_range(0, ICACHE_SIZE);
|
|
|
|
|
Jan 13 2012, 04:05
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 24-02-10
Из: Пенза
Пользователь №: 55 642

|
Цитата(VladimirB @ Jan 13 2012, 00:03)   PowerPC починили, теперь за Микроблейз принялись  Что такое адрес кэша? Если вы под адресом понимаете параметр функции void microblaze_init_dcache_range(int cache_addr, int cache_size) дык в гугле написано, что параметры этой функции определяют область кэша, которая "инициализируется-инвалидируется". Поэтому для "инициализации" всего кэша нужно писать microblaze_init_icache_range(0, ICACHE_SIZE); Как я понял первый параметр это начальный адрес кэша в адресном пространстве проца.
--------------------
Нелегко оказаться на верном пути, но куда труднее его пройти. (с) Уилл Роджерс
|
|
|
|
|
Jan 23 2012, 13:07
|

Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 11-01-11
Из: Москва
Пользователь №: 62 160

|
Цитата Только вот загвоздка в том с какого адреса начинаются кэш данных и команд в BRAM, среда сама как-то распределяет а вот как неизвестно.
В программе кэш включается функцией microblaze_enable_icache(), но помимо этого нужно его проинициализировать, а вот для этого нужно знать адреса кэша в BRAM. Вы хотите просто включить кэш инструкций или что-то другое? У меня в программе для этого две функции по умолчанию. Работает, никто не жалуется. Код microblaze_invalidate_icache(); microblaze_enable_icache(); А у меня другая проблема: как отключить кэширование данных для части адресного пространства MicroBlaze. Подскажите, кто знает.
|
|
|
|
|
Jan 24 2012, 06:15
|
Местный
  
Группа: Участник
Сообщений: 295
Регистрация: 2-12-05
Пользователь №: 11 695

|
Цитата(Чиповод @ Jan 23 2012, 17:07)  Вы хотите просто включить кэш инструкций или что-то другое? У меня в программе для этого две функции по умолчанию. Работает, никто не жалуется. Код microblaze_invalidate_icache(); microblaze_enable_icache(); А у меня другая проблема: как отключить кэширование данных для части адресного пространства MicroBlaze. Подскажите, кто знает. Никак. Надо заранее указывать (еще перед синтезом FPGA) диапазон памяти который будет под кешем работать.
|
|
|
|
|
Jan 24 2012, 09:26
|

Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 11-01-11
Из: Москва
Пользователь №: 62 160

|
Цитата Никак. Надо заранее указывать (еще перед синтезом FPGA) диапазон памяти который будет под кешем работать. Это, я так понимаю здесь задается? Пробовал так делать - запись в память вообще не проходит. Сейчас заметил чекбокс Use Cache Links for All Memory Accesses. Он меня спасет?
|
|
|
|
|
Jan 24 2012, 09:35
|
Местный
  
Группа: Участник
Сообщений: 295
Регистрация: 2-12-05
Пользователь №: 11 695

|
Цитата(Чиповод @ Jan 24 2012, 13:26)  Это, я так понимаю здесь задается? Пробовал так делать - запись в память вообще не проходит. Сейчас заметил чекбокс Use Cache Links for All Memory Accesses. Он меня спасет?  Да - здесь. Что значит "Пробовал так делать - запись в память вообще не проходит" ? Use Cache Links for All Memory Accesses Согласно документации - это доступ ко всей памяти по шине XCL/AXI вне зависимости от вкл/выкл кеша процессора (функции типа microblaze_enable_icache(); )
Сообщение отредактировал Alex77 - Jan 24 2012, 09:36
|
|
|
|
|
Jan 24 2012, 12:20
|

Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 11-01-11
Из: Москва
Пользователь №: 62 160

|
Цитата(Alex77 @ Jan 24 2012, 12:35)  Да - здесь. Что значит "Пробовал так делать - запись в память вообще не проходит" ? У меня к AXI шине подключена корка, которая имеет внутренню память и, соответственно, диапазон адресного пространства для чтения/записи. При включенном Dcache запись/чтение из MicroBlaze хорошо работает, но приходится делать постоянный Flush кэша, чтобы заставить MicroBlaze обновить данные в корке. После исключения диапазона адресного пространства корки из кэширования и попытке чтения/записи обращений к корке по AXI шине нет. Из окошка Memory в Eclipse (среда SDK) по всему адресному пространству - нули и попытка записать туда что-либо ни к чему не приводит. Данные не изменяются, обращений к корке нет.
|
|
|
|
|
Jan 24 2012, 12:35
|
Местный
  
Группа: Участник
Сообщений: 295
Регистрация: 2-12-05
Пользователь №: 11 695

|
Цитата(Чиповод @ Jan 24 2012, 16:20)  У меня к AXI шине подключена корка, которая имеет внутренню память и, соответственно, диапазон адресного пространства для чтения/записи. При включенном Dcache запись/чтение из MicroBlaze хорошо работает, но приходится делать постоянный Flush кэша, чтобы заставить MicroBlaze обновить данные в корке. После исключения диапазона адресного пространства корки из кэширования и попытке чтения/записи обращений к корке по AXI шине нет. Из окошка Memory в Eclipse (среда SDK) по всему адресному пространству - нули и попытка записать туда что-либо ни к чему не приводит. Данные не изменяются, обращений к корке нет. EDK проект в студию... "Рабочий" и "не рабочий" вариант проекта.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|