Sunteți pe pagina 1din 6

Microprocesador RISC

basado en MIPS32 con


conectividad AMBA AHB-Lite
Oroz De Gaetano Ariel†∗1 , Di Federico Martı́n∗2 y Julián Pedro†3
∗ Centro de Micro y Nanoelectrónica del Bicentenario, Instituo Nacional de Tecnologı́a Industrial
Drago 45 piso 7, Bahı́a Blanca, Buenos Aires, Argentina
1
agaetano@inti.gob.ar
2
martind@inti.gob.ar
† Departamento de Ingenierı́a Eléctrica y de Computadoras, Universidad Nacional del Sur
Avenida Alem 1253, Bahı́a Blanca, Buenos Aires, Argentina
3
pjulian@uns.edu.ar

Abstract—This work presents the design of a RISC processor instrucción combinada con la ejecución en paralelo de las
based in a MIPS32 Multicycle architecture and modified mismas cuando no comparten recursos de hardware, permite
to be compatible with the AMBA AHB-Lite communication obtener mejor desempeño del procesador [1]–[4].
protocol. The design consists of a reduced instruction set that
allows the execution of essential processing tasks while adding En la actualidad los SoC (System-On-Chip) pueden poseer
the versatility provided by the communication protocol. The
más de un procesador y, sumado a la importancia de
performance of this design is compared, running a bubble
sort program, with other processors like Cortex-M0 (ARM), sus respectivas arquitecturas, cobra relevancia el sistema
OpenRISC1200, ZPU Medium y LEON3. In the comparison utilizado para interactuar con el resto de los periféricos del
the complexity, number of gates and speed of each processor sistema, el arbitraje del bus y las memorias. El protocolo de
is taken into account. bus AMBA (Advanced Micro controller Bus Architecture)
Resumen— En este trabajo se presenta el diseño de un define un estándar de comunicación on-chip para micro
procesador RISC basado en la arquitectura MIPS32 Multiciclo controladores embebidos de alto rendimiento. Entre las vari-
y modificado para ser compatible con el protocolo de comu- antes que ofrece, se encuentra AHB-Lite (Advanced High-
nicación AMBA AHB-Lite. El diseño cuenta con un conjunto performance Bus Lite) que soporta un sistema de múltiples
reducido de instrucciones que le permite llevar a cabo tareas
esenciales de procesamiento, incorporando al mismo tiempo la maestros, operaciones de alto ancho de banda, transferencias
versatilidad que el protocolo de comunicación proporciona. de distintos anchos de palabra, en ráfagas y dedicadas. Otras
Se realiza la comparación de su desempeño, corriendo un caracterı́sticas destacables del sistena de bus AMBA es que
programa de ordenamiento por burbujeo, con el de otros es independiente de la tecnologı́a de implementación y se
procesadores como Cortex-M0 (ARM), OpenRISC1200, ZPU orienta al diseño de sistemas modulares, lo cual asegura
y LEON3. En la comparación se tiene en consideración su
complejidad, cantidad de compuertas y velocidad. la reusabilidad y facilita la ampliación del sistema y sus
componentes [5].
I. I NTRODUCCI ÓN En la primera sección del documento se detallan las car-
acterı́sticas del procesador, arquitectura, capacidades y el
En los inicios de la computación digital la memoria de flujo de ejecución de sus instrucciones. Luego se describe
almacenamiento implicaba un costo tal que inclinó a que en la sisguiente sección el proceso de verificación de fun-
los procesadores fueran fabricados con un conjunto de cionamiento y métrica de desempeño. La tercera sección
instrucciones complejas (CISC), capaces de ser escritas brinda información de la sı́ntesis y por último se encuentra
en una lı́nea de código pero que implican llevar a cabo la conclusión.
múltiples tareas para su realización. De este modo se re-
quiere de más tiempo para la decodificación y ejecución
II. D ISE ÑO DEL MICROPROCESADOR
de cada instrucción, compuesta por pequeñas instrucciones
realizables en una unidad de tiempo. Como contrapropuesta,
En esta sección se muestra el diseño de un microproce-
la arquitectura de procesadores RISC apela a un conjunto
sador reducido de arquitectura RISC, basada en MIPS32
simple de instrucciones apuntando a la implementación de
multiciclo, con conectividad AMBA. Esto implica que su
instrucciones elementales y de un ciclo de duración. La
conjunto de instrucciones se basa en la de dicha arquitectura,
arquitectura realiza las operaciones aritmético-lógicas solo
pero implementando solo un subgrupo de las mismas e
entre registros y por ello posee más registros que CISC.
incorporando la lógica de control y datapath necesaria para
Para poder operar con memoria implementa instrucciones
cumplir las especificaciones del protocolo de bus AHB-Lite.
dedicadas a la carga y almacenamiento memoria-registros
y como consecuencia posee modos de direccionamiento Todos los elementos del sistema fueron diseñados mediante
más simples. Si bien se complejiza la programación de el lenguaje de descripción de hardware Verilog [6], comen-
procesadores RISC, la subdivisión de las tareas de una zando por la descripción comportamental de cada bloque
que conforma el datapath y continuando con la conexión La unidad aritmético-lógica (ALU) lleva a cabo todas las
de los mismos para integrarlo. Por otro lado se realizó la operaciones aritméticas con signo y lógicas entre registros
descripción comportamental del control del procesador, el del banco. Entre las operaciones implementadas se encuen-
cual constituye una máquina de estados que manipula las tran suma, resta, AND, OR, NOR, XOR y comparaciones
señales de control acorde a la instrucción actual y el control de igualdad, mayor o menor. Ante resultados nulos el f lag
de la ALU. de cero cambia a estado activo en alto y, para aquellas
operaciones aritméticas cuyo resultado exceda la capacidad
de representación en 32 bits, se produce desbordamiento
A. Caracterı́sticas elementales
señalizado con el f lag de overf low de manera activa en
El procesador cuyo diagrama en bloques se muestra en alto.
la figura 1 está constituido principalmente por un registro Los tipos de datos soportados en la arquitectura son: byte
de instrucción (IR), uno de contador de programa (PC), (8 bits), media palabra (half word, de 16 bits) y palabra
un banco de registros de propósito general (GPR), una (word, de 32 bits). Bytes y medias palabras se cargan en
unidad aritmético-lógica (ALU), una unidad de control (UC) los registros con sus respectivos signos extendidos para
y lógica de adaptación de bus AMBA. Se integran estos completar el ancho de los registros. La arquitectura posee
componentes elementales con multiplexores, extensores de un espacio de direcciones de 4 GB (232 bytes) con direc-
signo y registros de desplazamiento utilizados en las dis- cionamiento al byte, lo que significa que cada byte en la
tintas instrucciones implementadas y que en el diagrama se memoria tiene una dirección única y se soporta la carga y
agrupan como lógica de formateo de datos. almacenamiento de datos de tal ancho. A pesar de ello solo
pueden realizarse transferencias de palabras alineadas, de
manera que si cada palabra consta de 4 bytes con su propia
dirección cada uno, las palabras poseen direcciones que son
múltiplos de 4. Cuando se escribe en lenguaje ensamblador
de MIPS, es preciso indicar las dirección de memoria de una
instrucción como múltiplo de 4 dado que las instrucciones
de la arquitectura son de 32 bits de ancho. Es decir, las di-
recciones 1, 2 y 4 deben escribirse 4, 8 y 16 respectivamente.
No son válidas direcciones no divisibles por 4, excepto en
instrucciones que manipulen datos de ancho menor a 32 bits.
En las transferencias de esta ı́ndole los buses de entrada y
salida de datos poseen lógica para adaptar los mismos según
las especificaciones del la arquitectura del procesador y del
protocolo de comunicación.

