Trabalhos Práticos Arquitetura de Computadores I Prof. Fabian Vargas Material a ser utilizado: Kits de desenvolvimento de sistemas microprocessados para aplicações em DSP Texas DSK-TMS320C67xx. Apresentação dos trabalhos: Final de junho (para o primeiro semestre do ano), final de novembro (para o segundo semestre). Apresentação: Na data de apresentação, deverá ser entregue uma cópia em disquete e uma listagem em papel do código fonte, descrito em linguagem C. Nesta mesma data, deverá ser feita uma apresentação dos trabalhos em laboratório, utilizando o canhão multimídia, de modo que todos os ouvintes possam acompanhar a apresentação do trabalho. Descrição dos trabalhos: I. Implementar em linguagem C a descrição funcional de um Microprocessador Pipeline e seu Compilador Assembler: a) De arquitetura baseada em 16 bits de dados, 16 bits de endereços, e 21 bits para palavras de instruções. b) Pipeline de 5 estágios. Cada estágio é executado em 1 único ciclo de relógio. Implementar os 4 Registradores do Pipeline (RP): IF/ID, ID/EX, EX/ME, ME/WB. c) Arquitetura Harvard: memórias de dados e de instruções (2 cachês, cada uma com capacidade para armazenar 100 dados e 100 instruções, respectivamente), e seus controladores são independentes. d) Registradores de Uso Geral do processador (16 bits): R1, R2,..., R8. Registrador Temporário: Rt. e) Registradores de Controle do processador (16 bits): Flags: Zero, Números Positivos, Números Negativos, Overflow. Program Counter: PC. Instruction Register: IR. f) Unidade de Predição de Desvio. Existe uma Tabela de Desvios - TD (100 posições acessadas por PC contendo um flag que indica se desvio V ou F e endereço de desvio). Esta tabela é atualizada dinamicamente pelo processador durante a execução do código. g) O processador possui HW para verificação em tempo real da ocorrência das seguintes exceções no código: a) Divisão por zero; b) Decodificação do código de uma instrução inexistente; c) Acesso a um endereço de memória (de dados ou instruções) inexistente ou protegido. h) O compilador executa a análise do código visando a reordenação de suas instruções. O objetivo é minimizar/eliminar os problemas de dependência de instruções em máquinas pipeline. A janela considerada pelo compilador para reordenar uma dada instrução i em processamento é de 3 instruções anteriores e de 3 instruções posteriores à ela, isto é: [i 3, i, i+ 3]. No caso de não conseguir eliminar completamente a dependência de instruções no código, o compilador insere instruções de Nop. i) O compilador decodifica as instruções Assembler do usuário Mul e Div e as converte em uma seqüência de outras instruções, também em Assembler, que executam os Algoritmos de Booth e o de Divisão, respectivamente. Após esta conversão, o compilador passa a gerar o código objeto para o processador. j) O compilador decodifica as instruções Assembler do usuário Adm, Adr, Sum, e Sur e as converte em uma seqüência de outras instruções, também em Assembler, que executam as operações de soma e subtração entre um dado contido em memória e outro armazenado no banco de registradores do processador, respectivamente. Após esta conversão, o compilador passa a gerar o código objeto para o processador.
k) São 3 os possíveis formatos das instruções do processador: De Registrador para Registrador (Tipo R), 00 : Primeiro Operando Segundo Operando Destino Shifts Tipo de instrução 20 19 18 16 15 13 12 10 9 6 5 0 De Acesso à Memória (Tipo M), 01 : Registrador Origem/Destino Base do endereço do dado na memória Tipo de instrução 20 19 18 16 15 6 5 0 De Desvios Condicionais (Tipo D), 10 : Primeiro Operando Segundo Operando Base do Endereço de Desvio Tipo de instrução 20 19 18 16 15 13 12 6 5 0 De Desvios Incondicionais (Tipo J), 11 : Base para o Endereço de Desvio 20 19 0
l) Linguagem Assembler do processador: Instrução Código Comentários 1 Add Reg1, Reg2, RegDst 000000 R Atualiza todos os flags. 2 Sub Reg1, Reg2, RegDst 000001 R Atualiza todos os flags. 3 Sll Reg.Orig, shifts 000010 R Shift left logic (acrescenta 0 s) 4 Srl Reg.Orig, #shifts 000011 R Shift right logic (acrescenta 0 s) 5 Sla Reg.Orig, shifts 000100 R Shift left arithmetic (mantém lsb) 6 Sra Reg.Orig, shifts 000101 R Shift right arithmetic (mantém msb) 7 And Reg1, Reg2, RegDst 000110 R Não atualiza flags. 8 Or Reg1, Reg2, RegDst 000111 R Não atualiza flags. 9 Xor Reg1, Reg2, RegDst 001000 R Não atualiza flags. 10 Not Reg.Orig. 001001 R Inverte o conteúdo de Reg.Orig. 11 Inv Reg.Orig 001010 R Complementa de dois o conteúdo de Reg.Org 12 Nop 001011 R No Operation. 13 Cmp Reg1, Reg2, RegDst 001100 R Compara os conteúdos de Reg1 e Reg2. Atualiza flags: Zero, Nos. Positivos, Nos. Negativos 14 Ldw Reg.Dest., Mem[end] 001101 M Load Word. Reg.Dst.! Mem [PC + Base] 15 Stw Reg.Orig., Mem[end] 001110 M Store Word. Mem [PC + Base]! Reg.Orig. 16 Beq Reg1, Reg2, EndBase 001111 D Branch Equal. PC! PC + EndBase se Reg1 = Reg2. Atualiza flags: Zero. 17 Bnq Reg1, Reg2, EndBase 010000 D Branch Not Equal. PC! PC + EndBase se Reg1!= Reg2. Atualiza flags: Zero. 18 Bla Reg1, Reg2, EndBase 010001 D Branch Larger. PC! PC + EndBase se Reg1 > Reg2. Atualiza flags: Nos. Positivos. 19 Blo Reg1, Reg2, EndBase 010010 D Branch Lower. PC! PC + EndBase se Reg1 < Reg2. Atualiza flags: Nos. Negativos. 20 Jmp EndBase 010011 J PC! PC + EndBase, incondicionalmente. 21 Mul Reg1, Reg2, RegDst --- --- Instrução especial. Utilizada pelo programador Assembler e manipulada pelo compilador, que a traduz, segundo o Algoritmo de Booth, em uma seqüência de outras instruções Assembler.. 22 Div Reg1, Reg2, RegDst --- --- Instrução especial. Utilizada pelo programador Assembler e manipulada pelo compilador, que a traduz, segundo o Algoritmo de Divisão, em uma seqüência de outras instruções Assembler. 23 Adm Reg, Mem[end] --- --- Instrução especial. Utilizada pelo programador Assembler para somar dois operandos, sendo que um reside na memória e desta operação volta para o mesmo endereço de memória (Mem[end]! Reg. + Mem[end]). 24 Adr Reg, Mem[end] --- --- Instrução especial. Utilizada pelo programador Assembler para somar dois operandos, sendo que um reside na memória e desta operação permanece no mesmo registrador de origem (Reg! Reg + Mem[end]). 25 Sum Reg, Mem[end] --- --- Instrução especial. Utilizada pelo programador Assembler para subtrair dois operandos, sendo que um reside na memória e desta operação volta para o mesmo endereço de memória (Mem[end]! Reg. - Mem[end]). 26 Sur Reg, Mem[end] --- --- Instrução especial. Utilizada pelo programador Assembler para subtrair dois operandos, sendo que um reside na memória e desta operação permanece no mesmo registrador de origem (Reg! Reg - Mem[end]).
II. Implementar em linguagem C a descrição funcional de um Microprocessador Convencional e seu Compilador Assembler: a) De arquitetura baseada em 16 bits de dados, 16 bits de endereços, e 21 bits para palavras de instruções. b) Arquitetura Von Neumann: uma única memória (cache) para armazenar dados e de instruções (com capacidade para armazenar 100 dados e 100 instruções). c) Todas as instruções do processador são completamente executadas (isto é, busca, decodificação, operação da ULA, acesso à memória de dados, e escrita no banco de registradores) em 5 ciclos de relógio, exceto: Adm, Adr, Sum, Sur, que necessitam cada uma de 15 ciclos e Mul, Div, que necessitam cada uma de 150 ciclos de relógio. d) 8 Registradores de Uso Geral (16 bits): R1, R2,..., R8, e 1 Registrador Temporário (16 bits): Rt. e) Registradores de Controle do processador (16 bits): 4 Flags: Zero, Números Positivos, Números Negativos, Overflow. Program Counter: PC. Instruction Register: IR. f) O processador possui HW para verificação em tempo real da ocorrência das seguintes exceções no código: a) Divisão por zero; b) Decodificação do código de uma instrução inexistente; c) Acesso a um endereço de memória (de dados ou instruções) inexistente ou protegido. g) São 3 os possíveis formatos das instruções do processador: De Registrador para Registrador (Tipo R), 00 : Primeiro Operando Segundo Operando Destino Shifts Tipo de instrução 20 19 18 16 15 13 12 10 9 6 5 0 Obs: nas instruções Adm, Adr, Sum, Sur o Segundo Operando contém o endereço do registrador que contém o endereço do segundo operando na memória. De Acesso à Memória (Tipo M), 01 : Registrador Origem/Destino Base do endereço do dado na memória Tipo de instrução 20 19 18 16 15 6 5 0 De Desvios Condicionais (Tipo D), 10 : Primeiro Operando Segundo Operando Base do Endereço de Desvio Tipo de instrução 20 19 18 16 15 13 12 6 5 0 De Desvios Incondicionais (Tipo J), 11 : Base para o Endereço de Desvio 20 19 0
h) Linguagem Assembler do processador: Instrução Código Comentários 1 Add Reg1, Reg2, RegDst 000000 R Atualiza todos os flags. 2 Sub Reg1, Reg2, RegDst 000001 R Atualiza todos os flags. 3 Adm Reg, Mem[end] 000010 R Mem[end]! Reg. + Mem[end] 4 Adr Reg, Mem[end] 000011 R Reg! Reg + Mem[end] 5 Sum Reg, Mem[end] 000100 R Mem[end]! Reg. - Mem[end] 6 Sur Reg, Mem[end] 000101 R Reg! Reg - Mem[end] 7 Mul Reg1, Reg2, RegDst 000110 R Atualiza todos os flags. 8 Div Reg1, Reg2, RegDst 000111 R Atualiza todos os flags. 9 Sll Reg.Orig, shifts 001000 R Shift left logic (acrescenta 0 s) 10 Srl Reg.Orig, shifts 001001 R Shift right logic (acrescenta 0 s) 11 Sla Reg.Orig, shifts 001010 R Shift left arithmetic (mantém lsb) 12 Sra Reg.Orig, shifts 001011 R Shift right arithmetic (mantém msb) 13 And Reg1, Reg2, RegDst 001100 R Não atualiza flags. 14 Or Reg1, Reg2, RegDst 001101 R Não atualiza flags. 15 Xor Reg1, Reg2, RegDst 001110 R Não atualiza flags. 16 Not Reg.Orig. 001111 R Inverte o conteúdo de Reg.Orig. 17 Inv Reg.Orig 010000 R Complementa de dois o conteúdo de Reg.Org 18 Nop 010001 R No Operation. 19 Cmp Reg1, Reg2, RegDst 010010 R Compara os conteúdos de Reg1 e Reg2. Atualiza flags: Zero, Nos. Positivos, Nos. Negativos 20 Ldw Reg.Dest., Mem[end] 010011 M Load Word. Reg.Dst.! Mem [PC + Base] 21 Stw Reg.Orig., Mem[end] 010100 M Store Word. Mem [PC + Base]! Reg.Orig. 22 Beq Reg1, Reg2, EndBase 010101 D Branch Equal. PC! PC + EndBase se Reg1 = Reg2. Atualiza flags: Zero. 23 Bnq Reg1, Reg2, EndBase 010110 D Branch Not Equal. PC! PC + EndBase se Reg1!= Reg2. Atualiza flags: Zero. 24 Bla Reg1, Reg2, EndBase 010111 D Branch Larger. PC! PC + EndBase se Reg1 > Reg2. Atualiza flags: Nos. Positivos. 25 Blo Reg1, Reg2, EndBase 011000 D Branch Lower. PC! PC + EndBase se Reg1 < Reg2. Atualiza flags: Nos. Negativos. 26 Jmp EndBase 011001 J PC! PC + EndBase, incondicionalmente.