Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Processador MIPS Multiciclo, Resumos de Arquitetura

A arquitetura MIPS é do tipo load-store, ou seja, as instruções lógicas e aritméticas são executadas exclusivamente entre registradores da ...

Tipologia: Resumos

2022

Compartilhado em 07/11/2022

Tapioca_1
Tapioca_1 🇧🇷

4.6

(400)

224 documentos

1 / 15

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
- 1 -
V 2.10 - De: 20/outubro/2021 por Ney Calazans Organização de Computadores
O PROCESSADOR MULTICICLO MIPS_S
1 CARACTERÍSTICAS GERAIS DA ARQUITETURA MIPS
A arquitetura MIPS é do tipo load-store, ou seja, as instruções lógicas e aritméticas são executadas
exclusivamente entre registradores da arquitetura ou entre constantes imediatas e registradores. As instruções
de acesso à memória só executam ou uma leitura da memória (load) ou uma escrita na memória (store).
Devido à característica load-store, o processador disponibiliza um conjunto relativamente grande de
registradores, para reduzir o número de acessos à memória externa, pois estes últimos representam perda de
desempenho significativa em relação a operações entre registradores internos ao processador. Esta
característica difere de arquiteturas baseadas em acumulador, que mantêm todos os dados em memória,
realizando operações aritméticas entre um conteúdo que está em memória e um, ou poucos registradores de
dados, os denominados acumuladores. Considere o exemplo do código C a seguir: for(i=0; i<1000;
i++). Neste exemplo, caso i esteja armazenado em memória, tem-se 2000 acessos à memória, realizando
leitura e escrita a cada iteração do laço for. Caso se tenha o valor de i armazenado em um registrador
interno, apenas opera-se sobre este, sem acesso à memória externa durante a maior parte do tempo.
Considerando-se que o tempo de acesso a um registrador é normalmente de uma a duas ordens de grandeza
menor que o tempo de acesso a uma posição de memória (ou seja, 10 a 100 vezes menor, dependendo de
aspectos tais como tecnologia de implementação do processador e das memórias, padrão de comunicação
processador-memória etc.), percebe-se o ganho de desempenho que arquiteturas load-store podem auferir em
relação a arquiteturas baseadas em acumulador(es).
Dados e endereços na arquitetura MIPS são de 32 bits. Logo, diz-se que a palavra deste processador é de 32
bits, ou simplesmente que se trata de um processador de 32 bits. Obviamente, existem processadores com
outro tamanho de palavra, tal como o 8051 da Intel (8 bits), o TMS9900 da Texas (16 bits) e o Itanium da
Intel (64 bits).
O endereçamento de memória no MIPS é orientado a byte, ou seja, cada endereço de memória é um
identificador de uma posição de memória onde se armazena apenas 1 byte=8 bits. Então, uma palavra do
processador armazenada em memória ocupa 4 posições de memória, tipicamente em quatro endereços
consecutivos.
O banco de registradores da arquitetura possui 32 registradores de uso geral, de 32 bits cada um, denominados
$0 a $31. O registrador $0 não é realmente um registrador, mas a constante 0 representada em 32 bits, que
pode ser referenciada como um registrador ordinário. Este é disponibilizado para instruções que empregam o
modo de endereçamento a registrador entre outros, e que necessitem usar o valor 0, muito empregado na
prática de programação.
No MIPS há um tamanho regular definido para as instruções. Todas possuem exatamente o mesmo tamanho,
e ocupam 1 palavra em memória (32 bits), ou seja, o equivalente a 4 endereços consecutivos em memória. A
instrução contém o código da operação e o(s) operando(s), caso exista(m). Acesso a instruções são sempre
alinhados em uma fronteira de palavra inteira. Assim, todo endereço válido de uma instrução possui os dois
últimos bits iguais a 0 (e.g. endereços 0, 4, 16, 32008 etc. que podem ser representados em decimal ou em
hexadecimal).
Os modos de endereçamento mais importantes nesta arquitetura são os modos a registrador, base-
deslocamento e relativo ao PC.
O processador não possui suporte em hardware para gerenciar estruturas do tipo pilha em memória, mas existe
um registrador do banco, o $sp ou $29, que associado a instruções operando sobre este, em particular com
duas instruções específicas (JAL/JALR), permite simular estruturas do tipo pilha em memória para por
exemplo realizar o salvamento de contexto de funções e sub-rotinas.
Não existem registradores para armazenar explicitamente qualificadores sobre a execução de operações, tais
como as informações de que a execução de uma instrução resultou na constante 0, ou que uma instrução
aritmética gerou vai-um (em inglês, carry), ou ainda que seu resultado não é correto porque necessita recursos
de armazenamento de maior capacidade que os disponíveis no processador (situação chamada de transbordo,
ou, em inglês, overflow). A detecção destas situações deve ser realizada usando instruções específicas de
comparação disponíveis na arquitetura especificamente para isto (ver o comportamento das instruções cujo
mnemônico possui o prefixo SLT).
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Pré-visualização parcial do texto

Baixe Processador MIPS Multiciclo e outras Resumos em PDF para Arquitetura, somente na Docsity!

V 2. 10 - De: 20 /outubro/20 21 por Ney Calazans Organização de Computadores

O PROCESSADOR MULTICICLO MIPS_S

