OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [docs/] [datasheet/] [soc_icache.adoc] - Blame information for rev 60

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 60 zero_gravi
<<<
2
:sectnums:
3
==== Processor-Internal Instruction Cache (iCACHE)
4
 
5
[cols="<3,<3,<4"]
6
[frame="topbot",grid="none"]
7
|=======================
8
| Hardware source file(s): | neorv32_icache.vhd |
9
| Software driver file(s): | none             | _implicitly used_
10
| Top entity port:         | none             |
11
| Configuration generics:  | _ICACHE_EN_ | implement processor-internal instruction cache when _true_
12
|                          | _ICACHE_NUM_BLOCKS_ | number of cache blocks (pages/lines)
13
|                          | _ICACHE_BLOCK_SIZE_ | size of a cache block in bytes
14
|                          | _ICACHE_ASSOCIATIVITY_ | associativity / number of sets
15
| CPU interrupts:          | none             |
16
|=======================
17
 
18
The processor features an optional cache for instructions to compensate memories with high latency. The
19
cache is directly connected to the CPU's instruction fetch interface and provides a full-transparent buffering
20
of instruction fetch accesses to the entire 4GB address space.
21
 
22
[IMPORTANT]
23
The instruction cache is intended to accelerate instruction fetch via the external memory interface.
24
Since all processor-internal memories provide an access latency of one cycle (by default), caching
25
internal memories does not bring any performance gain. However, it _might_ reduce traffic on the
26
processor-internal bus.
27
 
28
The cache is implemented if the _ICACHE_EN_ generic is true. The size of the cache memory is defined via
29
_ICACHE_BLOCK_SIZE_ (the size of a single cache block/page/line in bytes; has to be a power of two and >=
30
4 bytes), _ICACHE_NUM_BLOCKS_ (the total amount of cache blocks; has to be a power of two and >= 1) and
31
the actual cache associativity _ICACHE_ASSOCIATIVITY_ (number of sets; 1 = direct-mapped, 2 = 2-way set-associative,
32
has to be a power of two and >= 1).
33
 
34
If the cache associativity (_ICACHE_ASSOCIATIVITY_) is > 1 the LRU replacement policy (least recently
35
used) is used.
36
 
37
[TIP]
38
Keep the features of the targeted FPGA's memory resources (block RAM) in mind when configuring
39
the cache size/layout to maximize and optimize resource utilization.
40
 
41
By executing the `ifence.i` instruction (`Zifencei` CPU extension) the cache is cleared and a reload from
42
main memory is forced. Among other things, this allows to implement self-modifying code.
43
 
44
**Bus Access Fault Handling**
45
 
46
The cache always loads a complete cache block (_ICACHE_BLOCK_SIZE_ bytes) aligned to the size of a cache
47
block if a miss is detected. If any of the accessed addresses within a single block do not successfully
48
acknowledge (i.e. issuing an error signal or timing out) the whole cache block is invalidate and any access to
49
an address within this cache block will also raise an instruction fetch bus error fault exception.
50
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.