Line 129... |
Line 129... |
value printed in light gray.
|
value printed in light gray.
|
|
|
[TIP]
|
[TIP]
|
The NEORV32 generics allow to configure the system according to your needs. The generics are
|
The NEORV32 generics allow to configure the system according to your needs. The generics are
|
used to control implementation of certain CPU extensions and peripheral modules and even allow to
|
used to control implementation of certain CPU extensions and peripheral modules and even allow to
|
optimize the system for certain design goals like minimal area or maximum performance.
|
optimize the system for certain design goals like minimal area or maximum performance. +
|
|
**More information can be found in the user guides' section
|
|
https://stnolting.github.io/neorv32/ug/#_application_specific_processor_configuration[Application-Specific Processor Configuration]**.
|
|
|
[TIP]
|
[TIP]
|
Privileged software can determine the actual CPU and processor configuration via the `misa` and
|
Privileged software can determine the actual CPU and processor configuration via the `misa` and the
|
`mzext` (see <<_machine_trap_setup>> and <<_neorv32_specific_custom_csrs>>) CSRs and via the memory-mapped _SYSINFO_ module (see <<_system_configuration_information_memory_sysinfo>>),
|
i_SYSINFO_CPU_ <<_system_configuration_information_memory_sysinfo, SYSINFO>> register.
|
respectively.
|
|
|
|
[TIP]
|
[NOTE]
|
If optional modules (like CPU extensions or peripheral devices) are *not enabled* the according circuitry **will not be synthesized at all**.
|
If optional modules (like CPU extensions or peripheral devices) are *not enabled* the according circuitry
|
Hence, the disabled modules do not increase area and power requirements and do not impact the timing.
|
**will not be synthesized at all**. Hence, the disabled modules do not increase area and power requirements
|
|
and do not impact the timing.
|
|
|
[TIP]
|
[NOTE]
|
Not all configuration combinations are valid. The processor RTL code provides sanity checks to inform the user
|
Not all configuration combinations are valid. The processor RTL code provides sanity checks to inform the user
|
during synthesis/simulation if an invalid combination has been detected.
|
during synthesis/simulation if an invalid combination has been detected.
|
|
|
**Generic Description**
|
**Generic Description**
|
|
|
Line 170... |
Line 172... |
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **CLOCK_FREQUENCY** | _natural_ | _none_
|
| **CLOCK_FREQUENCY** | _natural_ | _none_
|
3+| The clock frequency of the processor's `clk_i` input port in Hertz (Hz).
|
3+| The clock frequency of the processor's `clk_i` input port in Hertz (Hz). This value can be retrieved by software
|
|
from the <<_system_configuration_information_memory_sysinfo, SYSINFO>> module.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _INT_BOOTLOADER_EN_
|
===== _INT_BOOTLOADER_EN_
|
Line 188... |
Line 191... |
0x00000000) to the base address of the boot ROM. See section <<_boot_configuration>> for more information.
|
0x00000000) to the base address of the boot ROM. See section <<_boot_configuration>> for more information.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _USER_CODE_
|
|
|
|
[cols="4,4,2"]
|
|
[frame="all",grid="none"]
|
|
|======
|
|
| **USER_CODE** | _std_ulogic_vector(31 downto 0)_ | x"00000000"
|
|
3+| Custom user code that can be read by software via the _SYSINFO_ module.
|
|
|======
|
|
|
|
|
|
:sectnums!:
|
|
===== _HW_THREAD_ID_
|
===== _HW_THREAD_ID_
|
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **HW_THREAD_ID** | _natural_ | 0
|
| **HW_THREAD_ID** | _natural_ | 0
|
3+| The hart ID of the CPU. Can be read via the `mhartid` CSR. Hart IDs must be unique within a system.
|
3+| The hart ID of the CPU. Software can retrieve this value from the `mhartid` CSR.
|
|
Note that hart IDs must be unique within a system.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _ON_CHIP_DEBUGGER_EN_
|
===== _ON_CHIP_DEBUGGER_EN_
|
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **ON_CHIP_DEBUGGER_EN** | _boolean_ | false
|
| **ON_CHIP_DEBUGGER_EN** | _boolean_ | false
|
3+| Implement on-chip debugger (OCD). See chapter <<_on_chip_debugger_ocd>>.
|
3+| Implement the on-chip debugger (OCD) and the CPU debug mode.
|
|
See chapter <<_on_chip_debugger_ocd>> for more information.
|
|======
|
|======
|
|
|
|
|
// ####################################################################################################################
|
// ####################################################################################################################
|
:sectnums:
|
:sectnums:
|
==== RISC-V CPU Extensions
|
==== RISC-V CPU Extensions
|
|
|
See section <<_instruction_sets_and_extensions>> for more information.
|
[TIP]
|
|
See section <<_instruction_sets_and_extensions>> for more information. The configuration of the RISC-V _main_ ISA extensions
|
|
(like `M`) can be determined via the <<_misa>> CSR. The configuration of ISA _sub-extensions_ (like `Zicsr`) and _extension options_
|
|
can be determined via memory-mapped registers of the <<_system_configuration_information_memory_sysinfo>> module.
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _CPU_EXTENSION_RISCV_A_
|
===== _CPU_EXTENSION_RISCV_A_
|
|
|
Line 246... |
Line 243... |
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **CPU_EXTENSION_RISCV_C** | _boolean_ | false
|
| **CPU_EXTENSION_RISCV_C** | _boolean_ | false
|
3+| Implement compressed instructions (16-bit) when _true_.
|
3+| Implement compressed instructions (16-bit) when _true_. Compressed instructions can reduce program code
|
See section <<_c_compressed_instructions>>.
|
size by approx. 30%. See section <<_c_compressed_instructions>>.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _CPU_EXTENSION_RISCV_E_
|
===== _CPU_EXTENSION_RISCV_E_
|
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **CPU_EXTENSION_RISCV_E** | _boolean_ | false
|
| **CPU_EXTENSION_RISCV_E** | _boolean_ | false
|
3+| Implement the embedded CPU extension (only implement the first 16 data registers) when _true_.
|
3+| Implement the embedded CPU extension (only implement the first 16 data registers) when _true_. This reduces embedded memory
|
See section <<_e_embedded_cpu>>.
|
requirements for the register file. See section <<_e_embedded_cpu>> for more information. Note that this RISC-V extensions
|
|
requires a different application binary interface (ABI).
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _CPU_EXTENSION_RISCV_M_
|
===== _CPU_EXTENSION_RISCV_M_
|
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **CPU_EXTENSION_RISCV_M** | _boolean_ | false
|
| **CPU_EXTENSION_RISCV_M** | _boolean_ | false
|
3+| Implement integer multiplication and division instructions when _true_.
|
3+| Implement hardware accelerators for integer multiplication and division instructions when _true_.
|
See section <<_m_integer_multiplication_and_division>>.
|
If this extensions is not enabled, multiplication and division operations (_not_ instructions) will be computed entirely in software.
|
|
If only a hardware multiplier is required use the <<_cpu_extension_riscv_zmmul>> extension. Multiplication can also be mapped
|
|
to DSP slices via the <<_fast_mul_en>> generic.
|
|
See section <<_m_integer_multiplication_and_division>> for more information.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _CPU_EXTENSION_RISCV_U_
|
===== _CPU_EXTENSION_RISCV_U_
|
Line 283... |
Line 284... |
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **CPU_EXTENSION_RISCV_U** | _boolean_ | false
|
| **CPU_EXTENSION_RISCV_U** | _boolean_ | false
|
3+| Implement less-privileged user mode when _true_.
|
3+| Implement less-privileged user mode when _true_.
|
See section <<_u_less_privileged_user_mode>>.
|
See section <<_u_less_privileged_user_mode>> for more information.
|
|
|======
|
|
|
|
|
|
:sectnums!:
|
|
===== _CPU_EXTENSION_RISCV_Zbb_
|
|
|
|
[cols="4,4,2"]
|
|
[frame="all",grid="none"]
|
|
|======
|
|
| **CPU_EXTENSION_RISCV_Zbb** | _boolean_ | false
|
|
3+| Implement the `Zbb` _basic_ bit-manipulation sub-extension when _true_.
|
|
See section <<_zbb_basic_bit_manipulation_operations>> for more information.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _CPU_EXTENSION_RISCV_Zfinx_
|
===== _CPU_EXTENSION_RISCV_Zfinx_
|
Line 295... |
Line 308... |
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **CPU_EXTENSION_RISCV_Zfinx** | _boolean_ | false
|
| **CPU_EXTENSION_RISCV_Zfinx** | _boolean_ | false
|
3+| Implement the 32-bit single-precision floating-point extension (using integer registers) when _true_.
|
3+| Implement the 32-bit single-precision floating-point extension (using integer registers) when _true_.
|
See section <<_zfinx_single_precision_floating_point_operations>>.
|
See section <<_zfinx_single_precision_floating_point_operations>> for more information.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _CPU_EXTENSION_RISCV_Zicsr_
|
===== _CPU_EXTENSION_RISCV_Zicsr_
|
Line 309... |
Line 322... |
|======
|
|======
|
| **CPU_EXTENSION_RISCV_Zicsr** | _boolean_ | true
|
| **CPU_EXTENSION_RISCV_Zicsr** | _boolean_ | true
|
3+| Implement the control and status register (CSR) access instructions when true. Note: When this option is
|
3+| Implement the control and status register (CSR) access instructions when true. Note: When this option is
|
disabled, the complete privileged architecture / trap system will be excluded from synthesis. Hence, no interrupts, no exceptions and
|
disabled, the complete privileged architecture / trap system will be excluded from synthesis. Hence, no interrupts, no exceptions and
|
no machine information will be available.
|
no machine information will be available.
|
See section <<_zicsr_control_and_status_register_access_privileged_architecture>>.
|
See section <<_zicsr_control_and_status_register_access_privileged_architecture>> for more information.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _CPU_EXTENSION_RISCV_Zifencei_
|
===== _CPU_EXTENSION_RISCV_Zifencei_
|
Line 321... |
Line 334... |
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **CPU_EXTENSION_RISCV_Zifencei** | _boolean_ | false
|
| **CPU_EXTENSION_RISCV_Zifencei** | _boolean_ | false
|
3+| Implement the instruction fetch synchronization instruction `fence.i`. For example, this option is required
|
3+| Implement the instruction fetch synchronization instruction `fence.i`. For example, this option is required
|
for self-modifying code (and/or for i-cache flushes).
|
for self-modifying code (and/or for instruction cache and CPU prefetch buffer flushes).
|
See section <<_zifencei_instruction_stream_synchronization>>.
|
See section <<_zifencei_instruction_stream_synchronization>> for more information.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _CPU_EXTENSION_RISCV_Zmmul_
|
===== _CPU_EXTENSION_RISCV_Zmmul_
|
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **CPU_EXTENSION_RISCV_Zmmul** | _boolean_ | false
|
| **CPU_EXTENSION_RISCV_Zmmul** | _boolean_ | false
|
3+| Implement integer multiplication-only instructions when _true_. This is a sub-extensions of the `M` extension.
|
3+| Implement integer multiplication-only instructions when _true_. This is a sub-extension of the `M` extension, which
|
See section <<_zmmul_integer_multiplication>>.
|
cannot be used together with the `M` extension. See section <<_zmmul_integer_multiplication>> for more information.
|
|======
|
|======
|
|
|
|
|
// ####################################################################################################################
|
// ####################################################################################################################
|
:sectnums:
|
:sectnums:
|
Line 352... |
Line 365... |
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **FAST_MUL_EN** | _boolean_ | false
|
| **FAST_MUL_EN** | _boolean_ | false
|
3+| When this generic is enabled, the multiplier of the `M` extension is realized using DSPs blocks instead of an
|
3+| When this generic is enabled, the multiplier of the `M` extension is implemented using DSPs blocks instead of an
|
iterative bit-serial approach. This generic is only relevant when the multiplier and divider CPU extension is
|
iterative bit-serial approach. Performance will be increased and LUT utilization will be reduced at the cost of DSP slice
|
enabled (<<_cpu_extension_riscv_m>> is _true_).
|
utilization. This generic is only relevant when a hardware multiplier CPU extension is
|
|
enabled (<<_cpu_extension_riscv_m>> or <<_cpu_extension_riscv_zmmul>> is _true_). **Note that the multipliers of the
|
|
<<_zfinx_single_precision_floating_point_operations>> extension are always mapped to DSP block (if available).**
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _FAST_SHIFT_EN_
|
===== _FAST_SHIFT_EN_
|
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **FAST_SHIFT_EN** | _boolean_ | false
|
| **FAST_SHIFT_EN** | _boolean_ | false
|
3+| When this generic is set _true_ the shifter unit of the CPU's ALU is implemented as fast barrel shifter (requiring
|
3+| If this generic is set _true_ the shifter unit of the CPU's ALU is implemented as fast barrel shifter (requiring
|
more hardware resources). If it is set _false_ the CPU uses a serial shifter that only performs a single bit shift per cycle
|
more hardware resources but completing within two clock cycles). If it is set _false_, the CPU uses a serial shifter
|
(small but slow).
|
that only performs a single bit shift per cycle (requiring less hardware resources, but requires up to 32 clock
|
|
cycles to complete - depending on shift amount). **Note that this option also implements barrel shifters for _all_
|
|
shift-related operations of the <<_zbb_basic_bit_manipulation_operations>> extension.**
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _CPU_CNT_WIDTH_
|
===== _CPU_CNT_WIDTH_
|
Line 379... |
Line 396... |
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **CPU_CNT_WIDTH** | _natural_ | 64
|
| **CPU_CNT_WIDTH** | _natural_ | 64
|
3+| This generic configures the total size of the CPU's `cycle` and `instret` CSRs (low word + high word).
|
3+| This generic configures the total size of the CPU's `cycle` and `instret` CSRs (low word + high word).
|
The maximum value is 64, the minimum value is 0. See
|
The maximum value is 64, the minimum value is 0. See section <<_machine_counters_and_timers>> for more information.
|
section <<_machine_counters_and_timers>> for more information. Note: configurations with <<_cpu_cnt_width>>
|
Note: configurations with <<_cpu_cnt_width>> less than 64 bits do not comply to the RISC-V specs.
|
less than 64 bits do not comply to the RISC-V specs.
|
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _CPU_IPB_ENTRIES_
|
===== _CPU_IPB_ENTRIES_
|
Line 394... |
Line 410... |
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **CPU_IPB_ENTRIES** | _natural_ | 2
|
| **CPU_IPB_ENTRIES** | _natural_ | 2
|
3+| This generic configures the number of entries in the CPU's instruction prefetch buffer (a FIFO).
|
3+| This generic configures the number of entries in the CPU's instruction prefetch buffer (a FIFO).
|
The value has to be a power of two and has to be greater than zero.
|
The value has to be a power of two and has to be greater than zero.
|
Long linear sequences of code can benefit from an increased IPB size. For setups that use the instruction
|
Long linear sequences of code can benefit from an increased IPB size.
|
cache (<<_icache_en>>) this generic should be set to 1.
|
|
|======
|
|======
|
|
|
|
|
// ####################################################################################################################
|
// ####################################################################################################################
|
:sectnums:
|
:sectnums:
|
Line 414... |
Line 429... |
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **PMP_NUM_REGIONS** | _natural_ | 0
|
| **PMP_NUM_REGIONS** | _natural_ | 0
|
3+| Total number of implemented protections regions (0..64). If this generics is zero no physical memory
|
3+| Total number of implemented protections regions (0..64). If this generics is zero no physical memory
|
protection logic will be implemented at all. Setting <<_pmp_num_regions>>_ > 0 will set the _CSR_MZEXT_PMP_ flag
|
protection logic will be implemented at all. Setting <<_pmp_num_regions>>_ > 0 will set the _SYSINFO_CPU_PMP_ flag
|
in the <<_mzext>> CSR.
|
in the _SYSINFO_CPU_ <<_system_configuration_information_memory_sysinfo, SYSINFO>> register.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _PMP_MIN_GRANULARITY_
|
===== _PMP_MIN_GRANULARITY_
|
Line 444... |
Line 459... |
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **HPM_NUM_CNTS** | _natural_ | 0
|
| **HPM_NUM_CNTS** | _natural_ | 0
|
3+| Total number of implemented hardware performance monitor counters (0..29). If this generics is zero no
|
3+| Total number of implemented hardware performance monitor counters (0..29). If this generics is zero, no
|
hardware performance monitor logic will be implemented at all. Setting <<_hpm_num_cnts>> > 0 will set the _CSR_MZEXT_HPM_ flag
|
hardware performance monitor logic will be implemented at all. Setting <<_hpm_num_cnts>> > 0 will set the _SYSINFO_CPU_HPM_ flag
|
in the <<_mzext>> CSR.
|
in the _SYSINFO_CPU_ <<_system_configuration_information_memory_sysinfo, SYSINFO>> register.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _HPM_CNT_WIDTH_
|
===== _HPM_CNT_WIDTH_
|
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **HPM_CNT_WIDTH** | _natural_ | 40
|
| **HPM_CNT_WIDTH** | _natural_ | 40
|
3+| This generic defines the total LSB-aligned size of each HPM counter (size(`[m]hpmcounter*h`) +
|
3+| This generic defines the total LSB-aligned size of each HPM counter (`size([m]hpmcounter*h)` +
|
size(`[m]hpmcounter*`)). The maximum value is 64, the minimal is 0. If the size is less than 64-bit, the
|
`size([m]hpmcounter*)`). The maximum value is 64, the minimal is 0. If the size is less than 64-bit, the
|
unused MSB-aligned counter bits are hardwired to zero.
|
unused MSB-aligned counter bits are hardwired to zero.
|
|======
|
|======
|
|
|
|
|
// ####################################################################################################################
|
// ####################################################################################################################
|
Line 488... |
Line 503... |
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **MEM_INT_IMEM_SIZE** | _natural_ | 16*1024
|
| **MEM_INT_IMEM_SIZE** | _natural_ | 16*1024
|
3+| Size in bytes of the processor internal instruction memory (IMEM). Has no effect when _MEM_INT_IMEM_EN_ is _false_.
|
3+| Size in bytes of the processor internal instruction memory (IMEM). Has no effect when <<_mem_int_imem_en>> is _false_.
|
|======
|
|======
|
|
|
|
|
// ####################################################################################################################
|
// ####################################################################################################################
|
:sectnums:
|
:sectnums:
|
Line 517... |
Line 532... |
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **MEM_INT_DMEM_SIZE** | _natural_ | 8*1024
|
| **MEM_INT_DMEM_SIZE** | _natural_ | 8*1024
|
3+| Size in bytes of the processor-internal data memory (DMEM). Has no effect when _MEM_INT_DMEM_EN_ is _false_.
|
3+| Size in bytes of the processor-internal data memory (DMEM). Has no effect when <<_mem_int_dmem_en>> is _false_.
|
|======
|
|======
|
|
|
|
|
// ####################################################################################################################
|
// ####################################################################################################################
|
:sectnums:
|
:sectnums:
|
Line 535... |
Line 550... |
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **ICACHE_EN** | _boolean_ | false
|
| **ICACHE_EN** | _boolean_ | false
|
3+| Implement processor internal instruction cache when _true_.
|
3+| Implement processor internal instruction cache when _true_. Note: if the setup only uses processor-internal data
|
|
and instruction memories there is not point of implementing the i-cache.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _ICACHE_NUM_BLOCK_
|
===== _ICACHE_NUM_BLOCK_
|
Line 547... |
Line 563... |
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **ICACHE_NUM_BLOCKS** | _natural_ | 4
|
| **ICACHE_NUM_BLOCKS** | _natural_ | 4
|
3+| Number of blocks (cache "pages" or "lines") in the instruction cache. Has to be a power of two. Has no
|
3+| Number of blocks (cache "pages" or "lines") in the instruction cache. Has to be a power of two. Has no
|
effect when _ICACHE_DMEM_EN_ is false.
|
effect when <<_icache_dmem_en>> is false.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _ICACHE_BLOCK_SIZE_
|
===== _ICACHE_BLOCK_SIZE_
|
Line 559... |
Line 575... |
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **ICACHE_BLOCK_SIZE** | _natural_ | 64
|
| **ICACHE_BLOCK_SIZE** | _natural_ | 64
|
3+| Size in bytes of each block in the instruction cache. Has to be a power of two. Has no effect when
|
3+| Size in bytes of each block in the instruction cache. Has to be a power of two. Has no effect when
|
_ICACHE_EN_ is _false_.
|
<<_icache_dmem_en>> is _false_.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _ICACHE_ASSOCIATIVITY_
|
===== _ICACHE_ASSOCIATIVITY_
|
Line 571... |
Line 587... |
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **ICACHE_ASSOCIATIVITY** | _natural_ | 1
|
| **ICACHE_ASSOCIATIVITY** | _natural_ | 1
|
3+| Associativity (= number of sets) of the instruction cache. Has to be a power of two. Allowed configurations:
|
3+| Associativity (= number of sets) of the instruction cache. Has to be a power of two. Allowed configurations:
|
`1` = 1 set, direct mapped; `2` = 2-way set-associative. Has no effect when _ICACHE_EN_ is _false_.
|
`1` = 1 set, direct mapped; `2` = 2-way set-associative. Has no effect when <<_icache_dmem_en>> is _false_.
|
|======
|
|======
|
|
|
|
|
// ####################################################################################################################
|
// ####################################################################################################################
|
:sectnums:
|
:sectnums:
|
Line 600... |
Line 616... |
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **MEM_EXT_TIMEOUT** | _natural_ | 255
|
| **MEM_EXT_TIMEOUT** | _natural_ | 255
|
3+| Clock cycles after which a pending external bus access will auto-terminate and raise a bus fault exception. Set to 0 to disable auto-timeout.
|
3+| Clock cycles after which a pending external bus access will auto-terminate and raise a bus fault exception.
|
|
If set to zero, there will be no auto-timeout and no bus fault exception (might permanently stall system!).
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _MEM_EXT_PIPE_MODE_
|
===== _MEM_EXT_PIPE_MODE_
|
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **MEM_EXT_PIPE_MODE** | _boolean_ | false
|
| **MEM_EXT_PIPE_MODE** | _boolean_ | false
|
3+| Use _standard_ ("classic") Wishbone protocol for external bus when _false_; use _pipelined_ Wishbone protocol when _true_.
|
3+| Use _standard_ ("classic") Wishbone protocol for external bus when _false_.
|
|
Use _pipelined_ Wishbone protocol when _true_.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _MEM_EXT_BIG_ENDIAN_
|
===== _MEM_EXT_BIG_ENDIAN_
|
|
|
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **MEM_EXT_BIG_ENDIAN** | _boolean_ | false
|
| **MEM_EXT_BIG_ENDIAN** | _boolean_ | false
|
3+| Use BIG endian interface for external bus when _true_; use little endian interface when _false_.
|
3+| Use BIG endian interface for external bus when _true_. Use little endian interface when _false_.
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _MEM_EXT_ASYNC_RX_
|
===== _MEM_EXT_ASYNC_RX_
|
Line 635... |
Line 653... |
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **MEM_EXT_ASYNC_RX** | _boolen_ | false
|
| **MEM_EXT_ASYNC_RX** | _boolen_ | false
|
3+| By default, _MEM_EXT_ASYNC_RX_ = _false_ implements a registered read-back path (RX) for incoming data in the bus interface
|
3+| By default, _MEM_EXT_ASYNC_RX_ = _false_ implements a registered read-back path (RX) for incoming data in the bus interface
|
in order to shorten the critical path. By setting _MEM_EXT_ASYNC_RX_ = _true_ an _asynchronous_ ("direct") read-back path is
|
in order to shorten the critical path. By setting _MEM_EXT_ASYNC_RX_ = _true_ an _asynchronous_ ("direct") read-back path is
|
implemented reducing access latency by one cycle.
|
implemented reducing access latency by one cycle but eventually increasing the critical path.
|
|======
|
|======
|
|
|
|
|
// ####################################################################################################################
|
// ####################################################################################################################
|
:sectnums:
|
:sectnums:
|
Line 716... |
Line 734... |
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **XIRQ_TRIGGER_TYPE** | _std_ulogic_vector(31 downto 0)_ | 0xFFFFFFFF
|
| **XIRQ_TRIGGER_TYPE** | _std_ulogic_vector(31 downto 0)_ | 0xFFFFFFFF
|
3+| Interrupt trigger type configuration (one bit for each IRQ channel): `0` = level-triggered, '1' = edge triggered.
|
3+| Interrupt trigger type configuration (one bit for each IRQ channel): `0` = level-triggered, '1' = edge triggered.
|
_XIRQ_TRIGGER_POLARITY_ generic is used to specify the actual level (high/low) or edge (falling/rising).
|
<<_xirq_trigger_polarity>> generic is used to specify the actual level (high/low) or edge (falling/rising).
|
|======
|
|======
|
|
|
|
|
:sectnums!:
|
:sectnums!:
|
===== _XIRQ_TRIGGER_POLARITY_
|
===== _XIRQ_TRIGGER_POLARITY_
|
Line 728... |
Line 746... |
[cols="4,4,2"]
|
[cols="4,4,2"]
|
[frame="all",grid="none"]
|
[frame="all",grid="none"]
|
|======
|
|======
|
| **XIRQ_TRIGGER_POLARITY** | _std_ulogic_vector(31 downto 0)_ | 0xFFFFFFFF
|
| **XIRQ_TRIGGER_POLARITY** | _std_ulogic_vector(31 downto 0)_ | 0xFFFFFFFF
|
3+| Interrupt trigger polarity configuration (one bit for each IRQ channel): `0` = low-level/falling-edge,
|
3+| Interrupt trigger polarity configuration (one bit for each IRQ channel): `0` = low-level/falling-edge,
|
'1' = high-level/rising-edge. _XIRQ_TRIGGER_TYPE_ generic is used to specify the actual type (level or edge).
|
'1' = high-level/rising-edge. <<_xirq_trigger_type>> generic is used to specify the actual type (level or edge).
|
|======
|
|======
|
|
|
|
|
// ####################################################################################################################
|
// ####################################################################################################################
|
:sectnums:
|
:sectnums:
|