1 CARACTERÍSTICAS GERAIS DA ARQUITETURA MIPS

  • A arquitetura MIPS é do tipo load-store , ou seja, as instruções lógicas e aritméticas são executadas exclusivamente entre registradores da arquitetura ou entre constantes imediatas e registradores. As instruções de acesso à memória só executam ou uma leitura da memória ( load ) ou uma escrita na memória ( store ).
  • Devido à característica load-store , o processador disponibiliza um conjunto relativamente grande de registradores, para reduzir o número de acessos à memória externa, pois estes últimos representam perda de desempenho significativa em relação a operações entre registradores internos ao processador. Esta característica difere de arquiteturas baseadas em acumulador, que mantêm todos os dados em memória, realizando operações aritméticas entre um conteúdo que está em memória e um, ou poucos registradores de dados, os denominados acumuladores. Considere o exemplo do código C a seguir: for(i=0; i<1000; i++). Neste exemplo, caso i esteja armazenado em memória, tem-se 2000 acessos à memória, realizando leitura e escrita a cada iteração do laço for. Caso se tenha o valor de i armazenado em um registrador interno, apenas opera-se sobre este, sem acesso à memória externa durante a maior parte do tempo. Considerando-se que o tempo de acesso a um registrador é normalmente de uma a duas ordens de grandeza menor que o tempo de acesso a uma posição de memória (ou seja, 10 a 100 vezes menor, dependendo de aspectos tais como tecnologia de implementação do processador e das memórias, padrão de comunicação processador-memória etc.), percebe-se o ganho de desempenho que arquiteturas load-store podem auferir em relação a arquiteturas baseadas em acumulador(es).
  • Dados e endereços na arquitetura MIPS são de 32 bits. Logo, diz-se que a palavra deste processador é de 32 bits, ou simplesmente que se trata de um processador de 32 bits. Obviamente, existem processadores com outro tamanho de palavra, tal como o 8051 da Intel (8 bits), o TMS9900 da Texas (16 bits) e o Itanium da Intel (64 bits).
  • O endereçamento de memória no MIPS é orientado a byte, ou seja, cada endereço de memória é um identificador de uma posição de memória onde se armazena apenas 1 byte=8 bits. Então, uma palavra do processador armazenada em memória ocupa 4 posições de memória, tipicamente em quatro endereços consecutivos.
  • O banco de registradores da arquitetura possui 32 registradores de uso geral, de 32 bits cada um, denominados $0 a $31. O registrador $0 não é realmente um registrador, mas a constante 0 representada em 32 bits, que pode ser referenciada como um registrador ordinário. Este é disponibilizado para instruções que empregam o modo de endereçamento a registrador entre outros, e que necessitem usar o valor 0 , muito empregado na prática de programação.
  • No MIPS há um tamanho regular definido para as instruções. Todas possuem exatamente o mesmo tamanho, e ocupam 1 palavra em memória (32 bits), ou seja, o equivalente a 4 endereços consecutivos em memória. A instrução contém o código da operação e o(s) operando(s), caso exista(m). Acesso a instruções são sempre alinhados em uma fronteira de palavra inteira. Assim, todo endereço válido de uma instrução possui os dois últimos bits iguais a 0 (e.g. endereços 0, 4, 16, 32008 etc. que podem ser representados em decimal ou em hexadecimal).
  • Os modos de endereçamento mais importantes nesta arquitetura são os modos a registrador , base- deslocamento e relativo ao PC.
  • O processador não possui suporte em hardware para gerenciar estruturas do tipo pilha em memória, mas existe um registrador do banco, o $sp ou $29 , que associado a instruções operando sobre este, em particular com duas instruções específicas ( JAL/JALR ), permite simular estruturas do tipo pilha em memória para por exemplo realizar o salvamento de contexto de funções e sub-rotinas.
  • Não existem registradores para armazenar explicitamente qualificadores sobre a execução de operações, tais como as informações de que a execução de uma instrução resultou na constante 0, ou que uma instrução aritmética gerou vai-um (em inglês, carry ), ou ainda que seu resultado não é correto porque necessita recursos de armazenamento de maior capacidade que os disponíveis no processador (situação chamada de transbordo, ou, em inglês, overflow ). A detecção destas situações deve ser realizada usando instruções específicas de comparação disponíveis na arquitetura especificamente para isto (ver o comportamento das instruções cujo mnemônico possui o prefixo SLT ).

O que é descrito aqui é um processador que implementa um subconjunto da arquitetura do MIPS (donde o nome MIPS_S , abreviatura de MIPS Subset ou Subconjunto do MIPS ). Trata-se praticamente de uma máquina RISC completa. Faltam, contudo algumas características que existem em qualquer RISC, tal como pipelines , assunto deixado para ser introduzido e estudado em profundidade em outra oportunidade.

2 A RELAÇÃO PROCESSADOR - MEMÓRIAS - AMBIENTE EXTERNO