Fig. 1. Diagrama en bloques del procesador. La arquitectura admite cinco modos de direccionamiento:
registro, inmediato, base, relativo a PC y pseudo directo.
Los registros IR y PC son de 32 bits de ancho, siendo el En el direccionamiento por registro se utilizan exclusiva-
primero utilizado para almacenar la instrucción actual en mente registros para toda fuente y destino de datos.
ejecución y el segundo para almacenar la dirección de la Para el direccionamiento inmediato se utiliza un registro y
siguiente instrucción a ser ejectuada. un valor inmediato de 16 bits contenido en la instrucción.
En el direccionamiento base, la dirección efectiva de un dato
El procesador cuenta con un banco conformado por 32 reg- en memoria se computa sumando la dirección contenida en
istros de 32 bits, 30 de los cuales se encuentran disponibles un registro y la extensión de signo del valor inmediato de
para propósitos generales. Los registros 0 y 31 están reser- 16 bits de la instrucción. Es mayormente utilizada en las
vados para el procesador. El primero se denomina registro instrucciones de carga y almacenamiento de memoria.
zero, ya que alberga dicho valor para el uso de variadas El direccionamiento relativo al PC es usado en las instruc-
instrucciones del procesador. El segundo registro reservado ciones de saltos condicionales donde se actualiza el PC bajo
se denomina watchdog y su bit más significativo (31) indica cierta condición. Se toma el valor con signo del campo
que el mismo está habilitado (activo en alto), mientras que inmediato y se suma al valor actual del PC para computar
los 31 bits restantes son utilizados para almacenar su valor el nuevo.
de temporizado. El watchdog permite al usuario configurar Finalmente, en el direccionamiento pseudo-directo la in-
la cantidad de ciclos de reloj de espera tolerables durante una strucción incluye la dirección de interés completa. Los
transacción en el bus. Cuando está habilitado y se cumple di- dos bits menos significativos deben ser siempre 0 ya que
cho lapso, la unidad de control interrumpe el funcionamiento la dirección debe estar alineada (ser múltipo de 4), los
del procesador para que el bus no permanezca retenido siguientes 28 bits corresponden a la dirección del salto y los
por un esclavo del sistema ante su potencial fallo. Luego, cuatro bits más significativos se extraen de los cuatro más
el procesador continúa la ejecución saltando al vector de significativos del PC calculado para la siguiente instrucción.
interrupción del watchdog (definido en memoria durante la Como consecuencia, el rango de los saltos está limitado.
implementación) reservado para que el usuario especifique
la tarea a realizar en tal caso. La lógica de control del procesador (UC) se encarga del
manejo de habilitaciones de los bloques, selección de tener un número diferente de etapas que duran un ciclo
caminos de datos y arbitraje de tiempos de espera de los de reloj, resultando en instrucciones de distinta duración.
esclavos en las instrucciones que interactúan con éstos de Aquellas que más etapas poseen son las de carga y al-
acuerdo al protocolo. Como la arquitectura del procesador macenamiento en memoria, que determinan la máquina de
no implementa transferencias dedicadas y/o en ráfagas, estados de ejecución del procesador esquematizada en la
las señales del protocolo AHB-Lite correspondientes se figura 3. Las primeras dos etapas son realizadas en todas
conectan a tierra en el diseño [5]. las instrucciones: en la búsqueda de instrucción (IF del
inglés instruction fetch) se lee de memoria la instrucción
B. Instrucciones señalada por el contador del programa, que es posterior-
mente incrementado, y luego en la etapa de decodificación
La arquitectura implementa los tres tipos de instrucciones (ID, instruction decode) se reconoce el tipo de instrucción
definidos en MIPS y clasificados como tipo R, tipo I y y se configuran señales de control pertinentes. En esta etapa
tipo J que se diferencian principalmente en los operandos también se computa la dirección de salto condicional con la
empleados y en su naturaleza [7]–[9]. ALU. En caso de tratarse de una instrucción de este tipo,
El primer tipo opera datos almacenados en registros y dicha dirección es utilizada en las etapas posteriores de la
almacenan el resultado en otro. La instrucción distribuye sus ejecución y en caso contrario el valor es descartado.
32 bits en seis campos, como se describen a continuación Para las instrucciones de carga y almacenamiento en memo-
y muestran en la figura 2(a). La operación a realizar se ria (LW, LB, LH, SW, SB, SH) se computa la dirección en la
codifica en el primer y el último campo de seis bits llamados etapa MemAddr y en la siguiente, de acceso a memoria,
opcode y f unct. Los operandos se codifican en tres campos se carga o almacena el contenido del lugar de memoria
de cinco bits: rs, rt y rd. Los dos primeros indican los indicado por la instrucción. Para cumplir con el protocolo
registros con los que se opera, mientras que el tercero indica de comunicación AMBA el procesador debe esperar que el
el registro destino para almacenar el resultado. El campo esclavo habilitado para la transferencia señalice el fin de la
restante, denominado shamt, es también de cinco bits y comunicación de datos durante estas etapas. El esquema de
contiene el número de rotaciones empleados en las funciones la máquina de estados de la figura 3 indica con flechas en
para dicho fin. En las instrucciones tipo R que no requieren color gris que la ejecución se interrumpe y se permanece en
rotación de bits, el campo debe contener ceros. estos estados hasta que dicha señalización ocurra y, de lo
El segundo grupo de instrucciones toma su nombre de “tipo contrario, se produce el time-out que dispara el watchdog
inmediato” ya que uno de sus campos alberga un valor según sea configurado. Finalmente, las instrucciones de
utilizado en la operación y que no está almacenado en carga de datos poseen una etapa en la cual se escribe en
ningún medio del sistema. Los 32 bits se distribuyen en el registro destino los datos adquiridos (MemComp). Las
cuatro campos. En primer lugar el opcode, seguido de dos instrucciones de almacenamiento, por otra parte, poseen una
registros rs y rt. Dependiendo la instrucción en cuestión, el etapa para escribir en la memoria (Comp). Algunos ejemplos
contenido del campo rs puede ser ignorado o utilizado como son:
base según se explica en el tipo de direccionamiento base.
El propósito del campo rt también varı́a según la instrucción LW - GP R[rt] ← memory[GP R[base] + of f set]
y puede ser el registro destino de una operación con valores Load Word - El contenido de los 32 bits del lugar en
inmediatos. El tercer operando y cuarto campo es el valor memoria indicado por la dirección efectiva alineada son
inmediato, de un ancho de 16 bits como muestra la figura buscados, extendidos en signo y almacenados en GPR rt.
2(b). El contenido de 16 bits con signo del of f set se suman con
El tercer tipo de instrucción obtiene su nombre de la palabra el de GPR base para formar la dirección efectiva.
jump (salto en inglés). Nuevamente lidera el campo opcode MIPS Assembler: LW rt, offset(base)
seguido por el segundo y último campo de dirección con un SB - memory[GP R[base] + of f set] ← GP R[rt]
ancho de 26 bits como muestra la figura 2(c). Son utilizadas Store Byte - El byte menos significativo de GPR rt es
para saltos incondicionales entre lı́neas de un programa. almacenado en memoria en la dirección efectiva indicada.
La dirección se forma con la suma de los 16 bits con signo
del offset y el contenido del registro GPR base.
MIPS Assembler: SB rt, of f set(base)
(a) Tipo R.

