En las l谩nguidas noches de invierno, cuando el sol pasaba perezosamente a trav茅s del velo de los d铆as, encontraba la fuerza para enfrentar la realizaci贸n de un sue帽o de larga data: descubrir c贸mo est谩n dispuestos los procesadores. Este sue帽o me llev贸 a escribir una especificaci贸n formal del procesador RISC-V. Proyecto Github

Como fue
Ten铆a ese deseo hace mucho tiempo, cuando hace 20 a帽os comenc茅 a participar en mis primeros proyectos. En su mayor parte, se trataba de investigaci贸n cient铆fica, modelado matem谩tico en el marco de trabajos y art铆culos cient铆ficos. Estos fueron los d铆as de Pascal y Delfos. Sin embargo, incluso entonces, Haskell y la programaci贸n funcional atrajeron mi inter茅s. Pas贸 el tiempo, cambiaron los idiomas de los proyectos y las tecnolog铆as en las que estuve involucrado. Pero desde entonces, el inter茅s en los lenguajes de programaci贸n funcionales ha sido un hilo com煤n, y se han convertido en: Haskell, Idris, Agda. Recientemente, sin embargo, mis proyectos han estado en Rust. Una inmersi贸n m谩s profunda en Rust me llev贸 a estudiar dispositivos integrados.
De 贸xido a incrustado
Las capacidades de Rust son tan amplias y la comunidad es tan activa que el desarrollo integrado ha comenzado a admitir una amplia gama de dispositivos. Y este fue mi primer paso hacia una comprensi贸n m谩s baja de los procesadores.
Mi primer tablero fue: STM32F407VET6 . Fue una inmersi贸n en el mundo de los microcontroladores, de los cuales en ese momento estaba muy lejos, y entend铆 aproximadamente lo suficiente como se hac铆a el trabajo en un nivel bajo.
Poco a poco, esp32 , ATmega328 juntas (representadas por la junta de Ucrania UNO ) se agregaron aqu铆. La inmersi贸n en stm32 result贸 ser bastante dolorosa: la informaci贸n es abundante y, a menudo, no es la que necesito. Y result贸 que desarrollar, por ejemplo, en Assembler es una tarea bastante rutinaria e ingrata, con su subconjunto de m谩s de 1000 instrucciones. Sin embargo, Rust enfrent贸 esto alegremente, aunque a veces hubo dificultades con la integraci贸n de juntas chinas espec铆ficas.
La arquitectura AVR result贸 ser notablemente m谩s simple y m谩s transparente. Los abundantes manuales me dieron una comprensi贸n suficiente de c贸mo trabajar con un conjunto de instrucciones tan limitado y, sin embargo, ser capaz de crear soluciones muy interesantes. Sin embargo, el camino de Arduino no me complaci贸 en absoluto, pero escribir en Asm / C / Rust result贸 ser mucho m谩s interesante.
驴D贸nde est谩 el RISC-V?
Y en ese momento surge una pregunta l贸gica: 驴d贸nde est谩 la CPU RISC-V ?
Debido a la naturaleza minimalista de AVR y su documentaci贸n suficiente, volv铆 a mi sue帽o anterior para descubrir c贸mo funciona el procesador. En este momento, ten铆a una placa FPGA y las primeras implementaciones para ella en forma de interacci贸n con dispositivos VGA, salida de gr谩ficos, interacci贸n con perif茅ricos.
Los libros fueron mis gu铆as para la arquitectura del procesador:
- John L. Hennessy y David A. Patterson - Arquitectura de computadoras: un enfoque cuantitativo (Serie Morgan Kaufmann en Arquitectura y dise帽o de computadoras)
- John L. Hennessy y David A. Patterson - Organizaci贸n y dise帽o de computadoras. La interfaz hardware / software: Edici贸n RISC-V
- David M. Harris y Sarah L. Harris - Circuitos digitales y arquitectura de computadoras
- El manual del conjunto de instrucciones RISC-V
Porque es necesario
Parece que todo ya se ha escrito e implementado durante mucho tiempo.
diversas implementaciones en HDL y lenguajes de programaci贸n. Por cierto, una implementaci贸n bastante interesante de RISC-V en Rust .
Sin embargo, qu茅 podr铆a ser m谩s interesante que descubrirlo usted mismo y crear el suyo propio. Tu bici 驴O contribuir a la construcci贸n de bicicletas ? Adem谩s del profundo inter茅s personal, tuve una idea: c贸mo tratar de popularizar, interesar. Y encuentre su forma, su enfoque. Y eso significa presentar la documentaci贸n RISC-V ISA bastante aburrida en forma de una especificaci贸n oficial en una forma diferente. Y me parece que el camino de la formalizaci贸n en este sentido es bastante interesante.
驴Qu茅 quiero decir con formalizaci贸n? Un concepto bastante amplio. Representaci贸n de un conjunto de datos espec铆fico en forma formal. En este caso, a trav茅s de una descripci贸n de estructuras y una descripci贸n funcional. Y en este sentido, los lenguajes de programaci贸n funcionales tienen su propio encanto. Adem谩s, la tarea es que una persona que no est茅 muy inmersa en la programaci贸n pueda leer el c贸digo como una especificaci贸n, si es posible, comprender m铆nimamente los detalles del lenguaje en el que se describe.
Un enfoque declarativo, por as铆 decirlo. Hay una declaraci贸n, pero c贸mo funciona exactamente ya no es esencial. Lo principal es la legibilidad, la visibilidad y, por supuesto, la correcci贸n. Correspondencia de las declaraciones formales con el significado incrustado en ellas.