A Figura 1 (a) mostra a visão de alto nível de uma proposta de organização para implementar o processador MIPS_S. Nela, está explicitada a relação entre processador, suas memórias externas e o mundo exterior ao subsistema processador – memórias de dados e instruções. O mundo externo é o responsável por gerar os sinais de clock e reset. Uma característica primordial desta organização é que ela é uma organização Harvard , ou seja, o processador usa interfaces distintas para comunicação com as memórias de instruções e de dados. Outra possibilidade seria o uso de uma interface de memória unificada para instruções e dados, caracterizando uma organização von Neumann. Segue agora uma breve discussão da organização MIPS_S. Ela será detalhada em Seções posteriores deste documento. BLOCO DE CONTROLE (BC) Memória de Dados rw d_address data bw clock i_address DIAGRAMA DE BLOCOS DO PROCESSADOR MIPS_S uins entity port( MIPS_Sclock, is reset: in std_logic; ce, rw, bw: out std_logic; i_address, instruction: d_address: in std_logic_vector(31 out std_logic_vector(31 downto 0); downto 0); data: inout std_logic_vector(31 downto 0) ); end MIPS_S; architecture MIPS_S of MIPS_S is signal signal IR,uins: NPC, microinstruction; RESULT: std_logic_vector(31 downto 0); signal inst_branch, salta, end_mul, end_div: std_logic; begin dp: entity work.datapath port map(ck=>clock,rst=>reset,d_address=>d_address, data=>data, salta_out>saltainst_,end_branchmul=>end_mul,end_div=>end_div,_out=> inst_branch, RESULT_OUT=>RESULT, ); uins=>uins,IR_IN=>IR,NPC_IN=>NPC ct: entity port mwork.control_unitap(ck=>clock,rst=>reset,i_address=>i_address, instruction=>instruction,inst_branch_in=>inst_branch, salta_in RESULT_IN=>RESULT,=>salta,end_mul=>end_mul,end_div=>end_div,uins=>uins,IR_OUT=>IR,NPC_OUT=>NPC ); ce <= uins.ce; rw bw <=<= uins.rw;uins.bw; end MIPS_S; VHDL PARCIAL DO PROCESSADOR MIPS_S NO NÍVEL DE HIERARQUIA MAIS ALTO instruction reset Memória de Instruções ce end_mul end_div BLOCO DE DADOS (BD) RESULT_OUT inst_branch^ salta IR NPC (a) Diagrama de blocos processador-memória para a organização MIPS_S. (b) VHDL parcial do nível mais alto da hierarquia de descrição do processador MIPS_S. Figura 1 – Proposta de uma organização para o processador MIPS_S. Ilustra-se: (a) a conectividade entre o processador, ambiente externo, memórias externas e (b) o esboço da descrição VHDL de nível hierárquico mais alto para a organização. O processador MIPS_S recebe do mundo externo dois sinais de controle. O primeiro, denominado clock , sincroniza todos os eventos internos do processador. O sinal reset leva o processador a reiniciar a execução de instruções a partir do endereço 0x 004000001 de memória (este endereço é definido por compatibilidade com o endereço assumido pelo simulador MARS como aquele de início da área de programas). O sinal reset pode ser usado para provocar o reinício da operação do processador. Os sinais providos pelo processador MIPS_S para a troca de informações com o mundo externo, representado pelas memórias e pela geração dos sinais clock e reset , são:  i_address – um barramento unidirecional de 32 bits: define sempre o endereço da posição de memória contendo a instrução a ser buscada a seguir;  instruction – um barramento unidirecional de 32 bits: contém sempre o código objeto da instrução contida na posição de memória apontada por i_address ;  d_address – um barramento unidirecional de 32 bits: contém o endereço da posição de memória a ser lida ou escrita, da ou para a memória de dados, respectivamente;  data - um barramento bidirecional de 32 bits: transporta dados do ou para o processador MIPS_S; (^1) A notação introduzida aqui, 0x00400000 é uma forma de representar números na base hexadecimal. Adota-se a convenção usada no montador/simulador MARS do MIPS, que emprega o prefixo “0x” para indicar que um número está representado na base 16.

de palavra. Esta expressão significa que cada instrução da MIPS_S só pode começar a partir de um endereço múltiplo de 4, que correspondem àqueles cujos 2 últimos bits são 00. Assim, por exemplo, uma única instrução pode ocupar os endereços de 0xAAA00004 a 0xAAA00007 na memória de instruções, mas nunca os endereços 0xFF004677 a 0xFF00467A da mesma memória, embora ambas as faixas correspondam a 4 bytes consecutivos na memória. Dada esta situação, o barramento i_address não precisaria ter 32 bits, mas apenas 30, pois os 2 últimos bits deste endereço valem sempre ‘ 00 ’. Não existem sinais de controle para acesso à memória de instruções além do endereço em i_address. Isto não é necessário, pois não há fluxo bidirecional de informação entre o processador e esta memória. A memória de instruções é vista pala organização MIPS_S como uma memória de apenas leitura, que fornece informações na sua saída (instruções) a partir do estabelecimento do endereço de memória pelo processador, via o barramento i_address. A memória de dados possui uma interface um pouco mais elaborada, devido ao fato de poder ser lida ou escrita. Além disto, os dados lidos ou gravados nesta memória podem ter tamanho diversos. Estas necessidades fazem com que o acesso à informação deva ter um formato mais flexível. Por exemplo, um inteiro típico ocupa 32 bits, mas um caractere ocupa exatamente 1 byte, e um número em ponto flutuante pode ser de 32 ou de 64 bits. Além disto, estruturas complexas, tais como aquelas usadas em programação de alto nível (e.g. struct de C/Java ou record de Pascal, e listas em LISP), podem ter tamanho variável, em alguns casos até sem limitações de tamanho mínimo ou máximo. Vetores e arranjos multidimensionais de números ou caracteres e de estruturas complexas complicam ainda mais a situação. Logo, a interface de acesso da memória de dados deve ser flexível para prover desempenho e proporcionar economia de espaço. Ainda assim, o barramento de dados ( data ) é fixo, de 32 bits. Lê-se sempre 4 bytes (ou posições) de memória de cada vez. O que é lido pode ser, por exemplo, 1 inteiro ou 4 caracteres ou metade de um número em ponto flutuante de precisão dupla. Como a leitura é alinhada em qualquer fronteira, é até mesmo possível ler metade de um inteiro e dois caracteres nos 32 bits. ... FFFFFFFF ... 90000000 90000001 ... 80000000 7FFFFFFF ... 000001AC 000001AB ... 00000007 00000006 00000005 00000004 00000003 00000002 00000001 00000000 Memória de Instruções ÁREA DE PROGRAMAS Instrução 2 Instrução 1 Memória de Dados ÁREA DE DADOS Inteiro 2 Inteiro 1 ... ... Caracter 4 Caracter 3 Caracter 2 Caracter 1 ... ... Número Ponto Flutuante (64bits) ... FFFFFFFF FFFFFFFE FFFFFFFD FFFFFFFC FFFFFFFF FFFFFFFE FFFFFFFD FFFFFFFC ... 8AB 8AB 8AB 8AB ... 80000000 7FFFFFFF ... 000001B 000001B 000001B 000001AF 000001AE 000001AD 000001AC 000001AB ... ... 00000001 00000000 Figura 2 - Ilustração da estrutura dos mapas de memória do MIPS_S. Cada mapa possui 4Gposições de 1 byte. Cada instrução ocupa exatamente 4 bytes consecutivos na memória de instruções, e sempre começa em um endereço onde os 2 últimos bits são ‘ 00 ’ (configurando um acesso alinhado a palavra ). O controle de acesso à memória de dados é feito pelo processador através dos sinais ce , rw e bw. O sinal ce indica se está em curso uma operação com a memória de dados (quando ce = 1) e o sinal rw indica se esta operação é de escrita (quando rw = 0) ou de leitura (quando rw = 1). Obviamente, quando ce = 0 o valor do sinal rw é irrelevante. O sinal bw serve para indicar se uma operação de escrita na memória deve escrever apenas um byte na posição da memória de dados cujo endereço aparece no barramento d_address ( bw = 0) ou se esta deve escrever 4 bytes (ou seja, na posição explicitada na instrução e nas três seguintes). Isto ocorre quando se faz uma escrita de palavra com bw = 1.

