Problema: A CPU pode fazer até duas requisições de memória por ciclo, uma no estágio de Fetch (IF) e outra no estágio de Memória (MEM).
Na versão da CPU que entregamos ao final da disciplina de MC851, resolvemos isso com uma arquitetura Harvard de memória (em termos simples: uma ROM de instruções e RAM+Periféricos separados). Isso funciona, mas não é o ideal, pois não segue o padrão do RISC-V nem permite carregar novos programas dinamicamente.
Esse problema pode ser mitigado introduzindo-se uma cache separada para cada estágio (cada uma tem 1 MMU), reduzindo a quantidade de conflitos. Mas isso por si só não resolve o problema; o que acontece se ambas as caches derem miss ao mesmo tempo? Precisamos de mecanismo de arbitragem das requisições das MMUs de Dados e Instruções, onde o ideal seria que:
Uma MMU só acesse um único dispositivo mapeado em memória por vez.
Um dispositivo só seja acessado por uma única MMU.
Cada acesso permita fazer 1 leitura, 1 escrita, ou (opcional) 1 leitura+1 escrita.
Se as duas MMUs tentarem acessar dispositivos diferentes e não houver conflito de recursos, duas transações independentes podem ser executadas.
Cada transação de memória permita especificar quantas palavras devem ser escritas ou lidas (pode ser útil para a cache ler um bloco inteiro de uma vez).
Uma vez iniciada e aceita, uma transação não pode ser interrompida por uma nova requisição.
Requisições em endereços inválidos devem retornar um erro.
Não é necessário reinventar a roda! Protocolos abertos:
AXI (Advanced eXtensible Interface)
AXI-Lite
Wishbone
OBI (OpenHW Open Bus Interface)
Outros protocolos:
Avalon
Nota: O controlador de barramento atualmente é chamado de IMC (controlador de memória integrado), seja por inexperiência/desconhecimento meu, ou por indefinição da arquitetura de memória, ou porque o artigo da Wikipedia misturou um monte de coisas que não tem nada a ver, ou porque essas coisas tem uns 1000 nomes diferentes de acordo com a literatura (alguns chamam de Interconnect, por exemplo).
Problema: A CPU pode fazer até duas requisições de memória por ciclo, uma no estágio de Fetch (IF) e outra no estágio de Memória (MEM).
Na versão da CPU que entregamos ao final da disciplina de MC851, resolvemos isso com uma arquitetura Harvard de memória (em termos simples: uma ROM de instruções e RAM+Periféricos separados). Isso funciona, mas não é o ideal, pois não segue o padrão do RISC-V nem permite carregar novos programas dinamicamente.
Esse problema pode ser mitigado introduzindo-se uma cache separada para cada estágio (cada uma tem 1 MMU), reduzindo a quantidade de conflitos. Mas isso por si só não resolve o problema; o que acontece se ambas as caches derem miss ao mesmo tempo? Precisamos de mecanismo de arbitragem das requisições das MMUs de Dados e Instruções, onde o ideal seria que:
Não é necessário reinventar a roda! Protocolos abertos:
Outros protocolos:
Nota: O controlador de barramento atualmente é chamado de IMC (controlador de memória integrado), seja por inexperiência/desconhecimento meu, ou por indefinição da arquitetura de memória, ou porque o artigo da Wikipedia misturou um monte de coisas que não tem nada a ver, ou porque essas coisas tem uns 1000 nomes diferentes de acordo com a literatura (alguns chamam de Interconnect, por exemplo).