Total: tengo mucha curiosidad por transmitir mi inter茅s a los dem谩s. Existe una cierta ilusi贸n de que el inter茅s es la fuerza impulsora de las acciones. A trav茅s del cual la individualidad se vuelve y se manifiesta Y esto es parte de la autorrealizaci贸n, la encarnaci贸n de la creatividad.
Ambicioso y un poco de letra. Que sigue
Implementaciones existentes
Existen y actualmente est谩n siendo agregados por el proyecto: Verificaci贸n formal RISC-V .
Lista de especificaciones formales (incluido mi trabajo): https://github.com/SymbioticEDA/riscv-formal/blob/master/docs/references.md
Como puede ver, en su mayor parte se trata de formalizaciones en el idioma Haskell. Este fue el punto de partida para elegir un lenguaje funcional diferente. Y mi elecci贸n recay贸 en F # .
驴Por qu茅 F#
Dio la casualidad de que he sabido sobre F # durante mucho tiempo, pero de alguna manera en el ajetreo de la vida cotidiana no tuve la oportunidad de conocernos mejor. Otro factor fue la plataforma .NET . Teniendo en cuenta que estoy bajo Linux, durante mucho tiempo no estaba contento con el IDE, y mono
parec铆a lo suficientemente crudo. Y regresar a Windows solo por MS Visual Studio es una idea bastante dudosa.
Sin embargo, el tiempo no se detiene, y las estrellas en el cielo no tienen prisa por cambiar. Pero en este momento, Jetbrains Rider se hab铆a convertido en una herramienta completa y conveniente, y .NET Core
para Linux no trae dolor de un vistazo.
La pregunta era: qu茅 lenguaje funcional elegir. El hecho de que deber铆a ser solo un lenguaje funcional, en una forma algo pat茅tica, discut铆 anteriormente.
Haskell, Idris, Agda
? F#
- No estoy familiarizado con 茅l. Una gran ocasi贸n para aprender nuevos colores del mundo de los lenguajes funcionales.
S铆, F#
no F#
puramente funcional. Pero, 驴qu茅 impide adherirse a la " pureza "? Y luego result贸 que la documentaci贸n de F # es bastante detallada y completa. Legible, e incluso dir铆a interesante.
驴Qu茅 es F#
para m铆 ahora? Un lenguaje bastante flexible, con IDEs muy convenientes (Rider, Visual Studio). Tipos completamente desarrollados (aunque, por supuesto, Idris
muy lejos). Y en general bastante dulce en t茅rminos de legibilidad. Sin embargo, como result贸, su " no limpieza " funcional puede llevar el c贸digo a una forma completamente loca, tanto en t茅rminos de legibilidad como de l贸gica. El an谩lisis de paquetes en Nuget demuestra esto.
Otra caracter铆stica interesante y misteriosa para m铆 fue el descubrimiento de que nadie estaba interesado en escribir la formalizaci贸n RISC-V ISA en F # antes (oficialmente o en forma de b煤squeda). Y esto significa que tengo la oportunidad de introducir una nueva transmisi贸n en esta comunidad, idioma y " ecosistema ".
Los escollos que encontr茅
La parte m谩s dif铆cil fue la implementaci贸n del flujo de ejecuci贸n. A menudo result贸 que no estaba del todo claro c贸mo deber铆a funcionar la instrucci贸n. Desafortunadamente, un amigo confiable que podr铆a ser llamado a las 3 en punto de la ma帽ana y preguntado con una voz excitada y aspirada: "Sabes, la instrucci贸n BLTU probablemente no se extienda de manera diferente ..." - No lo s茅. En este sentido, tener compa帽eros calificados que ayuden con una palabra amable y un asesoramiento calificado apropiado es muy bienvenido.
Cu谩les fueron las dificultades y dificultades. Probar茅 la tesis:
- ELF: una tarea curiosa era descubrir c贸mo trabajar con 茅l, leer secciones e instrucciones. Lo m谩s probable es que esta historia en el marco del proyecto actual no est茅 terminada.
- instrucciones sin firmar peri贸dicamente condujeron a errores que detect茅 durante las pruebas unitarias
- La implementaci贸n del trabajo con memoria requiere pensar en algoritmos de composici贸n de bytes hermosos y legibles.
- no hab铆a un paquete adecuado para trabajar con bits en
int32, int64
. Me tom贸 tiempo escribir mi paquete y probarlo.
Aqu铆 quiero se帽alar que trabajar con bits en F # es mucho m谩s conveniente que en Haskell con sus datos. - soporte adecuado para bits de registro, con la capacidad de soportar
x32
y x64
al mismo tiempo. La int64
de int64
me llev贸 a usar int64
en algunos lugares. Las pruebas unitarias me ayudaron a identificar esto. Pero tom贸 un tiempo. - No encontr茅 un paquete CLI F # simple, conciso y personalmente conveniente para m铆 personalmente. Un efecto secundario fue escribir una versi贸n minimalista en un estilo funcional.
- Por el momento, sigue siendo un misterio c贸mo implementar correctamente las instrucciones del sistema: FENCE, ECALL, BREAK
- lejos de todo el conjunto de extensiones (extensiones ISA) de la lista:
[A, M, C, F, D]
actualmente obvias. En particular, la implementaci贸n de [F,D]
no se realiza mediante soft float
. - Por el momento, no hay una comprensi贸n clara de las instrucciones privilegiadas, Mod de usuario, trabajo con perif茅ricos, por desgracia. Y esta es la forma de investigaci贸n, ensayo y error.
- No hay cintur贸n negro para escribir programas Assembler bajo RISC-V. Quiz谩s, lejos de ser frecuente, esto sea una necesidad, dada la cantidad de idiomas que ya se han portado para escribir bajo RISC-V.
- el factor tiempo tambi茅n fue significativo: es bastante peque帽o en la vor谩gine del trabajo b谩sico, las necesidades cotidianas y el oc茅ano de la vida. Y hay mucho trabajo, y la mayor parte no se trata tanto de " codificar " - escribir el c贸digo en s铆, sino de aprender, dominar los materiales.
C贸mo funciona y qu茅 caracter铆sticas tiene
Ahora quiz谩s la parte m谩s t茅cnica . 驴Cu谩les son las caracter铆sticas en este momento?
rv32i
conjunto de instrucciones rv32i
- la capacidad de ejecutar el programa como un simulador RISC-V: la ejecuci贸n de archivos ELF.
- soporte de l铆nea de comando (CLI): selecci贸n de arquitectura ejecutable, conjunto de instrucciones, archivos ELF ejecutables, modo de registro, ayuda de l铆nea de comando.
- la capacidad de mostrar el registro de instrucciones ejecutables, cerca de la vista
objdump
al desmontar. - la capacidad de ejecutar pruebas que cubren todo el conjunto de instrucciones implementadas.
El programa se divide en tales etapas y ciclos:
- leer la l铆nea de comando
- leer instrucciones de un archivo ELF
- leer una instrucci贸n espec铆fica de acuerdo con el contador actual de PC (Contador de programas)
- instrucciones de decodificaci贸n
- ejecuci贸n de instrucciones
- En caso de situaciones imprevistas, se configuran trampas, lo que le permite completar el proceso de ejecuci贸n, se帽alar un problema y proporcionar los datos necesarios
- Si el programa no est谩 en un bucle infinito, muestre el estado de los registros y finalice el programa de simulaci贸n.
Lo que est谩 incluido en los planes:
- Base est谩ndar 64i (casi completa)
- Extensi贸n est谩ndar M (multiplicaci贸n / divisi贸n de enteros)
- Extensi贸n est谩ndar A (operaciones de memoria at贸mica)
- Extensi贸n est谩ndar C (instrucciones comprimidas de 16 bits)
- Extensi贸n est谩ndar F (coma flotante de precisi贸n simple)
- Extensi贸n est谩ndar D (coma flotante de precisi贸n doble * Nivel de privilegio M (m谩quina)
- Nivel de privilegio U (usuario)
- Nivel de privilegio S (Supervisor)
- Esquemas de memoria virtual SV32, SV39 y SV48
- programas de acogida
- GPIO - trabaja con perif茅ricos
Como correr
Para ejecutar el programa, debe tener .NET Core
. Si no lo tiene instalado, entonces, por ejemplo, en Ubuntu 16.04
debe ejecutar el siguiente conjunto de comandos:
$ wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb $ sudo dpkg -i packages-microsoft-prod.deb $ sudo apt-get update $ sudo apt-get install apt-transport-https $ sudo apt-get update $ sudo apt-get install dotnet-sdk-3.0
Para verificar que algo en la vida ha cambiado, ejecute:
$ dotnet --version
隆Y la vida deber铆a brillar con nuevos colores!
Ahora intenta correr. Para hacer esto, almacene su t茅 o caf茅 favorito, chocolate con bollos, encienda su m煤sica favorita y siga este conjunto de comandos:
$ cd some/my/dev/dir $ git clone https://github.com/mrLSD/riscv-fs $ cd riscv-fs $ dotnet build $ dotnet run -- --help
y tu consola deber铆a hacerte un gui帽o juguet贸n con un mensaje de ayuda.
El lanzamiento es:
$ dotnet run
En un tono estricto, dir谩 que se necesitan par谩metros. Por lo tanto, ejecute:
$ dotnet run -- -A rv32i -v myapp.elf
Este es el mismo momento inc贸modo cuando resulta que todav铆a necesitamos un programa listo para ejecutar para RISC-V. Y hay algo en lo que te puedo ayudar. Sin embargo, necesitar谩 la cadena de herramientas GNU para RISC-V . Debe instalarse la tarea: la descripci贸n del repositorio describe con suficiente detalle c贸mo hacer esto.
Luego, para obtener el codiciado archivo ELF de prueba, realizamos las siguientes acciones:
$ cd Tests/asm/ $ make build32
Si tiene una cadena de herramientas RISC-V , todo deber铆a funcionar sin problemas. Y los archivos deber铆an mostrarse en el directorio:
$ ls Tests/asm/build/ add32 alu32 alui32 br32 j32 mem32 sys32 ui32
y ahora audazmente, sin mirar atr谩s, probamos el comando:
$ dotnet run -- -A rv32i -v Tests/asm/build/ui32
Es importante tener en cuenta que Tests/asm
no Tests/asm
un programa de prueba, pero su prop贸sito principal son las instrucciones de prueba y sus c贸digos para escribir pruebas. Por lo tanto, si le gusta algo m谩s grande y m谩s heroico, entonces cambiar el mundo en su testamento es encontrar un archivo ELF de 32 bits ejecutable independientemente que solo rv32i
instrucciones rv32i
.
Sin embargo, el conjunto de instrucciones y extensiones se repondr谩n, ganar谩n impulso y aumentar谩n de peso.
Resumen y enlaces
Result贸 ser una narraci贸n pat茅tica con sabor a historia personal. A veces t茅cnico, a veces subjetivo. Sin embargo entusiasta y con un toque de entusiasmo.
Por mi parte, me interesa saber de usted: comentarios, impresiones, buenas palabras de despedida. Y para los m谩s atrevidos: ayuda para apoyar el proyecto.
驴Est谩 interesado en un formato tan narrativo y le gustar铆a continuar?