2.2 Uma palavra sobre “Endianismo”

Processadores podem numerar os bytes dentro de uma palavra fazendo o byte com menor índice ser ou o byte mais à esquerda ou o byte mais à direita. A convenção usada por uma máquina é a ordem escolhida. Processadores que usam a arquitetura MIPS podem operar com qualquer das ordens. A ordem escolhida é denominada o “endianismo” do processador (mais precisamente, da organização deste processador) e pode ser “ big-endian ” ou “ little-endian ”. Processadores big-endian assumem os 8 bits mais à esquerda de uma palavra (para números a parte mais significativa deste) como sendo o byte 0, os 8 bits imediatamente à direita deste como o byte 1, etc. Processadores little-endian assumem os 8 bits mais à direita de uma palavra (para números a parte menos significativa deste) como sendo o byte 0, os 8 bits imediatamente à esquerda deste como o byte 1 , etc. O simulador a ser usado (MARS) opera com ambas as ordens. A ordem específica do MARS é determinada pela ordem dos bytes da máquina que executa o simulador. Assim, ao rodar o simulador em uma máquina baseada em processador que use a arquitetura x86 da Intel, MARS é little-endian (pois a arquitetura Intel x86 é little-endian ), enquanto ao rodar MARS em uma estação de trabalho Sun (baseada no processador SPARC), MARS é big-endian (pois a arquitetura SPARC é big-endian ).

3 CONJUNTO DE INSTRUÇÕES

A Tabela 1 resume o conjunto de instruções da arquitetura MIPS_S. Notem que todas as 37 instruções listadas aqui existem exatamente na mesma forma na arquitetura MIPS, justificando dizer que a arquitetura MIPS_S é um subconjunto da arquitetura MIPS. Usa-se a seguir as seguintes convenções: Convenções Utilizadas na Tabela 1 :  Rd ( destination register ) é o registrador usado na maioria das instruções de três operandos como destino dos dados processados, especificado por um código binário de 5 bits. Veja a Seção 4 deste documento e para um detalhamento mais amplo refira-se ao Apêndice A do livro texto da disciplina;  Rs ( source register ) e Rt ( target register ) são registradores usados em muitas instruções como origem dos operandos para obter os dados. São especificados por códigos binários de 5 bits. Veja a Seção 4 ;  Registradores específicos da máquina são indicados por $xx , onde xx é o número decimal do registrador.;  Os registradores HI e LO são especiais (ficam fora do banco de registradores de uso geral), e usados para armazenar resultados das operações de multiplicação e divisão ( MULTU e DIVU , respectivamente);  O sinal  é usado para designar atribuição (escrita) de valores resultantes da avaliação da expressão à direita do sinal ao registrador ou à posição de memória identificada à esquerda do sinal;  Os identificadores imed16 e imed26 representam operandos imediatos de 16 e 26 bits, respectivamente;  O identificador shamt (do inglês, shift amount ) representa a quantidade de bits a deslocar nas instruções SLL , SLLV , SRA , SRAV , SRL e SRLV. O operador mod representa o resto da divisão inteira do elemento à esquerda do mod pelo elemento à direita deste;  O operador & representa a concatenação de vetores de bits;  A expressão PMEMD(X) representa o conteúdo de uma posição de memória de dados cujo endereço é X (na leitura) ou a própria posição da memória de dados (na escrita). A quantidade de bits relevantes depende da instrução específica executada. Por exemplo, em LW são 32 bits, em LBU são 8 bits;  Está implícito em todas as instruções o incremento do registrador PC após a busca da instrução. Na organização, isto se reflete no uso de um registrador temporário denominado NPC , que contém o valor do PC , incrementado após a busca de uma instrução. Qualquer outra referência à manipulação do PC é parte da semântica da instrução particular;  Extensão de sinal é a operação que transforma um dado vetor de bits em outro maior, mas cujo valor em complemento de 2 é equivalente ao valor representado pelo vetor menor. Consiste em copiar o bit de sinal do vetor, ou seja, o seu bit mais significativo, localizado na extrema esquerda deste vetor, tantas vezes quanto seja necessário, para gerar o vetor maior. Por exemplo, na instrução ADDIU , se imed16 for 1111 1111 1111 1111 (-1 em complemento de 2 , representado em 16 bits), a extensão de sinal transforma este vetor em 1111 1111 1111 1111 1111 1111 1111 1111 (- 1 em complemento de 2, representado em 32 bits). O leitor deve perceber que esta operação é trivialmente correta para números positivos, onde o bit de sinal estendido é 0. Quando se menciona extensão de sinal, os valores imediatos são interpretados como números em complemento de 2. Caso contrário, os números são representações binárias puras, como ocorre na instrução J^3 ;  Os operandos imediatos das instruções de salto têm um tratamento diferente dos operandos das instruções que não se referem a saltos. Como o endereçamento de ambas as memórias (instruções e dados) é feito à byte (ou seja, cada byte de memória possui um endereço distinto), uma instrução ocupa quatro endereços (^3) CUIDADO!!: Existe um outro simulador bem conhecido, o SPIM, onde a extensão de sinal é feita sobre os 14 bits, e não sobre 1 6 bits (pode ser um bug do simulador ou uma definição da arquitetura; O importante é que isto afeta a implementação do processador aqui especificado).

