Descrição das características do processador Leon

 

André Reis

Alberto Pereira

 

Índice

 

Introdução

O SPARC

Descrição das características do processador Leon (SparcV8)

Unidade de Inteiros do LEON

Coprocessador e unidade de vírgula flutuante

Subsistema de cache

Barramento AMBA

Funções periféricas do processador

Interface de memória

Sinais

Bibliografia

Perguntas

 

 

 



Introdução

 

David Patterson na Universidade da Califórnia em Berkeley conduziu o projecto e a execução do RISC I(Reduced Instruction Set Computer). Este Projecto abriu caminho à fundação da arquitectura SPARC(Scalable Processor ARChitecture). Em 1985 uma equipa de Engenheiros da Sun Microsystems definiu a arquitectura SPARC baseada em larga medida nas especificações do RISC. Posteriormente em 1986 nasce o primeiro processador SPARC, o SPARC 86900 a 16 MHz de 32 bits, que equipou as estações de trabalho Sun-4/260. Em 1989, com o propósito de potencializar esta arquitectura, foi fundada a SPARC International para superintender e guiar a evolução desta arquitectura aberta. A versão 7 do SPARC fica então disponível para a comunidade. Em 1990 surge a versão 8 com diversas melhorias chave em instruções de dividir e multiplicar construídas no hardware, funções de MMU(Unidade de Gestão de Memória) e suporte para operações de vírgula flutuante de 128 bits. Presentemente a especificação da arquitectura SPARC vai na versão 9 de 64 bits.

Em Outubro de 1997, um projecto interno da Agência Espacial Europeia, denominado LEON, foi lançado para estudar um processador de 32 bits para futuras missões espaciais para lá do ano 2000. Jiri Gaisler da ESA disponibilizou a primeira versão do LEON em 1999, um implementação open source VHDL do SPARC V8. Presentemente está a ser desenvolvida por Jiri Gaisler uma segunda versão conhecida por LEON2.

 

 

 

topo


O SPARC

 

O SPARC foi planeado com o objectivo de optimizar compiladores e permitir implementações fáceis do pipeline no hardware. A janela de registos da arquitectura SPARC permite uma significativa redução de instruções de leitura e escrita em memória particularmente em programas de elevada dimensão. Essa redução é ainda maior quando as aplicações estão escritas em c++ ou outra linguagem orientada a objectos. Particularmente a arquitectura SPARC permite uma maior flexibilidade aos compiladores na alocação de registos relativamente às arquitecturas RISC I e II. Tal fica a dever-se ao facto da gestão da janela de registos não se fazer através de procedimentos de salto(CALL e JMPL) mas através de instruções separadas(SAVE e RESTORE).

 

SPARC(V8) é uma arquitectura de conjunto de instruções com inteiros de 32 bits e de 128, 64 e 32 bits de vírgula flutuante(IEEE Standard 754) como tipos de dados principais. Define a finalidade geral dos registos de inteiros, de vírgula flutuante e de estado e de 72 instruções básicas de operações todas em formato de 32 bits. As instruções de leitura e escrita destinam-se linearmente a um espaço de endereçamento de 232 bytes. Para além das instruções de vírgula flutuante, o SPARC também fornece suporte de conjunto de instruções para um coprocessador opcional.

Um processador SPARC compreende a unidade de inteiros, a unidade de vírgula flutuante e um coprocessador opcional, cada unidade com os seus próprios registos. Este processador tem dois modos de funcionamento, o de utilizador e o de super utilizador. Existem instruções que apenas podem ser executadas no modo super utilizador. Todos os registos são de 32 bits exceptuando possivelmente os registos do coprocessador. O conjunto de instruções SPARC define-se em 6 categorias:

 

1)      Leitura e escrita em memória

2)      Aritméticas e lógicas e de shift(deslocação de bits)

3)      Controlo de fluxo

4)      Leitura e escrita em registos de controlo

5)      Operações de vírgula flutuante

6)      Operações do coprocessador

 

O modelo de memória da arquitectura SPARC define a semântica das operações de memória e especifica a ordem pela qual são executadas, tanto em sistemas de um processador como de multiprocessadores com memória partilhada. Todas as implementações do SPARC utilizam pelo menos o modelo de memória standard TSO(Total Store Ordering) mas o SPARC define também um modelo PSO(Partial Store Ordering) para permitir um melhor desempenho. O endereçamento de memória utiliza a convenção Big Endian. O SPARC define também o mecanismo de controlo de interrupções e excepções. Uma implementação do SPARC pode não possuir todas as funcionalidades definidas por esta arquitectura para estar em conformidade com esta.

 

 

 

