Conclus ˜ao
Quando se tenta desenvolver um SoC `a medida, utilizando n´ucleos de uma comunidadeOpenSource, espera-se que muitos dos n´ucleos j´a estejam desenvolvidos ou que se encontrem totalmente funcionais.
No entanto no desenrolar desta dissertac¸˜ao, enquanto se tentava construir o SoC, adicionando os n´ucleos necess´arios, tornou-se percept´ıvel que os n´ucleos mais desejados j´a existiam mas que n˜ao estavam totalmente funcionais...
9.1 Trabalho realizado
O SoC desenvolvido neste trabalho adoptou o n´ucleo de processador OR1200 [4] dispon´ıvel no site OpenCores (www.opencores.com). Este ´e escrito em Verilog sintetiz´avel e tem uma capacidade de processamento semelhante `a do processador ARM10 [5]. Algumas empresas e organizac¸˜oes desen-volveram SoCs com base neste processador, entre as mais conhecidas est˜ao a Samsung e a NASA.
Depois adicionaram-se n´ucleos perif´ericos ao processador de modo a construir o SoC, usando para isso a interface Wishbone do processador. Foram ainda desenvolvidos controladores de dispositivo (drivers) para cada n´ucleo utilizado no SoC desenvolvido.
O n´ucleo de UART foi o primeiro n´ucleo a ser adicionado ao SoC. Este n´ucleo j´a se encontrava total-mente funcional, tanto na escrita como na leitura. Serve essencialtotal-mente para comunicac¸˜ao ass´ıncrona de dados utilizando uma interface s´erie de 1 bit em cada sentido, ´e usado essencialmente para enviar mensagens de estado e receber palavras de controlo do exterior do SoC, facilitando a sua depurac¸˜ao.
O n´ucleo mestre de SPI, uma interface s´erie para controlo de outros dispositivos com a mesma interface, foi o segundo n´ucleo a ser adicionado ao SoC. Este j´a fazia leituras correctamente tendo sido necess´ario corrigir a parte de escrita. Como este n´ucleo se limitava a ler de apenas um enderec¸o de cada vez, foi desenvolvido um mecanismo de leitura de posic¸˜oes consecutivas (burst read). Neste tipo de leitura ´e apenas necess´ario indicar a primeira posic¸˜ao a ler que depois o n´ucleo mestre lˆe automaticamente posic¸˜oes consecutivas havendo espac¸o dispon´ıvel na mem´oria FIFO interna. Com este tipo de leitura consegue-se poupar tempo e energia no processo de de boot do SoC. N˜ao foi poss´ıvel encontrar um n´ucleo escravo de SPI que se pudesse usar na implementac¸˜ao desta interface.
Assim, o n´ucleo escravo de SPI foi desenvolvido no decorrer deste trabalho.
O n´ucleo seguinte a ser adicionado ao SoC foi o de I2C, que ainda se encontrava em desenvolvi-mento, n˜ao estando a funcionar correctamente tanto na leitura como na escrita. Foram efectuadas as correcc¸˜oes necess´arias para o correcto funcionalmente do n´ucleo. Tal como para o n´ucleo SPI, n˜ao existia um n´ucleo escravo j´a desenvolvido, o qual tamb´em foi tamb´em desenvolvido no decurso deste trabalho.
Foi inteiramente desenvolvida no ˆambito deste trabalho uma interface que utiliza duas mem´orias do tipo FIFO, havendo uma mem´oria para cada sentido de comunicac¸˜ao. Este n´ucleo apresenta uma interface Wishbone para ser acoplado ao SoC e do outro lado disponibiliza um interface espec´ıfica que permite uma comunicac¸˜ao com um m´odulo externo. Pela interface Wishbone ´e poss´ıvel ler os estado da interface, que pode estar vazia ou n˜ao no canal de recepc¸˜ao, e cheia ou n˜ao no canal de transmiss˜ao.
Quando se executa uma leitura, em geral verifica-se se a FIFO de recepc¸˜ao n˜ao est´a vazia para n˜ao se lerem dados inv´alidos. Reciprocamente, quando se executa uma escrita verifica-se se a FIFO de envio est´a cheia para evitar a perda dos dados escritos.
O SoC tinha originalmente incorporada uma mem´oria Boot ROM bastante simples, que simples-mente alterava o ponteira de instruc¸˜oes para o enderec¸o onde se encontra a primeira instruc¸˜ao do programa, na mem´oria principal. Apenas precisa de executar esta acc¸˜ao porque o programa principal j´a se encontrava previamente carregado na mem´oria principal, n˜ao necessitando de o copiar de uma mem´oria secund´aria para a mem´oria principal.
Existia tamb´em um n´ucleo que copiava o programa de uma mem´oria secund´aria para a mem´oria principal, mas este n˜ao tinha qualquer tipo de verificac¸˜ao dos dados copiados. Foi desenvolvida uma Boot ROM que, para al´em de copiar o programa da mem´oria secund´aria para a mem´oria principal e alterar o enderec¸o do ponteiro de instruc¸˜oes, efectua tamb´em testes da leitura da mem´oria secund´aria e da escrita na mem´oria principal. Em caso de erro, este ´e assinalado tanto pela UART como via GPIO.
´E poss´ıvel habilitar ou desabilitar estas notificac¸˜oes de erro, conforme for pretendido.
Tal como os n´ucleos de hardware algumas ferramentas de desenvolvimento ainda n˜ao estavam completamente desenvolvidas. A ferramenta de integrac¸˜ao e teste 2.1.4 tinha dispon´ıvel apenas o simulador de Verilog 2.2.3 para apoiar desenvolvimento do SoC. Foi ent˜ao implementado uma ambiente de simulac¸˜ao com o simulador 2.2.2, que oferece a possibilidade de se utilizarem ficheiros de teste (testbenches) em C ou em SystemC, o que em muitos aspectos ´e superior `a utilizac¸˜ao de linguagens de descric¸˜ao de hardware tais como o Verilog ou o VHDL.
Utilizando a ferramenta 2.1.4 foi tamb´em desenvolvido um m´odulo de testes que permite ao uti-lizador desenvolver facilmente testes para cada n´ucleo, podendo tamb´em executar uma bateria de testes desenvolvidos ao longo do tempo, garantindo assim que o SoC se mant´em funcional ap´os uma actualizac¸˜ao.
9.2 Trabalho Futuro
Com trabalho futuro sugere-se o desenvolvimento de um sistema de teste para os n´ucleos mais utiliza-dos pela comunidade Open Cores, usando como base a nova funcionalidade de testes da ferramenta FuseSoc( ver secc¸˜ao 8). Isso teria evitado muitos erros encontrados nos n´ucleos adoptados, contri-buindo para melhorar a qualidade dos componentes de hardware open source em geral, o que constitui o maior problema encontrado durante a execuc¸˜ao desta dissertac¸˜ao.
Outro desenvolvimento interessante seria de um sistema de gest˜ao de energia do sistema. Este sistema podia, por exemplo, desligar n´ucleos que n˜ao se encontram activos voltando a lig´a-los s´o quando fosse preciso, poupando assim energia. Por exemplo, neste trabalho, observou-se que o n´ucleo de SPI s´o ´e utilizado no carregamento inicial do programa para a mem´oria de instruc¸˜oes, o que s´o acontece quando o SoC ´e ligado. At´e que o SoC volte a ser ligado o n´ucleo SPI fica a consumir energia sem qualquer necessidade.
A conclus˜ao final deste trabalho foi que a vantagem econ´omica de utilizar componentes de hardware open sourcen˜ao ´e muito evidente. A baixa qualidade dos componentes dispon´ıveis e o trabalho que d´a coloc´a-los num n´ıvel de desempenho satisfat´orio fazem com que a vantagem da gratuitidade dos componentes nem sempre se traduz numa vantagem econ´omica. Actualmente, com o aparecimento da arquitectura de processador RISC-V, muitos destes problemas foram aliviados mas muito existe ainda por se fazer neste dom´ınio.
Bibliografia
[1] Jos´e T de Sousa, Carlos A Rodrigues, Nuno Barreiro, and Joao C Fernandes. Building reconfi-gurable systems using open source components. InX Jornadas sobre Sistemas Reconfigur ´aveis, pages 7–14, 2014.
[2] Wiki. OpenCores. https://en.wikipedia.org/wiki/OpenCores. Accessed: 2014-08-12.
[3] OpenCores community. OpenRISC 1000 Architecture Manual. http://opencores.org/websvn, filedetails?repname=openrisc&path=%2Fopenrisc%2Ftrunk%2Fdocs%2Fopenrisc-arch-1.
0-rev0.pdf. Accessed: 2014-08-05.
[4] OpenCores community. OR1200 OpenRISC Processor - OR1K :: OpenCores.
http://opencores.org/or1k/OR1200 OpenRISC Processor. Accessed: 2014-08-04.
[5] Stephen Hill. The ARM10 Family of Advanced Microprocessor Cores. http://www.hotchips.org/wp-content/uploads/hc archives/hc13/2 Mon/02arm.pdf. Accessed: 2014-08-12.
[6] Julius Baxter. Open Source Hardware Development and the OpenRISC Project: A Review of the OpenRISC Architecture and Implementations. Master’s thesis, KTH, Augsburg,Sweden, 2011.
[7] National Instruments. Fundamentos da tecnologia FPGA - National Instruments.
http://www.ni.com/white-paper/6983/pt/, 2001. Accessed: 2014-08-12.
[8] Xilinx. Field Programmable Gate Array (FPGA). http://www.xilinx.com/training/fpga/fpga-field-programmable-gate-array.htm. Accessed: 2014-08-12.
[9] Nathan Yawn. Debugging System for OpenRisc 1000-based Systems. http://opencores.
org/websvn,filedetails?repname=adv_debug_sys&path=%2Fadv_debug_sys%2Ftrunk%2FDoc%
2For1k_debug_sys_manual.pdf, 2012. Accessed: 2014-08-12.
[10] OpenCores community. WISHBONE System-on-Chip (SoC) Interconnection Architecture for Por-table IP Cores. http://cdn.opencores.org/downloads/wbspec_b4.pdf, 2010. Accessed: 2014-08-12.
[11] elinux. ToolChains. https://elinux.org/Toolchains. Accessed: 2014-08-05.
[12] OpenCores. Newlib - OR1K :: OpenCores. http://opencores.org/or1k/Newlib. Accessed: 2014-08-05.
[13] Uclibc. uClibc. http://www.uclibc.org. Accessed: 2014-08-05.
[14] OpenCores coomunity. ORPSoC. http://opencores.org/or1k/ORPSoC. Accessed: 2014-08-07.
[15] OpenCores. Or1ksim - OR1K :: OpenCores. http://opencores.org/or1k/Or1ksim. Accessed: 2014-08-07.
[16] Jeremy Bennett. OR1KSIM User Guide. https://github.com/openrisc/or1ksim/tree/or32-master/doc.
Accessed: 2014-08-07.
[17] Verilator. Introduction to Verilator. http://www.veripool.org/wiki/verilator. Accessed: 2014-08-08.
[18] IEEE Standard for Standard SystemC Language Reference Manual.IEEE Std 1666-2011 (Revision of IEEE Std 1666-2005), pages 1–638, Jan 2012.
[19] Stephen Williams. Icarus Verilog. http://iverilog.icarus.com/. Accessed: 2014-08-08.
[20] Altera. Fundamentos da tecnologia FPGA - National Instruments.
http://www.altera.com/products/fpga.html, 2001. Accessed: 2014-08-12.
[21] Dominic Rath. Open On-Chip Debugger. Master’s thesis, University of Applied Sciences, Augs-burg,Germany, 2005.
[22] OpenOCD Team. OpenOCD - Open On-Chip Debugger Reference Manual. Samurai Media Limi-ted, United Kingdom, 2015.
[23] societyofrobots. MICROCONTROLLER UART TUTORIAL. http://www.societyofrobots.com/microcontroller uart.shtml.
Accessed: 2014-08-04.
[24] Texas Instruments. KeyStone Architecture General Purpose Input/Output (GPIO).
http://www.ti.com/lit/ug/sprugv1/sprugv1.pdf. Accessed: 2018-06-20.
[25] NXP Semiconductors. UM10204 I2C-bus specification and user manual. April.
[26] MicroChip. I2C Master Mode. http://ww1.microchip.com/downloads/en/DeviceDoc/i2c.pdf. Acces-sed: 2016-01-30.
[27] MicroChip. SPI. http://ww1.microchip.com/downloads/en/DeviceDoc/spi.pdf. Accessed: 2016-01-30.
[28] SD Association. Home - SD Association. Accessed: 2014-08-25.