Aquellas instrucciones que emplean el campo de 16 bits


(b) Tipo I. para operar con valores inmediatos poseen etapas separadas
según sea una operación lógica (ImmLogic), aritmética
(ImmArit) o de almacenamiento en registro (LUI). Poste-
(c) Tipo J. riormente en la etapa ImmComp se almacena el resultado
en el registro destino. Ejemplos de estas instrucciones:
Fig. 2. Formato de instrucciones.
LUI - GP R[rt] ← inmediato || 016
Dado que este diseño se deriva de la arquitectura MIPS Load upper immediate - El valor inmediato de 16 bits es
Multiciclo, la ejecución de las instrucciones consta de una desplazado hacia la izquierda 16 bits y concatenado con 16
serie de etapas. Los distintos tipos de instrucciones pueden ceros en la media palabra menos significativa. El resultado
Fig. 3. Máquina de estados del flujo de ejecución de instrucciones.

se almacena en el registro de 32 bits GPR rt. And - El contenido de GPR[rs] se combina con el de
MIPS Assembler: LUI rt, inmediato GPR[rt] como la intersección lógica bit a bit. El resultado
se almacena en GPR[rd].
ADDI - GP R[rt] ← GP R[rs] + inmediato
Add immediate - El valor con signo inmediato de 16 bits se MIPS Assembler: AND rd, rs, rt
suma al contenido de GPR rs para producir un resultado
de 32 bits. Las instrucciones de salto pueden ser incondicionales (J) o
MIPS Assembler: ADDI rt, rs, inmediato condicionales (Branch). En el primer caso se modifica la
ANDI - GP R[rt] ← GP R[rs] AN D inmediato dirección en el PC mientras que en el segundo se evalúa
And immediate - La constante de 16 bits se extiende con la igualdad o desigualdad de los operandos y se decide si
ceros a la izquierda y se combina con el contenido de saltar o no. La dirección se actualiza en el PC durante la
GPR[rt] como la intersección lógica bit a bit. El resultado etapa Comp.
se almacena en GPR[rt]. BEQ - if GP R[rs] = GP R[rt] then branch
MIPS Assembler: ANDI rt, rs, inmediato Branch if equal - El campo offset de 16 bits, desplazado
dos bits a la izquierda, se suma a la dirección de la
Todas las instrucciones aritméticas y lógicas entre registros siguiente instrucción a la del salto para formar la dirección
son computadas en la etapa EX y posteriormente almace- de destinto relativa al PC. Si los contenidos de GPR rs y
nadas en la etapa RI. GPR rt son iguales, se bifurca la ejecución a la dirección
calculada luego de ejecutar la instrucción del delay slot.
ADD - GP R[rd] ← GP R[rs] + GP R[rt] MIPS Assembler: BEQ rs, rt, of f set
Add - La palabra de 32 bits contenida en GPR rt se suma
J-
a la contenida en GPR rs para producir un resultado de 32 Jump - Salto asociado a región del PC; la dirección efectiva
bits. se encuentra en la región actual de 256 MB del PC. Los 28
MIPS Assembler: ADD rd, rs, rt bits menos significativos de la dirección destinto son los del
AND - GP R[rd] ← GP R[rs] AN D GP R[rt] campo instr index desplazados 2 bits. Los bits superiores
Procesador diseñado ARM Cortex-M0 OpenRISC 1200 ZPU Medium LEON3
AV AM AV AM AV AM AV AM AV AP
1.235 1.225 850 841 1.883 1.851 360 206 1.121 1.037
Slices Registro
(2.26%) (2.24%) (1.55%) (1.54%) (3.45%) (3.39%) (0.65%) (0.37%) (2.05%) (1.9%)
1.630 1.586 3.475 3.072 4.650 4.617 1.091 1.069 3.529
Slices LUTs 2.908
(5.97%) (5.81%) (12.73%) (11.25%) (17.04%) (16.91%) (3.99%) (3.91%) (12.93%)
Frecuencia máx.
79,88 68,34 53,4 35,5 114,34 113,83 162,52 162,5 97,63 61,96
(MHz)
Número de ciclos de reloj
Ordenamiento
206.965 153.080 199.520 2.161.318 98.691
por
Tiempo de ejecución (ms)
burbujeo
2,59 3,03 2,87 4,31 1,74 1,75 13,3 13,3 1,01 1,59
TABLA I
TABLA COMPARATIVA DE DESEMPE ÑO Y S ÍNTESIS DE LOS PROCESADORES OPTIMIZADOS SEG ÚN ALTA VELOCIDAD (AV) O ÁREA M ÍNIMA (AM).