topo


Descrição das características do processador Leon (SparcV8)

 

Introdução

 

O modelo VHDL do LEON implementa um processador de 32 bits em conformidade com a arquitectura SPARC(V8). Foi desenhado para aplicações embutidas com as seguintes características no chip: instruções e cache de dados separados, multiplicador e divisor de hardware, controlo de interrupções, dois relógios de 24 bits, dois UART’s(Universal Asynchronous Receiver-Transmitter), função de power-down, portas de Entrada/Saida de 16 bits e controlo de memória flexível. Modulos adicionais podem ser facilmente implementados usando o bus AMBA(Advanced Microcontroller Bus Architecture) AHB/APB(Advanced High-performance Bus / Advanced Peripheral Bus).

 

. Simulation can be done with all VHDL- 87 compliant simulators.

 

Licença

 

O model VHDL do LEON é fornecido sob duas licenças: a licença pública GNU(GPL) e a LPGL(Lesser GNU Public License).

 

Vista funcional

 

 

 

 

topo


Unidade de Inteiros do LEON

 

A unidade de inteiros(UI) do LEON implementa as instruções de inteiros definidas no SPARC(V8). É uma implementação nova que não é baseada em nenhum projecto anterior. Esta implementação é baseada na portabilidade e na reduzida complexidade.

 

Vista geral

 

A UI tem as seguintes características:

1)      Pipeline de 5 estágios

2)      Instruções e interface de cache de dados separado

3)      Suporte para 2 a 32 janelas de registos

4)      Multiplicador configurável (iterativo, 16x16, 32x8, 32x16 & 32x32)

5)      MAC de 16x16 bits opcional com acumulador de 40 bits

6)      Radix-2 divider

 

A seguir mostra-se o diagrama de blocos da UI

 

Pipeline de instruções

 

A UI usa um pipeline de 5 estágios:

1.      FE(Instruction Fetch).Se o cache de instruções estiver activo, a instrução é puxada(fetched) directamente da cache de instruções. Caso contrário o FE é redireccionado para o controlador de memória. A instrução é valida no fim deste estágio e é fixada dentro da UI

2.      DE(Decode). A instrução é descodificada e os operandos são lidos. Os operandos podem provir do ficheiro de registos ou através de dados internos. As instruções de salto são geradas neste estágio.

3.      EX(Execute). As operações de lógica, aritmética e de shift são realizadas neste estágio. Para operações de memória(ex. LD) e para saltos(JMPL/RETT), o endereço é gerado.

4.      ME(Memory). O cache de dados é acedido. Para leituras os dados serão validados no fim deste estágio e alinhados apropriadamente. Os dados guardados no estágio anterior são agora escritos na cache de dados.

5.      WR(Write). Os resultados de quaisquer operações feitas nos estágios anteriores são escritas no ficheiro de registos.

 

A tabela seguinte contém os ciclos por instrução

* depende da configuração do multiplicador

 

Instruções de multiplicação

 

O LEON suporta as instruções de multiplicação do SPARC UMUL, SMUL, UMULCC e SMULCC. Estas instruções realizam multiplicações de 32 por 32 bits de inteiros, produzindo um resultado e 64 bits. SMUL e SMULCC fazem multiplicação com sinal enquanto UMUL e UMULCC fazem multiplicação com sinal. Duas instruções de multiplicação e acumulação são implementadas(UMAC e SMAC) para acelerar os algoritmos de optimização do assembler.

 

Instruções de divisão

 

Suporta totalmente as instruções de dividir do SPARC V8(SDIV/UDIV/SDIVCC/

UDIVCC). Estas instruções realizam uma divisão de 64 por 32 bits e produzem resultados em 32 bits. A detecção de arredondamentos e de overflow são realizadas como definidas no SPARC V8.

 

Identificador do espaço de endereçamento

 

A tabela seguinte mostra o uso do identificador do espaço de endereçamento(ASI)

 

 

 

Excepções

 

O LEON utiliza o modelo para excepções do SPARC.

A tabela seguinte mostra as excepções e a sua prioridade.

 


 

 


Operação de reset do Processador

 

O processador é reiniciado tomando o input do RESET pelo menos por um ciclo do relógio. A tabela seguinte indica os registos cujos valores serão afectados. Todos os outros registos manterão os seus valores inalterados.

 

 

 

 

topo


Coprocessador e unidade de vírgula flutuante

 

Interface genérico do coprocessador

O LEON  pode ser configurado para fornecer um interface genérico para um coprocessador com um fim específico. A interface permite a execução em paralelo para aumentar o desempenho. Uma instrução do coprocessador pode iniciar-se em cada ciclo de relógio, desde que não existam dependências de dados. Quando termina, o resultado é escrito de novo no ficheiro de registos do coprocessador.

 

