D-Luxe 0 12 января, 2012 Опубликовано 12 января, 2012 · Жалоба Работаю с 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 ? Помогите пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirB 1 12 января, 2012 Опубликовано 12 января, 2012 · Жалоба Работаю с 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
D-Luxe 0 13 января, 2012 Опубликовано 13 января, 2012 · Жалоба :bb-offtopic: PowerPC починили, теперь за Микроблейз принялись :) Что такое адрес кэша? Если вы под адресом понимаете параметр функции void microblaze_init_dcache_range(int cache_addr, int cache_size) дык в гугле написано, что параметры этой функции определяют область кэша, которая "инициализируется-инвалидируется". Поэтому для "инициализации" всего кэша нужно писать microblaze_init_icache_range(0, ICACHE_SIZE); Как я понял первый параметр это начальный адрес кэша в адресном пространстве проца. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
D-Luxe 0 14 января, 2012 Опубликовано 14 января, 2012 · Жалоба VladimirB вы оказались правы, первый параметр это действительно начальный адрес инициализации. Не смотря на это кэш все равно не включается. Программа Microblaze падает при вызове функций работы с кэшем. В чем дело? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chipovod 0 23 января, 2012 Опубликовано 23 января, 2012 · Жалоба Только вот загвоздка в том с какого адреса начинаются кэш данных и команд в BRAM, среда сама как-то распределяет а вот как неизвестно. В программе кэш включается функцией microblaze_enable_icache(), но помимо этого нужно его проинициализировать, а вот для этого нужно знать адреса кэша в BRAM. Вы хотите просто включить кэш инструкций или что-то другое? У меня в программе для этого две функции по умолчанию. Работает, никто не жалуется. microblaze_invalidate_icache(); microblaze_enable_icache(); А у меня другая проблема: как отключить кэширование данных для части адресного пространства MicroBlaze. Подскажите, кто знает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба Вы хотите просто включить кэш инструкций или что-то другое? У меня в программе для этого две функции по умолчанию. Работает, никто не жалуется. microblaze_invalidate_icache(); microblaze_enable_icache(); А у меня другая проблема: как отключить кэширование данных для части адресного пространства MicroBlaze. Подскажите, кто знает. Никак. Надо заранее указывать (еще перед синтезом FPGA) диапазон памяти который будет под кешем работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chipovod 0 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба Никак. Надо заранее указывать (еще перед синтезом FPGA) диапазон памяти который будет под кешем работать. Это, я так понимаю здесь задается? Пробовал так делать - запись в память вообще не проходит. Сейчас заметил чекбокс Use Cache Links for All Memory Accesses. Он меня спасет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 24 января, 2012 Опубликовано 24 января, 2012 (изменено) · Жалоба Это, я так понимаю здесь задается? Пробовал так делать - запись в память вообще не проходит. Сейчас заметил чекбокс Use Cache Links for All Memory Accesses. Он меня спасет? Да - здесь. Что значит "Пробовал так делать - запись в память вообще не проходит" ? Use Cache Links for All Memory Accesses Согласно документации - это доступ ко всей памяти по шине XCL/AXI вне зависимости от вкл/выкл кеша процессора (функции типа microblaze_enable_icache(); ) Изменено 24 января, 2012 пользователем Alex77 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chipovod 0 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба Да - здесь. Что значит "Пробовал так делать - запись в память вообще не проходит" ? У меня к AXI шине подключена корка, которая имеет внутренню память и, соответственно, диапазон адресного пространства для чтения/записи. При включенном Dcache запись/чтение из MicroBlaze хорошо работает, но приходится делать постоянный Flush кэша, чтобы заставить MicroBlaze обновить данные в корке. После исключения диапазона адресного пространства корки из кэширования и попытке чтения/записи обращений к корке по AXI шине нет. Из окошка Memory в Eclipse (среда SDK) по всему адресному пространству - нули и попытка записать туда что-либо ни к чему не приводит. Данные не изменяются, обращений к корке нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба У меня к AXI шине подключена корка, которая имеет внутренню память и, соответственно, диапазон адресного пространства для чтения/записи. При включенном Dcache запись/чтение из MicroBlaze хорошо работает, но приходится делать постоянный Flush кэша, чтобы заставить MicroBlaze обновить данные в корке. После исключения диапазона адресного пространства корки из кэширования и попытке чтения/записи обращений к корке по AXI шине нет. Из окошка Memory в Eclipse (среда SDK) по всему адресному пространству - нули и попытка записать туда что-либо ни к чему не приводит. Данные не изменяются, обращений к корке нет. EDK проект в студию... "Рабочий" и "не рабочий" вариант проекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chipovod 0 26 января, 2012 Опубликовано 26 января, 2012 · Жалоба Полез повторять эксперимент и кажется разобрался в чем дело. При записи/чтении в мою корку из MicroBlaze данные проходят через кэш и с порта M_AXI_DC попадают в мою корку. Если я отключаю кэш, транзакции на M_AXI_DC пропадают. Подключил к своей корке порт M_AXI_DP от MicroBlaze, отключил кэширование адресов корки и все заработало. Время записи в мою корку сократилось в несколько раз после отказа от flush. Но осталось не понятным почему при отключении кэширования данные на M_AXI_DC не проходят? Ведь это основной порт для выхода на AXI шину. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться