My application is barely over 32 Kb (around 36 Kb). The documentation seems to indicate that I must use 64 Kb memory, which wastes 28 Kb of memory. Is there a way to work around this so that I can use only four Kb extra without wasting 28 Kb of memory?
Since the IOCM is instantiated as a bus, it is possible to instantiate more than one IOCM block RAM controller.
If you want to use 36 Kb, the distribution is as follows:
# One IOCM Controller for 4 KB, where the Base Address is: 0xFFFF7000 AND the High Address is: 0xFFFF7FFF
# One IOCM Controller for 32 KB, where the Base Address is 0xFFFF8000 AND the High Address is: 0xFFFFFFFF
Consequently, you are instantiating 36 Kb of contiguous IOCM block RAM memory for your system. On the software side, you can modify the linker script to make the ICOM memory look like one piece of memory, as it is contiguous. The following is a snippet of MHS file to implement this method:
-----------------------------------------------------------------------------------
BEGIN isocm_v10
PARAMETER INSTANCE = iocm
PARAMETER HW_VER = 2.00.a
PARAMETER C_ISCNTLVALUE = 0x81
PORT ISOCM_Clk = sys_clk_s
PORT sys_rst = sys_bus_reset
END
BEGIN isbram_if_cntlr
PARAMETER INSTANCE = iocm_cntlr
PARAMETER HW_VER = 3.00.a
PARAMETER C_BASEADDR = 0xffff8000
PARAMETER C_HIGHADDR = 0xffffffff
BUS_INTERFACE ISOCM = iocm
BUS_INTERFACE DCR_WRITE_PORT = isocm_porta
BUS_INTERFACE INSTRN_READ_PORT = isocm_portb
END
BEGIN bram_block
PARAMETER INSTANCE = isocm_bram
PARAMETER HW_VER = 1.00.a
BUS_INTERFACE PORTA = isocm_porta
BUS_INTERFACE PORTB = isocm_portb
END
BEGIN isbram_if_cntlr
PARAMETER INSTANCE = iocm_cntlr_1
PARAMETER HW_VER = 3.00.a
PARAMETER C_BASEADDR = 0xFFFF7000
PARAMETER C_HIGHADDR = 0xFFFF7FFF
BUS_INTERFACE ISOCM = iocm
BUS_INTERFACE DCR_WRITE_PORT = isocm_porta_1
BUS_INTERFACE INSTRN_READ_PORT = isocm_portb_1
END
BEGIN bram_block
PARAMETER INSTANCE = isocm_bram_1
PARAMETER HW_VER = 1.00.a
BUS_INTERFACE PORTA = isocm_porta_1
BUS_INTERFACE PORTB = isocm_portb_1
END