Interface da unidade de vírgula flutuante

 

O modelo do LEON pode ser ligado ao núcleo de vírgula flutuante do Meiko, logo fornecendo um suporte completo para o standard SPARC V8. Duas opções de interface estão disponíveis: um interface paralelo idêntico ao descrito acima para o coprocessador, ou um interface integrado onde a instrução FP(vírgula flutuante) não é executada em paralelo com a instrução UI. O interface da unidade de vírgula flutuante é seleccionado no registo de configuração. O processador pára durante a execução de instruções de vírgula flutuante. Permite no entanto executar em paralelo com a unidade de inteiros, desde que não existam dependências de dados ou de recursos.

 

 

 

topo


Subsistema de cache

 

O LEON fornece separação de cache de dados e de instruções, cada uma configurável de 1 a 64 Kbytes, com 8 a 32 bytes por linha. É implementado o sistema de colocação de sub-blocos com 1 bit de validade por cada palavra de 32 bits de forma a reduzir a miss penality.

 

Cache de instruções

 

Esta cache utiliza mapeamento directo. Cada linha da cache tem uma etiqueta associada(tag) e um bit de validade por cada 4 bytes do sub-bloco.

 

Cache de dados

 

Também utiliza mapeamento directo. A política de escrita para armazenamento é write-through, ou seja a informação é guardada tanto na cache como no nível mais baixo da hierarquia de memória, em que o bloco não é levado para a cache numa write miss(no write allocate). A cache tem um Buffer de escrita composto por 3 registos usados para guardar temporariamente dados até que sejam enviados para os dispositivos de destino.

 

Registo de controlo da cache

O funcionamento da cache é controlado através de registo. Cada uma das caches pode estar em um de três modos: activado, desactivado e parado. Se estiver desactivada não é feita nenhuma operação na cache e os pedidos de escrita são passados directamente ao controlador de memória. Se estiver parado funciona tal e qual como se estivesse activo, a cache é guardada e mantida sincronizada com a memória principal, mas nenhuma nova linha é colocada na cache em caso de read miss.

 

 

topo


Barramento AMBA

 

O barramento AMBA APB é usado para aceder aos registos nas funções periféricas. É optimizado para um mínimo consumo de energia e para uma reduzida complexidade do interface para suporte das funções periféricas do processador. Enquanto o barramento AMBA AHB é usado para transferências de dados a alta velocidade e para módulos de sistema com altas frequências de relógio. Uma vez que uma unidade de gestão de memória não é fornecida com o LEON, o controlador AHB gera um sinal indicando que o corrente acesso à memória pode ser posto em cache. Os dados que podem ser postos na cache estão definidos numa tabela no registo de configuração do AHB.

 

 

 

topo


Funções periféricas do processador

 

Registos de funções de apoio ao sistema

 

Um número de funções de apoio ao sistema são fornecidos directamente pelo processador. As funções são controladas através de registos descritos pela tabela seguinte.

 

 

 

Controlador de interrupções

 

O Controlador de interrupções do LEON atribui a prioridade das interrupções e propaga os pedidos de interrupções dos dispositivos internos ou externos até à unidade de inteiros(UI). No total são tratadas cerca de 15 interrupções, divididas em dois níveis de prioridade. A figura seguinte mostra o diagrama de blocos do controlador de interrupções.

 

 

Funcionamento

 

Quando é gerada uma interrupção, o bit correspondente é colocado num registo de interrupções pendentes. Realiza-se então uma operação de conjunção entre o bit pendente e o registo de máscara de interrupção e depois o resultado é encaminhado para o selector de prioridade. Cada interrupção pode ter um de dois níveis como programado no registo de nível de interrupção. O nível 1 tem maior prioridade que o nível 0. A prioridade é organizada dentro de cada nível desde o valor 1 ao 15, sendo este último o de maior prioridade. A interrupção com maior prioridade do nível 1 é encaminhada para a unidade de inteiros – se não existir nenhuma interrupção sem máscara pendente no nível 1, então a interrupção sem máscara com mais alta prioridade do nível zero será encaminhada. Quando a UI reconhece a interrupção, o bit pendente correspondente será libertado.

Uma interrupção pode também ser forçada colocando um bit no registo de interrupções forçadas. Neste caso o reconhecimento da interrupção pela UI provocará a libertação do bit forçado ao invés do bit pendente. Depois da reinicialização, o registo de máscara de interrupção é todo colocado a zero enquanto os registos de controlo restantes ficam indefinidos. Note-se que a interrupção 15(que é definida pelo utilizador como aliás todas as 10-15) não é mascarável pela UI e deve ser usada com cuidado pois a maior parte dos sistemas operativos não trata com segurança esta interrupção.