restantes son los correspondientes a los de la dirección de


la siguiente instrucción al salto. Salta a la dirección efectiva
destino.
MIPS Assembler: J dirección

III. V ERIFICACI ÓN FUNCIONAL Y COMPARACI ÓN DE


DESEMPE ÑO

Durante el diseño de los bloques que integran al procesador,


se llevaron a cabo simulaciones del funcionamiento de cada
uno utilizando la herramienta de software Xilinx ISE y su
simulador ISim. Para las simulaciones de prueba del diseño
completo se integró un sistema básico (acorde con lo que
Fig. 4. Esquema en bloques generalizado del sistema propuesto.
especifica AMBA AHB-Lite [5]) que incluye dos bloques de
memoria, un decodficador de direcciones y un multiplexor
para las señales de ambos esclavos como esquematiza la
IV. S ÍNTESIS E IMPLEMENTACI ÓN
figura 4. Se implementó un ensamblador en Octave que
interpreta un programa en lenguaje MIPS Assembly y lo Se realizó la sı́ntesis del microprocesador en la FPGA
traduce a la correspondiente cadena binaria para cargar en Spartan-6 XC6SLX45 con la herramienta de sı́ntesis ISE
la memoria de la simulación. Se codificó un programa que de Xilinx. El proceso se llevó a cabo también para cada
prueba todas las instrucciones y se verificó su correcta procesador mencionado, optimizando primero para alta
funcionalidad. velocidad de desempeño (AV) y luego para área mı́nima
(AM). En la tabla I se vuelcan los resultados para cada
Con el objeto de obtener una métrica comparativa del de-
caso, considerando la cantidad de registros disponibles
sempeño del microprocesador se lo puso a prueba simulando
empleados, LUTs (Look-Up Tables) y frecuencia de reloj
la ejecución de un algoritmo de ordenamiento por burbujeo
máxima alcanzada, el valor porcentual en cada caso indica
con un arreglo de cien elementos. Luego se contrastó los
los recursos empleados respecto de los disponibles en la
resultados de ordenar el mismo arreglo utilizando los sigu-
FPGA.
ientes procesadores: Cortex-M0, OR1200, ZPU y LEON3.
El ordenamiento por burbujeo es un método simple mediante
el cual se recorre repetidas veces un arreglo comparando Lo primero que se observa es que la sı́ntesis apuntada a
pares adyacentes de valores. Cuando un par se encuentra mı́nima área no reduce significativamente la misma. Por
desordenado los valores se invierten entre si y se continúa otro lado, sı́ impacta en la velocidad de procesamiento
con el siguiente par. El procedimiento debe repetirse hasta reduciendo la frecuencia de trabajo excepto para Open-
poder recorrerse el arreglo completo sin realizarse más cam- RISC1200 y ZPU. Este último es el procesador de menor
bios entre pares, lo que resulta en un arreglo ordenado. Si área y mayor frecuencia, sin embargo por tratarse de un
bien en la práctica el burbujeo demuestra no ser el algoritmo procesador que opera sobre la pila (stack), la cantidad de
más eficiente de ordenamiento, se lo selecciona para la ciclos necesarios y el tiempo de ejecución del algoritmo
comparación de desempeño ya que ejercita al procesador son significativamente mayores a cualquier otro. El diseño
diseñado en la mayorı́a de las instrucciones implementadas. propuesto insume menor cantidad de recursos de la placa
Los resultados obtenidos para cada microprocesador se respecto del Cortex-M0, OpenRISC1200 y LEON3, aunque
muestran en la tabla I, contrastando la cantidad de ciclos su frecuencia de trabajo es algo menor frente a éstos dos
requeridos para ordenar el arreglo en cada caso. últimos.
V. C ONCLUSI ÓN

