150 likes | 252 Views
MIPS Multiciclo. João Cláudio Otero jcotero@inf.ufrgs.br. Considerações. Motivação: continuação de trabalho do Lisboa, dada afinidade com arquitetura do MIPS trabalho realizado com ferramenta Quartus. Início da Modelagem…. Primeira abordagem: modelagem estrutural
E N D
MIPS Multiciclo João Cláudio Otero jcotero@inf.ufrgs.br
Considerações • Motivação: continuação de trabalho do Lisboa, dada afinidade com arquitetura do MIPS • trabalho realizado com ferramenta Quartus
Início da Modelagem… • Primeira abordagem: modelagem estrutural • Criação de componentes, máquina de controle e geração de sinais de controle • Demorada • Teste difícil • Segunda abordagem: modelagem funcional • Grande máquina de estados • Operações diretamente nos sinais
a = reg(ir[25..21]) aluout = pc + (sigext(ir[15..0]) << 2) b = reg(ir[20..16]) ir = mem(pc) pc = pc + 4 R-TYPE JMP MEM BRN aluout = a + sigext(ir[15..0]) aluout = a op b if (a == b) pc = aluout pc = pc[31..28] || (ir[25..0]<<2) SW LW reg(ir[15..11]) = aluout mdr = mem(aluout) mem(aluout) = b reg(ir[20..16]) = mdr
Primeira versão • Máquina de Estados com 2 processos • Problemas na compilação • Alteração para Máquina com 1 processo • Primeiro teste: • Estado por estado • Problemas no acesso à memória • Processo para preparação da memória
Preparação da Memória • OBS: assíncrona, palavras 32 bits, endereço de 8 bits. O problema: when fetch => mem_address <= pc; mem_write <= 0; ir <= mem_contents …
Preparação da Memória A solução: • mem_proc: PROCESS (state) BEGIN • if state = fetch then • mem_write <= '0'; • mem_address <= pc; • elsif state = mem_lw then • mem_write <= '0'; • mem_address <= aluout; • elsif state = mem_sw then • mem_write <= '1'; -- '1'; • mem_address <= aluout; • end if; • END PROCESS mem_proc;
Segunda versão • Acesso à memória funcionou, mas houve outros problemas de compilação… • Ciclos de inicialização • Eliminou-se processo de preparação à memória e acrescentou-se mais estados Alteração da memória para “síncrona”
Correções na segunda versão • Nos testes, nada funcionou… • Estados de espera para leitura e escrita na memória
O programa de teste lw $1, 0 ($zero) lw $2, 2 ($zero) lw $3, 4 ($zero) lw $4, 6 ($zero) add $5, $1, $2 -- R5 := 1 + 2 nop sub $6, $4, $3 -- R6 := 4 - 3 nop nop add $7, $5, $6 -- R7 := R5 + R6 nop nop sw $7, 8 ($zero) -- mem(8) := R7 = 4 A ram deve ser preenchida com: 0: 1 / 2: 2 / 4: 3 / 6: 4 / 8: reservado para o resultado.
Resultados Conjunto de instruções suportado pelo MIPS da seção 5.4 “Computer Architecture: A Quantitative Approach”, de Patterson & Hennessey