A tabela seguinte mostra as atribuições das interrupções.

 

 

Opcionalmente o LEON possui um controlador de interrupções secundário que adiciona mais 32 interrupções todas a serem implementadas pelo utilizador.

 

Unidade de Relógio

 

A unidade de relógio implementa dois relógios de 24 bits, um watchdog de 24 bits e um prescaler partilhado de 10 bits.

 

 

O prescaler é cronometrado pelo relógio do sistema e decrementado por cada ciclo de relógio. Quando chega a zero é reiniciado no registo de reload do prescaler e uma batida de relógio é gerada para os dois relógios de 24 bits e para o watchdog. O funcionamento dos relógios é controlado pelo registo de controlo de relógio.

 

UARTs

 

Dois UART’s(Universal asynchronous receiver transmiter) são fornecidos pelo LEON para comunicações em série. São fornecidos com janelas de dados de 8 bits, um bit de paridade opcional e um stop bit. Para gerar uma bit rate, cada UART tem um divisor de relógio de 12 bits programável. O controlo de fluxo do hardware é suportado por sinais gerados pelo RTSN/CTSN.

 

 

Porta paralela de E/S

 

Uma porta paralela de E/S de 16 bits é fornecida pelo LEON. Cada bit pode ser programado para ser uma entrada ou uma saída. Alguns bits têm um uso alternativo tal como entradas ou saídas da UART e entradas externas de interrupções.

 

Registo de configuração do LEON

 

[25]: instruções UMAC/SMAC implementadas

[24:20]: número de janelas de registo. O número de janelas de registo SPARC – 1

[19:17]: tamanho da cache de instruções (em Kbytes). Tamanho da cache = 2ICSZ

[16:15]: tamanho das linhas da cache de instruções (em palavras de 32 bits). Tamanho da linha = 2ILSZ

[14:12]: tamanho da cache de dados (em Kbytes). Tamanho da cache = 2DCSZ

[11:10]: tamanho das linhas da cache de dados (em palavras de 32 bits). Tamanho da linha = 2DLSZ

[9]: instruções UDIV/SDIV implementadas

[8]: instruções UMUL/SMUL implementadas

[7]: presença de watchdog

[6]: presença de registo de endereço em falha e estado da memória

[5:4]:  tipo de FPU (00=nenhuma, 01=Meiko)

[3:2]: tipo de PCI (00=nenhuma, 01=InSilicon, 10=ESA, 11=outro)

[1:0]: tipo de protecção de escrita (00=nenhuma, 01=standard)

 

 

Função de power-down

 

O processador pode ser desligado escrevendo um valor arbitrário no registo de power-down. O modo de power-down será estabelecido na instrução seguinte de load-store. Para entrar neste modo imediatamente introduzem-se dois stores consecutivos no registo de power-down. Durante o modo de power-down a UI ficará parada. O modo de power-down termina quando uma interrupção sem máscara de nível superior ao nível de interrupção do processador ficar pendente.

 

 

 

topo


Interface de memória

 

O barramento de memória fornece uma interface directa para a PROM, a RAM estática (SRAM) e os dispositivos de E/S mapeados pela memória. A descodificação da selecção do chip é feita para dois bancos PROM, um banco de E/S e quatro bancos de RAM. A figura mostra como é realizada a conexão entre os diferentes tipos de dispositivos.

 

 

 

Controlo de memória

 

O barramento de memória externa é controlado por um controlador de memória programável. A função do controlador de memória é programada pelos registos de configuração 1 e 2 (MCR1 e MCR2) através do barramento APB (AMBA).

A memória suporta três tipos de dispositivos: prom, ram e E/S local. O barramento de memória pode também ser configurado em modo de 8 bits para aplicações com baixa necessidade de memória e performance. O controlador pode descodificar um espaço de endereços de 2 Gbytes, divido de acordo com a tabela seguinte.

 

 

O tamanho da área de RAM pode ir até 1 Gbytes, divido em 4 bancos de RAM. O tamanho de cada banco é programado no campo de tamanho-de-banco de RAM (MCR2[12:9]) e pode ser definido em saltos de 8 Kbytes a 256 Kbytes.

 

Configuração da memória de 8 e 16 bits.

 