Tabela 1 – Mnemônicos, codificação e semântica resumida das instruções do processador MIPS_S. As constantes numéricas dos códigos de instrução são valores hexadecimais. Instrução FORMATO DA INSTRUÇÃO^ SEMÂNTICA DA AÇÃO DA INSTRUÇÃO 31 - 26 25 - 21 20 - 16 15 - 11 10 - 6 5 - 0 ADDU Rd, Rs, Rt 00 Rs Rt Rd 00 21 RdRs + Rt SUBU Rd, Rs, Rt 00 Rs Rt Rd 00 23 RdRs – Rt AND Rd, Rs, Rt 00 Rs Rt Rd 00 24 RdRs and Rt OR Rd, Rs, Rt 00 Rs Rt Rd 00 25 RdRs or Rt XOR Rd, Rs, Rt 00 Rs Rt Rd 00 26 RdRs xor Rt NOR Rd, Rs, Rt 00 Rs Rt Rd 00 27 RdRs nor Rt SLL Rd, Rt, shamt 00 00 Rt Rd shamt 00 RdRt deslocado shamt bits à esquerda (0s à direita) SLLV Rd, Rt, Rs 00 Rs Rt Rd 00 04 RdRt deslocado (Rs mod 32) bits à esquerda (0s à direita) SRA Rd, Rt, shamt 00 00 Rt Rd shamt 03 RdRt deslocado shamt bits à direita (mantendo sinal) SRAV Rd, Rt, Rs 00 Rs Rt Rd 00 07 RdRt deslocado (Rs mod 32) bits à direita (mantendo sinal) SRL Rd, Rt, shamt 00 00 Rt Rd shamt 02 RdRt deslocado shamt bits à direita (0s à esquerda) SRLV Rd, Rt, Rs 00 Rs Rt Rd 00 06 RdRt deslocado (Rs mod 32) bits à direita (0s à esquerda) ADDIU Rt, Rs, Imed16 09 Rs Rt Imed16 RtRs + (Imed16 com sinal estendido) ANDI Rt, Rs, Imed16 0C Rs Rt Imed16 RtRs and (0x00 00 & (Imed16)) ORI Rt, Rs, Imed16 0D Rs Rt Imed16 RtRs or (0x0000 & (Imed16)) XORI Rt, Rs, Imed16 0E Rs Rt Imed16 RtRs xor (0x0000 & (Imed16)) LUI Rt, Imed16 0F 0 Rt Imed16 Rt(Imed16 & 0x0000) LBU Rt, Imed16(Rs) 24 Rs Rt Imed16 Rt0x 000000 & PMEMD(Imed16 com sinal estendido+Rs) LW Rt, Imed16(Rs) 23 Rs Rt Imed16 RtPMEMD(Imed16 com sinal estendido+Rs) (4 bytes) SB Rt, Imed16(Rs) 28 Rs Rt Imed16 PMEMD(Imed16 com sinal estendido+Rs)Rt [7:0] (1 byte) SW Rt, Imed16(Rs) 2B Rs Rt Imed16 PMEMD(Imed16 com sinal estendido+Rs)Rt (4 bytes) SLT Rd, Rs, Rt 00 Rs Rt Rd 00 2A Rd1 se Rs menor que Rt (c/sinal), senão Rd0 SLTU Rd, Rs, Rt 00 Rs Rt Rd 00 2B Rd1 se Rs menor que Rt (s/sinal), senão Rd0 SLTI Rt, Rs, Imed16 0A Rs Rt Imed16 Rt1 se Rs menor que Imed16 (c/sinal), senão Rt0 SLTIU Rt, Rs, Imed16 0B Rs Rt Imed16 Rt1 se Rs menor que Imed16 (s/sinal), senão Rt0 BEQ Rs, Rt, rótulo 04 Rs Rt Imed16 PCNPC + (Imed16 & “00” com sinal estendido), se Rs=Rt BGEZ Rs, rótulo 01 Rs 01 Imed16 PCNPC + (Imed16 & “00” com sinal estendido), se Rs=> BLEZ Rs, rótulo 06 Rs 00 Imed16 PCNPC + (Imed16 & “00” com sinal estendido), se Rs<= BNE Rs, Rt, rótulo 05 Rs Rt Imed16 PCNPC + (Imed16 & “00” com sinal estendido), se Rs≠Rt J rótulo 02 Imed26 PCNPC[31:28] & Imed26 & “00” JAL rótulo 03 Imed26 $31NPC; PCNPC[31:28] & Imed26 & “00” JALR Rd, Rs 00 Rs 00 Rd 00 09 RdNPC; PCRs JR Rs 00 Rs 0000 08 PCRs MULTU Rs, Rt 00 Rs Rt 000 19 HI & LORs * Rt DIVU Rs, Rt 00 Rs Rt 000 1B LORs / Rt; HIRs mod Rt MFHI Rd 00 000 Rd 00 10 RdHI MFLO Rd 00 000 Rd 00 12 RdLO

3.1 Classes Funcionais de Instruções

