# MicroBlaze

El processador MicroBlaze és un processador RISC (d'Instruccions Reduïdes) de 32 bits, desenvolupat per Xilinx i compatible amb les FPGAs de les famílies Spartan i Virtex.

## Arquitectura
### Visió general

Aquestes són les principals característiques del processador MicroBlaze:
* Disposa d'una arquitectura Harvard amb busos de 32 bits separats per a accés a dades i instruccions, permet l'accés a aquests recursos a través de la memòria cau.
* Compta amb interfícies per als busos OPB, LMB i PLB. A més a més, compta amb un protocol XCL per a accés a la memòria cau de dades i instruccions quan està habilitat aquest recurs.
* El repertori d'instruccions de MicroBlaze és el típic repertori d'un processador RISC. En total compte amb 87 instruccions diferents.
* S'inclouen operacions de multiplicació hardware a partir de la família Spartan3.
* Quant a registres, compta amb 32 registres de 32 bits cada un de propòsit general, i fins a 80 de propòsit específic.
* Compta amb cinc etapes màxim per a l'execució d'instruccions (arquitectura pipeline), amb el que és capaç de tenir una instrucció completa amb cinc cicles de rellotge.
* És un processador basat en codi software, al contrari del seu homòleg, el PowerPC que és un mòdul hardware i ja ve encastat a la FPGA de la família Virtex.
* Posseeix un grup extens de paràmetres configurables que li proporcionen una certa flexibilitat per al desenvolupador a l'hora de dissenyar un sistema.

### Instruccions

Totes les instruccions de MicroBlaze són de 32 bits i estan definides com a Tipus A o Tipus B. Les instruccions de tipus A tenen fins a dos registres d'origen i un de destinació com a operands.
| Opcode (7) | Reg destí (5) | Reg origen A (5) | Reg origen B (5) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Les de tipus B tenen un registre com a operador origen i un operand immediat de 16 bits (el qual es pot ampliar a 32 bits precedint la instrucció de tipus B amb una instrucció imm) i un registre de destí.
| Opcode (7) | Reg destí (5) | Reg origen (5) | Valor immediat (16) |
Les instruccions s'emmarquen dins les tipologies segons la seva funcionalitat següents:
* Aritmètiques
* Lògiques
* de Salt
* Load/Store
* Especials

### Registres

MicroBlaze té una arquitectura amb un ventall d'instruccions ortogonal. Té 32 registres de propòsit general (de 32-bits cada un), i fins a 80 registres de propòsit especial (de 32-bits cada un) depenent de les opcions de configuració.
Els 32 registres de propòsit general estan numerats de R0 fins a R31:
| Bits | Nom | Descripció | Valor de reset |
| 0:31 | R0 | Sempre té un valor de 0. Tot el que s'escrigui a aquest registre és descartat. | 0x00000000 |
| 0:31 | R1 fins a R13 | Registres de 32 bits de propòsit general | - |
| 0:31 | R14 | Utilitzat per a emmagatzemar adreces de retorn per a interrupcions | - |
| 0:31 | R15 | Recomanada la seva utilització per a emmagatzemar adreces de retorn de vectors d'usuari. | - |
| 0:31 | R16 | Utilitzat per a emmagatzemar adreces de retorn de breaks. | - |
| 0:31 | R17 | Utilitzat per emmagatzemar l'adreça del HW causant d'una interrupció (si l'opció està activada) | - |
| 0:31 | R18 fins a R31 | Registres de 32 bits de propòsit general | - |
D'altra banda, alguns exemples dins dels fins a 80 disponibles per a propòsit especific són:
* PC (Program Counter): Encarregat d'emmagatzemar l'adreça de la instrucció en execució.
* MSR (Machine Status Register): Conté controls i bits d'estat per al processador.
* EAR (Exception Address Register): Emmagatzema d'adreça de load/store que ha causat l'excepció.
* FSR (Floating Point Status Register): Conté bits fer a la unitat de punt flotant.

### Pipeline

Per a la majoria d'instruccions, cada etapa triga un cicle de rellotge a ser completada. Com a conseqüència, el nombre de cicles necessaris per a finalitzar una instrucció especifica és igual al nombre d'etapes del pipeline.
Quan s'executa en memòries lentes, els fetch de les instruccions poden trigar múltiples cicles. Aquesta latència addicional afecte directament l'eficiència del pipeline. MicroBlaze implementa una instrucció prefetch buffer que redueix l'impacte d'aquestes memòries lentes.
Mentre el pipeline està estancat en una instrucció de memòria multicicle, el prefetch buffer continua carregant instruccions seqüencialment, així quan el pipeline acaba l'execució, l'etapa de fetch pot carregar noves instruccions directament del prefech buffer en comptes d'esperar que la instrucció d'accés a memòria finalitzi.
Si les instruccions són modificades en temps d'execució, el prefetch buffer ha de ser buidat abans d'executar les instruccions modificades, per tal d'assegurar que no conté les instruccions antigues.

#### Pipeline de tres etapes

Amb C_AREA_OPTIMIZED posat a 1, el pipeline es divideix en tres etapes per a minimitzar el cost de harware: Fetch, Decode i Execute
| | cicle1 | cicle2 | cicle3 | cicle4 | cicle5 | cicle6 | cicle7 |
| Instrucció 1 | Fetch | Decode | Execute | | | | |
| Instrucció 2 | | Fetch | Decode | Execute | Execute | Execute | |
| Instrucció 3 | | | Fetch | Decode | Stall | Stall | Execute |

#### Pipeline de cinc etapes

Amb C_AREA_OPTIMIZED posat a 0, el pipeline es divideix en cinc etapes per a maximitzar el rendiment: Fetch(IF), Decode(OF), Execute(EX), Acces Memory(MEM) i Writeback(WB).
| | cicle1 | cicle2 | cicle3 | cicle4 | cicle5 | cicle6 | cicle7 | cicle8 | cicle9 |
| Instrucció 1 | IF | OF | EX | MEM | WD | | | | |
| Instrucció 2 | | IF | OF | EX | MEM | MEM | MEM | WD | |
| Instrucció 3 | | | IF | OF | EX | Stall | Stall | MEM | WB |

### Arquitectura de memòria

MicroBlaze està implementat amb l'arquitectura de memòria Harvard, on l'accés a instruccions i dades es realitzen en espais de memòria diferents.
Cada espai d'adreces té un rang de 32 bits, on tant els rangs de memòria d'instruccions com de dades es poden superposar mapejant els dos en una mateixa adreça de memòria.
Ambdues interfícies de MicroBlaze són per defecte de 32 bits d'ample i utilitzen big-endian o little-endian depenent del paràmetre C_ENDIANNESS i suporta accessos a paraula, mitja-paraula i byte.
Els accessos han d'estar alineats per defecte a no ser que el processador hagi estat configurat per suportar excepcions d'alineació. Tots els accessos a instruccions han de ser amb alineació a paraula.
MicroBlaze no separa els accessos a entrada/sortida i memòria (utilitza mapeig de memòria E/S). El processador té fins a tres interfícies per a accessos a memòria:
* Bus de memòria local (LMB)
* Advanced eXtensible Interface (AXI4) per accesos a perfèrics.
* Advances eXtensible Interface (AXI4) o AXI Coherency Extension (ACE) per a accessos a Memòria cau.

## EDK

L'EDK (embedded development kit) de Xilinx és un paquet de desenvolupament per a construir MicroBlaze (i PowerPC) sistemes encastats amb Xilinx FPGAs, suportat per Eclipse (entorn integrat de desenvolupament), consisteix en dos entorns separats: XPS i SDK.
Els dissenyadors utilitzen XPS (Xilinx Platform Studio) per a configurar i construir les especificacions del hardware dels seus sistemes encastats.
L'XPS converteix el disseny en una descripció RTL sintetitzable (Verilog o VHDL) i escriu un conjunt de scripts per tal d'automatitzar la implementació del sistema encastat.
L'SDK suporta el software que serà executat en el sistema encastat. Motoritzat pel GNU toolchain, el SDK permet als programadors escriure, compilar i depurar aplicacions en C/C++ pel seu sistema encastat. Xilinx inclou un simulador, donant la possibilitat als programadors d'executar el seu software en un simulador o d'utilitzar una placa FPGA adequada i executar-ho en el sistema pertinent.
D'altres simuladors i compiladors han estat creats i estan disponibles (Altium), tot i que per a una instal·lació EDK segueix sent necessària la llicència pertinent.

## Clons

* aeMB, implementat en Verilog, llicència LGPL
* OpenFire, implementat en Verilog, Llicència MIT
* MB-Lite, implementat en VHDL, llicència LGPL
* MB-Lite+, implementat en VHDL, llicència LGPL
* myBlaze, implementat en myHDL, llicència LGPL
* SecretBlaze, implementat en VHDL, llicència GNU General Public License

## Altres processadors software

* Nios II
* TSK3000
* Xtensa
* LatticeMico32

## Vegeu també

* Xilinx
* Contingut obert

## Enllaços externs

* MicroBlaze Reference Guide