Idioma: Português | English
Este projeto implementa uma cache associativa por conjunto 4-way, somente leitura, em Verilog. O objetivo é servir como material educacional de arquitetura de computadores, mostrando como tags, bits de validade, seleção de vias, preenchimento por bloco e política LRU se conectam em um datapath simples.
O projeto nasceu como trabalho da disciplina INF450, mas este repositório contém apenas uma implementação própria e documentação pública. Materiais brutos de referência usados durante o estudo não são redistribuídos neste repositório.
- Cache
4-way set-associativesomente leitura. - Separação do endereço em
tag,lineeblock offset. - Quatro arrays de tags, validade e dados, um por via.
- Codificador para identificar a via de
hit. - Decodificador para habilitar escrita na via escolhida em caso de
miss. - FSM principal para comparar tags, tratar
hit, buscar bloco na RAM e atualizar metadados. - Política LRU local por conjunto usando idades de 2 bits.
- Testbench auto-verificável com mensagens
PASS/FAIL. - Desenho SVG editável no Inkscape e renderizado no Colab com dados reais da simulação.
- Cobertura de teste para substituição LRU, múltiplas linhas da cache e offsets dentro do bloco.
.
├── assets/ # SVG editável no Inkscape para visualização do datapath
├── src/ # Código Verilog e testbench
├── docs/ # Explicações de datapath, FSM, LRU e visualização
├── notebooks/ # Notebook Colab para simular e visualizar o projeto
├── .github/workflows/ # CI com Icarus Verilog
├── LICENSE
├── README.md
└── README.en.md
Requisito: Icarus Verilog.
cd src
make simO testbench gera uma sequência de leituras e imprime, para cada acesso, endereço, tag, linha, bloco, sinal de hit, via selecionada e dado de saída.
Além do log textual, ele gera trace.csv, usado pelo notebook Colab para preencher o SVG do datapath com os sinais de cada acesso.
Os cenários cobrem misses em vias inválidas, hit após preenchimento, substituição LRU, indexação em linhas diferentes e leitura de offsets diferentes dentro do mesmo bloco.
| Parâmetro | Valor |
|---|---|
CACHE_SIZE |
64 bytes |
RAM_SIZE |
4096 bytes |
BLOCK_SIZE |
4 bytes |
WAYS |
4 |
CACHE_LINES |
4 |
RAM_BITS |
12 |
LINE_BITS |
2 |
BLOCK_BITS |
2 |
TAG_BITS |
8 |
Formato do endereço:
[tag][line][block offset]
ACCESS miss fills invalid way0 addr=0 hit=0 way=0 dout=0
PASS hit value=0
PASS selected_way value=0
PASS dout value=0
...
ACCESS hit updates LRU addr=0 hit=1 way=0 dout=0
PASS hit value=1
...
ALL TESTS PASSED
- A cache é somente leitura: não há caminho de escrita do processador para a cache.
- O projeto é educacional e prioriza clareza arquitetural sobre otimizações de síntese.
- O testbench cobre os cenários principais, mas ainda pode ser expandido para sequências maiores e padrões aleatórios de acesso.
- Datapath da cache
- Desenho Inkscape e marcadores dinâmicos
- FSM principal
- Política LRU
- Como apresentar este projeto
- Checklist de desenvolvimento
- Backlog
Este projeto foi desenvolvido como estudo de arquitetura de computadores. Os exemplos de cache direta, cache 2-way e cache 4-way da disciplina foram usados como referência conceitual, mas o repositório público mantém apenas código e documentação autorais.