Para suporte eficiente de aplicações com baixa necessidade de memória e performance não é necessário ter sempre bancos de memória de 32 bits. As áreas de RAM e PROM podem ser configuradas individualmente para operações de 8 ou 16 bits programando os tamanhos de campo de RAM e de ROM nos registos de configuração de memória. Como o acesso à memória é sempre feito em base de palavras de 32 bits, o acesso de leitura à memória de 8 bits irá ser transformado em quatro ciclos de leitura enquanto que o acesso à memória de 16 bits irá gerar duas leituras de 16 bits. Durante a escrita, só os bytes necessários serão escritos.

 

 

Registo 1 de configuração de memória

 

O registo 1 de configuração de memória é usado para programar a temporização dos acessos à rom e às E/S locais.

 

 

 

[3:0]: define o número de estados de espera durante os ciclos de leitura da prom (“0000”=0, “0001”=1… “1111”=15).

[7:4]: define o número de estados de espera durante os ciclos de escrita da prom (“0000”=0, “0001”=1… “1111”=15).

[9:8]: define o tamanho de dados da área de prom (“00”=8, “01”=16, “10”=32).

[10]: reservado

[11]: quando em 1, permite ciclos de escrita na área de prom

[17:12]: reservado

[18]: fecho(latch) externo. Quando em 1, é necessário o fecho externo de endereços

[19]: quando em 1, fica disponível o acesso ao barramento de memória da área de E/S.

[23:20]: define o número de estados de espera durante os acessos E/S (“0000”=0, “0001”=1… “1111”=15).

[25]: erro de barramento (BEXCN)

[26]: barramento disponível (BRDYN)

[28:27]: define o tamanho de dados da área de E/S (“00”=8, “01”=16, “10”=32).

 


Registo 2 de configuração de memória

 

O registo 2 de configuração de memória é usado para controlar a temporização dos acesso à SRAM.

 

 

 

[1:0]: define o número de estados de espera durante os ciclos de leitura da ram (“00”=0, “01”=1, “10”=2, “11”=3).

[3:2]: define o número de estados de espera durante os ciclos de escrita da ram (“00”=0, “01”=1, “10”=2, “11”=3).

[5:4]: define o tamanho de dados da área de ram (“00”=8, “01”=16, “1X”=32).

[6]: permite ciclos de leitura-modificação-escrita.

[8:7]: reservado

[12:9]: define o tamanho de cada banco de ram (“0000”=8 Kbytes, “0001”=16 Kbytes... “1111”=256 Mbytes).

 

Protecção de escrita

 

Para proteger as áreas de memória e de E/S contra escrita acidental sobre os dados. É implementada como dois blocos de unidades de protecção com a capacidade de permitir ou não ou acesso de escrita. Cada bloco é controlado por um registo de controlo. Se for detectado um erro de protecção de escrita, o ciclo de escrita é abortado e é gerado um erro de acesso à memória.

 

 

 

topo


Sinais

 

Todos os sinais de entrada são fechados (latched) na subida do ciclo de relógio CLK. Todas as saídas são cronometradas na subida do ciclo de relógio CLK.

 


Sinais do Barramento de memória

 

 

Sinais do interface de Sistema

 

 

 

 

topo


Bibliografia

 

Biografia de David Patterson - http://www.cs.berkeley.edu/~pattrsn/bio.html

Computer Architecture A Quantitative Approach – Second Edition, Patterson / Hennessy

Site da SPARC - http://www.sparc.org/

The SPARC Architecture Manual Version 8

http://www.estec.esa.nl/wsmwww/leon/

The LEON Processor User’s Manual - Version 2.4.0 November 2001

LEON-1 Processor - First Evaluation Results - http://klabs.org/DEI/Processor/sparc/Papers/gaisler.pdf

AMBA™ Specification (Rev 2.0)

Artigos sobre o LEON

http://www.eetimes.com/story/OEG20000306S0096

http://www.eetimes.com/story/OEG20001215S0019

http://www.eetimes.com/story/OEG20010201S0050

 

topo


Perguntas

 

P.: No processador LEON não é usado nenhuma unidade de gestão de memória. Como são controlados os acessos à cache neste contexto?

 

R.: Como o LEON usa a tecnologia de barramento AMBA o controlador AMBA AHB (Advanced high performance bus) gera um sinal indicando que o corrente acesso à memória pode ser posto em cache.

 

P : Porque é a política de escrita na cache de dados do LEON é write through e não de write back?

 

R.: Como o LEON foi desenhado a pensar também no uso em sistemas de multiprocessador a politica de write back seria desadequada pois diminui tráfego no acesso à memória, usando menos largura de banda e ocupando portanto o barramento durante mais tempo. Também num sistema de multiprocessador é possível que as caches sejam partilhadas tornando o sistema de write back desapropriado ao problema.

 

 

topo