A partir da Tabela 1 , propõe-se a seguinte divisão das instruções em classes funcionais:

  • As instruções aritméticas são ADDU, SUBU, ADDIU, MULTU, DIVU, SRA, SRAV ;
  • As instruções lógicas são AND, OR, XOR , NOR, ANDI, ORI, XORI, SLL, SLLV, SRL e SRLV ;
  • As instruções de movimentação de dados são LUI, LBU, LW, SB, SW, MFHI e MFLO ;
  • As instruções de controle de fluxo de execução são BEQ, BGEZ, BLEZ, BNE, J, JAL, JALR e JR ;
  • Existem também instruções miscelâneas , SLT, SLTI, SLTU e SLTIU.

3.2 Observações sobre a Semântica de Instruções no Processador MIPS_S

Algumas observações gerais e particulares sobre o conjunto de instruções são apresentadas a seguir.

  • A arquitetura MIPS foi elaborada para privilegiar a simplicidade do conjunto de instruções sem, contudo, sacrificar sua flexibilidade. Devido à limitação de todas as instruções possuírem exatamente o mesmo tamanho, instruções em geral disponíveis em outros processadores estão ausentes no MIPS. Contudo, foi tomado cuidado no projeto desta arquitetura para que tal funcionalidade possa ser suprida de forma simples via o conceito de pseudo-instruções. Pseudo-instruções são instruções inexistentes em uma arquitetura, mas disponibilizadas ao programador em linguagem de montagem. Sua implementação mediante uso de uma sequência de instruções existentes é feita no código objeto pelo programa montador. Por exemplo, uma instrução capaz de carregar uma constante imediata de 32 bits em um registrador obviamente não existe, mas pode ser implementada por uma sequência de duas instruções, LUI e ORI. É possível a programas montadores para o processador MIPS_S disponibilizar uma pseudo- instrução LI com um operando imediato de 32 bits, gerando como código para esta uma sequência LUI + ORI. Por exemplo, existe no montador/simulador MARS uma pseudo-instrução ( LA , do inglês load address ) que usa LUI + ORI para implementar uma função bastante útil, carregar um registrador com o endereço de um rótulo (em inglês, label ) do programa, seja este da região de dados ou da região de programas.
  • As instruções SLT, SLTU, SLTI e SLTIU servem para suprir a ausência de sinais qualificadores de estado específicos na arquitetura MIPS_S. Elas escrevem no registrador destino da instrução ou a constante 0 ou a constante 1, para indicar o resultado de uma comparação de magnitude. Após executar uma destas instruções, pode-se testar o valor escrito neste registrador de destino contra a constante 0 (por exemplo, usando as instruções BEQ , BGEZ , BNE ou BLEZ , tendo como um dos operandos a constante 0, disponível no registrador $0 ou $zero ). Tais sequências de instrução permitem implementar todas as comparações de igualdade ou magnitude (“menor”, “maior”, “menor ou igual” e “maior ou igual”). Exercício : Proponha uma sequência de instruções do processador MIPS_S para implementar as seguintes pseudo-instruções: BGT , BGE, BLT e BLE (respectivamente, salta se maior , se maior ou igual, se menor e se menor ou igual relativo ). Note-se ainda que as variações das instruções SLTxx permitem executar comparações de números naturais (as com sufixo U , do inglês unsigned ) e de números inteiros representados em complemento de 2 (as sem sufixo U ).

4 BANCO DE REGISTRADORES DO PROCESSADOR MIPS_S

A partir desta Seção do presente documento, apresenta-se uma possível organização para o processador MIPS_S. Algumas das características mencionadas aqui provêm da arquitetura do MIPS. Isto será explicitado no texto a seguir, quando for o caso. O leitor pode desde já referir-se ao diagrama de blocos da organização proposta, apresentado na Figura 3 da Seção 5, de forma a acompanhar a leitura a seguir com uma ilustração adequada das estruturas mencionadas e de sua interconexão a demais estruturas presentes no hardware. A organização aqui proposta contém, pelo menos, o seguinte conjunto de registradores:

  • Um banco de registradores contendo 32 registradores de uso geral, cada um de 32 bits, denominados $0 a $. Esta é uma característica definida na arquitetura MIPS. Existe uma denominação textual alternativa para cada um dos registradores. Ela está apresentada na Tabela 2 abaixo, retirada do Apêndice A do livro Organização e Projeto de Computadores de D. A. Patterson e J. L. Hennessy. Este Apêndice é de domínio

5 UMA PROPOSTA DE ORGANIZAÇÃO PARA O PROCESSADOR MIPS_S

Na organização proposta para o processador MIPS_S, a execução de qualquer instrução requer 4 a 5 ciclos de relógio, com a exceção das instruções MULTU e DIVU. Cada um dos 4/5 ciclos executa um conjunto limitado de partes de uma instrução e são assim denominados:

  • Ciclo 1: busca da instrução. Comum a todas as instruções.
  • Ciclo 2: decodificação e leitura de registradores. Comum a todas as instruções.
  • Ciclo 3: operação com a ALU. Comum a quase todas as instruções.
  • Ciclo 4: acesso à memória. Realizado conforme a instrução. Somente instruções de acesso a memória o usam.
  • Ciclo 4/5: atualização do banco de registradores ( write-back ). Comum a quase todas as instruções. Em todas as instruções que não fazem acesso à memória, o Ciclo 4 não existe e o ciclo 5 passa a ser o Ciclo 4. Esta Seção discute uma proposta de organização para o BD do processador MIPS_S. A Figura 3 mostra o diagrama de blocos completo do processador MIPS_S, incluindo o BD (em fundo amarelo) e o BC (em fundo verde). O BD necessita de um conjunto de 11 sinais de controle, organizados em 5 classes:
  • habilitação de escrita em registradores ( 7 sinais, alguns ativando dois ou mais registradores): wpc , CY 1 , wreg , CY2 , walu , whilo , wmdr.
  • controle de leitura/escrita na memória externa (3 sinais): ce , rw e bw.
  • as operações que a ALU, executa (1 sinal). Estas são computadas a partir da instrução ora em execução, o que é informado através do resultado da decodificação (o sinal i chamado uins.i no BD).
  • a seleção da operação do comparador (1 sinal), também computada a partir da instrução ora em execução (sinal uins.i ).
  • os controles dos multiplexadores, resultantes da decodificação da instrução ( 11 multiplexadores ao todo). Estes sinais são gerados diretamente da instrução sendo executada (sinal i ou uins.i ) e eventualmente usando outros sinais de controle como a saída do comparador (sinal salta ) ou os identificadores de classe de instrução (sinal inst_branch ). wpc (^) CY1 uins.wmdr Banco de Registradores AdRP IR_IN[20:16] IR_IN[25:21] IR_IN[15:11] IR_IN[20:16] uins.ce=ce **RALU=d_address PC