En este trabajo se presentó el diseño de una arquitectura


MIPS, implementando un subconjunto de sus instrucciones,
y obteniendo un procesador capaz de realizar tareas elemen-
tales de procesamiento. Los resultados en la comparación
de desempeño demuestran que, pese a su simplicidad,
puede procesar resultados en un número de ciclos de reloj
comparable respecto de los demás procesadores y con una
frecuencia de operación que promedia la de éstos. Incluso,
en algunos casos, consume menos recursos de la FPGA
respecto de sus pares. Otra de las ventajas del diseño es
la adaptación del bus de comunicación al protocolo AMBA
AHB-Lite, ya que le otorga versatilidad para ser incorporado
en sistemas de mayor complejidad de manera más sencilla.

R EFERENCIAS

[1] D. A. Patterson and J. L. Hennessy, Computer Organization and


Design, the hardware/software interface, 4th ed. 255 Wyman Street,
Waltham, MA, USA: Elsevier, 2012.
[2] Baer, J., Microprocessor Architecture, From Simple Pipelines to Chip
Multiprocessors. New York, NY, USA.: Cambridge University Press,
2010.
[3] J. L. Hennessy and D. A. Patterson, Computer Architecture, A Quan-
titave Approach, 5th ed. 255 Wyman Street, Waltham, MA, USA:
Elsevier, 2012.
[4] D. Money Harris and S. Harris, Computer Architecture, 2nd ed. 255
Wyman Street, Waltham, MA, USA: Elsevier, 2013.
[5] AMBA 3 AHB-Lite Protocol v1.0 - Specification, ARM Ltd., 2006.
[6] IEEE Standard for Verilog Hardware Description Language, IEEE, 3
Park Avenue, New York, USA, 2006.
[7] MIPS32 Architecture Vol. I - Introduction to the MIPS32 Architecture,
MIPS Technologies Inc., 955 East Arques Avenue, Sunnyvale, CA,
USA, Marzo 2011.
[8] MIPS32 Architecture Vol. II - The MIPS32 Instruction Set, MIPS
Technologies Inc., 955 East Arques Avenue, Sunnyvale, CA, USA,
Marzo 2011.
[9] D. Sweetman, See MIPS Run. 255 Wyman Street, Waltham, MA,
USA: Elsevier, 2006.

S-ar putea să vă placă și