Memória de**^ Instruções uins.wreg outalu uins.walu ALU dtpc RALU IR pc=i_address^ instruction inc_pc CY1^ op data Memória de Dados NPC EXT_SINAL uins.CY R op MDR RESULT_OUT=result DataWP IR_IN[25:0] IR_IN[15:0] IR_IN[20:16] << 2 RIN R R salta_out=salta 0000 & IR_IN[25:0] & 00" EXT_ZERO x (^000000) data[7:0] & Lo uins.whilo R R IR_IN[15:0] R1_in NPC_IN MDR_int MDR Lo Hi adS adD R IR_IN i / salta_in / inst_branch_in rst_muldiv rst_muldiv AdRP AdWP DataRP DataRP 11111 NPC=NPC_OUT NPC_IN D_Hi D_Lo produto(31 downto 0) quociente resto produto(63 downto 32) R2_in IR=IR_OUT i CY1 CY walu wmdr rw wreg ce bw wpc whilo rst_md end_mul end_div Decodificação Máquina de Estados R pc=i_address M M4 M M M M M M M M M R2_in R1_in R3_in Comparador salta=salta_out salta_in mult div^ uins.i^ Detector deTipo R(sub)Instruções inst_R_sub Detector de Instruções uins.i (^) Tipo branch inst_branch=inst_branch_out Detector de Instruções uins.i (^) Tipo I(sub) inst_I_sub uins.i^ uins.i uins.i uins.i uins.i uins.i uins.i uins.i uins.i uins.i uins.i uins.whilo uins.rw=rw uins.bw=bw uins.CY inst_branch_in R R Hi R uins.rw uins.ce uins.rst_md rst rst_muldiv NPC_IN result 0 1 0 1 2 3 1 0 0 1 0 1 0 1 0 1 0 1 2 3 1 0 data (^1 ) RESULT_IN RALU=d_address Figura 3 – Diagrama de blocos completo do processador MIPS_S, com as memórias externas (de instruções e de dados) mostradas para fins de clareza. Estão representados todos os 23 sinais que o bloco de controle deve gerar (a maioria em verde). Os sinais clock e reset não estão representados, porém são utilizados em todos os registradores, bem como no banco de registradores e na Máquina de Estados do Bloco de Controle. O BD gera quatro sinais qualificadores que são enviados para o BC, para que este tome algumas decisões (sinais end_mul , end_div, inst_branch e salta ).

Os sinais de controle dos multiplexadores M2 a M11 não são gerados no BC. Eles são derivados no BD diretamente da instrução corrente. Para uma ideia mais completa da implementação do BD do processador MIPS_S, resta apresentar as organizações internas do banco de registradores, da unidade lógica e aritmética, das operações de multiplicação e divisão e o Bloco de Controle (BC) do MIPS_S. As três Seções a seguir discutem as organizações dos três primeiros blocos citados, enquanto a Seção 7 discute o BC.

5.1 Banco de Registradores

A Figura 4 ilustra a organização do banco de registradores, sob a forma de um diagrama de blocos. A ALU será discutida em parte na Seção 5.2. A organização do banco de registradores inclui os 32 registradores em si e a implementação das duas portas de leitura e da porta de escrita, bem como da decodificação do endereço de escrita para geração da habilitação de escrita do registrador em questão. As portas de leitura consistem em multiplexadores (32X32):(1X32), controladas pelos endereços de leitura. AdRP 32 registradores de 32 bits Decodificador 5 → 32 $ 0 $ 1 $ 2 $ 3 $ ... $ 28 $ 29 $ 30 $ 31 ck rst DataWP 32 5 enable ce 32 32 32 DataRP AdRP AdWP DataRP 5 5 Figura 4 - Diagrama em blocos do banco de registradores de uso geral da organização MIPS_S.

5.2 Resumo das Operações Executadas pela ALU

A Tabela 3 ilustra a operação do hardware da ALU. Esta última é um hardware combinacional que possui duas entradas de dados e uma saída de dados. Além disto, a ALU possui uma entrada de controle para informar a operação a ser realizada em cada instante, derivada da instrução em execução no momento. Tabela 3 – Operações da ALU no processador MIPS_S, para cada instrução. Instruções Operação da ALU ADDU, ADDIU, LBU, LW, SB, SW, BEQ, BGEZ, BLEZ, BNE OP2 + OP SUBU OP2 – OP AND, ANDI OP2 and OP OR, ORI OP2 or OP XOR, XORI OP2 xor OP NOR OP2 nor OP SLL OP1 << OP 2 [10:6] c/ 0s entrando à direita SLLV OP2 << OP1[4:0] c/ 0s entrando à direita SRA OP1 >> OP2[10:6] c/ bit 31 entrando à esquerda SRAV OP2 >> OP1[4:0] c/ bit 31 entrando à esquerda SRL OP1 >> OP 2 [10:6] c/ 0s entrando à esquerda SRLV OP2 >> OP1[4:0] c/ 0s entrando à esquerda LUI OP2[15:0] & 0 x”0000” SLT, SLTI 1 se OP1<OP2 (com sinal), senão 0 SLTU, SLTIU 1 se OP1<OP2 (sem sinal), senão 0 J, JAL OP1[31:28] & OP2[2 7 :0] JR, JALR OP MULTU, DIVU, MFHI, MFLO Nenhuma operação A operação da ALU é relevante para quase todas as instruções, embora algumas destas apenas a utilizem para transportar um valor da entrada para a saída (como JR e JALR ) e outras (como MULTU e DIVU ) sequer utilizam a ALU. O resultado da operação na ALU é sempre armazenado no registrador RALU. A Tabela 3 define quais devem ser as operações da ALU, para cada instrução.

A Figura 5 ilustra a estrutura da máquina de estados de controle da MIPS_S, onde o próximo estado é função apenas do estado atual e da instrução armazenada no registrador IR. Também se indica nesta Figura quais registradores são alterados em cada estado.

  • IR ( instruction register ): armazena o código de operação ( opcode ) da instrução atual e o(s) código(s) do(s) operando(s) desta. Possui 32 bits.
  • PC ( program counter ): é o contador de programa. Possui 32 bits. Também se mostra na Figura 5 quais registradores são alterados, através da indicação de qual/quais sinal/sinais de controle de habilitação de escrita é/são ativado/ativados em cada estado. Não se mostram as ativações dos sinais de controle dos multiplexadores, ou as operações da ALU. A função dos 7 estados mostrados na Figura são as seguintes:
  • Sfetch: primeiro ciclo, busca de instrução;
  • SReg: segundo ciclo, leitura dos registradores fonte;
  • SAlu: terceiro ciclo, operação com a ALU e eventual uso do comparador, do hardware de multiplicação ou do hardware de divisão;
  • Swbk: quarto ciclo para a maioria das instruções, onde se escreve o resultado no banco de registradores e atualiza-se o contador de programa (quinto ciclo para as instruções LW e LBU );
  • Sld: quarto ciclo das instruções LW e LBU , onde se lê um dado da memória de dados externa;
  • Sst: último ciclo das instruções SW e SB , onde se escreve um dado na memória de dados externa;
  • Ssalta: último ciclo das instruções de salto condicional ou incondicional, atualiza-se o valor do PC. Condicionalmente se escreve no banco de registradores. Reset=’1’ (todos os registradores são zerados) Swbk wreg wpc Sfetch CY Sld ce wmdr IR=LBU/ LW Sst rw0, ce, wpc bw0 , se IR=SB Ssalta wpc wreg, se IR=JAL/JALR Sreg CY rst_md, se IR=MULTU/DIVU IR=SB/ SW IR^ =J/JAL/JALR/JR /BEQ/ BGEZ/BLEZ/BNE Salu wAlu Caso geral Reset=’1’ IR=(MULTU e end_mul=’0’) ou (DIVU e end_div=’0’) IR=(MULTU e end_mul=’1’) ou (DIVU e end_div=’1’) wpc, whilo Figura 5 - Máquina de estados de controle para a organização MIPS_S.

8 PROGRAMA PARA TESTAR TODAS AS INSTRUÇÕES DA MIPS_S

A Figura 6 mostra a interface gráfica do simulador MARS, composta de 5 subjanelas (4 subjanelas estão ocultas, aquela da aba Edit, que mostra o editor de textos do ambiente MARS, duas outras para uso de coprocessadores, Coproc 1 e Coproc 2 e uma para operações de entrada e saída, RUN I/O):

  • a subjanela Text Segment mostra as instruções do programa ora em simulação, em três formatos: código-objeto, código intermediário e código fonte;
  • a subjanela Data Segment mostra os dados estáticos do programa ora em simulação (várias outras áreas de memória estão disponíveis para escolha, tais como a área de pilha apontada pelo registrador $sp, o heap etc.);
  • a subjanela Labels mostra dados sobre os rótulos do programa, tanto da área de instruções como da área de dados;
  • a subjanela Registers mostra os conteúdos dos registradores da arquitetura (os 32 registradores do banco, o PC , o Hi e o Lo );
  • a subjanela Mars Messages mostra mensagens que o montador/simulador gera para o usuário durante a carga, montagem e execução de programas. A ferramenta de montagem tem como entrada o nome do programa descrito em linguagem de montagem (tipicamente com nome .asm). É possível gerar um arquivo de saída com o conteúdo das janelas de instruções e dados do programa, incluindo o código objeto gerado. Este mais tarde é usado, após algum tratamento manual, como entrada para a simulação do hardware do processador. O código objeto pode ser gerado após a leitura e montagem de um arquivo contendo um programa corretamente descrito. Para tanto, basta salvar como em arquivos texto as áreas de instruções e dados como é visto em aula. Figura 6 - Interface gráfica do montador/simulador MARS. Recomenda-se escrever os programas em linguagem de montagem ( assembly ), gerando-se o código objeto automaticamente, a partir do montador/simulador MARS. A ferramenta de simulação, assim como documentação de como utilizar a ferramenta encontram-se apontadas no material de apoio da disciplina, são encontradas facilmente na Internet. A Figura 7 apresenta um programa escrito em linguagem de montagem para o processador MIPS_S, contendo pelo menos uma instância de cada uma das instruções 37 instruções deste processador. Recomenda-se o uso do simulador MARS para executar este programa e verificar sua funcionalidade, cujos efeitos são descritos linha a linha no programa, no campo de comentários. O simulador MARS pode gerar arquivos de saída contendo o código objeto das áreas de dados e de instruções de qualquer programa, entre outras informações. Tais arquivos podem ser salvos usando a opção de