Linux em um MCU de 8-bits emulando ARM

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Mensagempor luisf.rossi » 06 Abr 2012 02:01

Marcelo Samsoniuk escreveu:antes de tentar, dah uma olhada nisso:

http://opencores.org/articles,1004822682

bom, fora a questoes legais, tem uma importante questao funcional: performance!

tem tempo, eu achei alguns posts em foruns sobre o assunto e o povo comentava que a performance do blackARM era decepcionante, coisa da ordem de apenas 15 MHz, o q eh baixo comparado com os tipicos 30MHz que se consegue com um clone de 68000. recentemente eu portei um design nosso de um bus de 8 bits p/ 16 bits, houve uma piora de performance e comecei a entender como a coisa funciona.

e o motivo eh bem simples: em uma FPGA, quando maior a largura do barramento, maior eh o requerimento de tempo extra de setup/hold. se vc tiver uma unica linha, vc consegue fechar o tempo de setup/hold em algo da ordem de 500MHz em uma FPGA barata. se vc tem duas linhas, os tempos de setup/hold delas vao ser diferentes e o tempo total sera a soma dos tempos de setup/hold. com 16 linhas vc chega em algo como 30MHz e com 32 linhas fica nos 15MHz.

a maior parte das FPGAs tem otimizacoes p/ larguras de 16 bits, mas o uso requer uma certe simetria de construcao. quando a logica eh muito complexa (como eh um ARM ou 68000), existe um quebra de simetria e a logica passa a ser descrita de forma assimetrica. o resultado eh aquele espalhamento da temporizacao de setup/hold.

designs simples, como o J1, conseguem manter uma certa simetria, nao apenas melhorando a performance, como tambem ocupando muito menos espaco:

http://excamera.com/sphinx/fpga-j1.html

nao sei quanto o BlackARM ocupava (nos foruns falaram algo da ordem de uma virtex com 1 milhao de gates!), mas p/ ter ideia, um 68000 em verilog consome espaco equivalente a oito cores J1 (uns 500 mil gates). e o J1 roda 3x mais rapido que o 68000.


Depende muito isso do modo que é implementado e o que o bus irá fazer e quantos ciclos de clock ele precisa para isso. Mas realmente não é algo na ordem de 30 - 15Mhz.

Recentemente eu fiz um projeto de uma placa para se conectar ao barramento PCI do computador (usando o PCI Bridge do Open Cores). O projeto foi implementado em um Spartan3. O PCI em si ja é um barramento de 32 bits e funciona à 33Mhz, mas dentro do Core minha lógica toda usava barramentos de 32 Bits à 50Mhz sem problema. E muitas vezes eu usava umas belas de umas lógicas combinatórias. Se colocar um pipeline gigantesco com no máximo um nível ou dois de lógica combinatória entre os FF você consegue 100Mhz fácil.

Essas questões de simetria em um FPGA não são tão críticas assim nessa ordem de frequência. O propagation delay está na ordem de pocos ns. O setup/hold também não é tão crítico. O que normalmente mata são é toda a lógica encadeada formada por LUTs, portas lógicas e MUX. A não ser que o seu FPGA já esteja bem no talo. Dai realmente a frequência começa a cair bruscamente por falta de caminhos.

ABs
luisf.rossi
Byte
 
Mensagens: 109
Registrado em: 28 Nov 2010 12:48
Localização: São Paulo, SP

Mensagempor msamsoniuk » 06 Abr 2012 11:59

luisf.rossi escreveu:Depende muito isso do modo que é implementado e o que o bus irá fazer e quantos ciclos de clock ele precisa para isso. Mas realmente não é algo na ordem de 30 - 15Mhz.

Recentemente eu fiz um projeto de uma placa para se conectar ao barramento PCI do computador (usando o PCI Bridge do Open Cores). O projeto foi implementado em um Spartan3. O PCI em si ja é um barramento de 32 bits e funciona à 33Mhz, mas dentro do Core minha lógica toda usava barramentos de 32 Bits à 50Mhz sem problema. E muitas vezes eu usava umas belas de umas lógicas combinatórias. Se colocar um pipeline gigantesco com no máximo um nível ou dois de lógica combinatória entre os FF você consegue 100Mhz fácil.

Essas questões de simetria em um FPGA não são tão críticas assim nessa ordem de frequência. O propagation delay está na ordem de pocos ns. O setup/hold também não é tão crítico. O que normalmente mata são é toda a lógica encadeada formada por LUTs, portas lógicas e MUX. A não ser que o seu FPGA já esteja bem no talo. Dai realmente a frequência começa a cair bruscamente por falta de caminhos.

ABs


eh que estou falando de processadores e, imaginei que estava implicito: para decodificar instrucoes temos imensos blocos de logica combinacional!. e veja que nao tem muita simetria, pq os sets de instrucoes sao naturalmente bem assimetricos: a medida que vc vai decodificando, os caminhos sao bem diferentes. e suponha que vc quer um compromisso de um clock por instrucao, o resultado eh uma grande queda de performance. pipelinezar o decodificador pode ser complexo: como as instrucoes sao assimetricas, vc teria que colocar um monte de pipelines independentes.

e daih talvez fosse mais facil usar microcodigo. nao sei se existe uma receita de bolo, mas o que eu vejo eh que processadores mais simples tem performance maior em FPGAs.

note que o impacto no bus de dados eh muito menor: tanto o 68000 quanto o ARM tem datapaths de 32 bits. entao, com certeza, o impacto maior nao eh causado pelo datapath. mas nao se pode dizer que o impacto nao existe: o simples fato de sair de 16 para 32 bits jah causa uma queda de performance que vc nao consegue recuperar. mas como o datapath normalmente eh simetrico, a queda eh menor. o fato eh que uma FPGA nunca vai ser como um ASIC, onde vc pode compensar os paths no layout.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor tcpipchip » 06 Abr 2012 18:09

Quando nos construimos nosso processador...sem FPGA....tivemos que rodar a 50Hz para funcar :)
Aqui um pedaço dele...
Imagem
Imagem
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor luisf.rossi » 06 Abr 2012 20:00

Marcelo Samsoniuk escreveu:
eh que estou falando de processadores e, imaginei que estava implicito: para decodificar instrucoes temos imensos blocos de logica combinacional!. e veja que nao tem muita simetria, pq os sets de instrucoes sao naturalmente bem assimetricos: a medida que vc vai decodificando, os caminhos sao bem diferentes. e suponha que vc quer um compromisso de um clock por instrucao, o resultado eh uma grande queda de performance. pipelinezar o decodificador pode ser complexo: como as instrucoes sao assimetricas, vc teria que colocar um monte de pipelines independentes.

e daih talvez fosse mais facil usar microcodigo. nao sei se existe uma receita de bolo, mas o que eu vejo eh que processadores mais simples tem performance maior em FPGAs.

note que o impacto no bus de dados eh muito menor: tanto o 68000 quanto o ARM tem datapaths de 32 bits. entao, com certeza, o impacto maior nao eh causado pelo datapath. mas nao se pode dizer que o impacto nao existe: o simples fato de sair de 16 para 32 bits jah causa uma queda de performance que vc nao consegue recuperar. mas como o datapath normalmente eh simetrico, a queda eh menor. o fato eh que uma FPGA nunca vai ser como um ASIC, onde vc pode compensar os paths no layout.


Bom realmente isso tenho que concordar. Comparado à ASSPs (acho que seria o termo mais correto no caso) não tem nem comparação. E eu concordo com tudo que você disse, mas acho que está sendo meio drástico na frequência. Eu vi um artigo uma vez que a Intel implementou um ATOM em um FGPA (acho que um virtex 5) e fez funcionar à 100Mhz. Além, acho que esses Cores feitos para FPGAs como NIOS II, Cortex-M1 entre outros consegue chegar à uns 80Mhz em um FPGA de baixo custo.

PS: Raça ein tcpipchip?
luisf.rossi
Byte
 
Mensagens: 109
Registrado em: 28 Nov 2010 12:48
Localização: São Paulo, SP

Mensagempor msamsoniuk » 06 Abr 2012 22:54

nao eh que estou sendo drastico nao...eh a realidade! mesmo o atom que vc citou, rodava apenas a 50MHz em uma virtex! hehehe

http://forums.xilinx.com/xlnx/attachmen ... l_atom.pdf

eu francamente esperava mais de um x86, afinal a decodificacao de instrucoes eh de oito em oito bits. mas o core zet, x86 compativel (80186), consegue sintetizar com apenas miseros 19 MHz em uma spartan-3e. eu nao consegui sintetizar o ARM chines e nao achei mais nenhum core ARM para testar facil. os boatos eh que nao passam de 15MHz em uma virtex. jah testei varios 68k e a performance na spartan3 eh numa faixa entre 25 e 35MHz. ouvi falar tambem de um 8080 que consegue sintetizar a 100MHz em uma spartan3, mas nem perdi tempo testando. mesmo no caso do picoblaze, que a arquitetura mais compacta e otimizada em um xilinx, vc vai ter 88MHz em uma spartan3 e 240MHz em uma virtex-6.

em todos os casos, 1 clock nao representa 1 instrucao, portanto em uma spartan3 eu acho que a lideranca de performance ainda fica com a J1, que consegue 80MIPS rodando a 80MHz. francamente, nao achei ateh agora nada mais compacto e eficiente! veja que ele cabe na menor sparta3 q existe, o que o faz dele bem viavel economicamente, pau a pau com microcontroladores baratos de 32 bits!

mesmo o cortex-m0 que vc citou nao eh bem como vc pensa que eh:

http://web.fi.uba.ar/~pmartos/publicaci ... nxFPGA.pdf

na realidade ele eh umas 10x maior que um J1 e 2x maior que um 68k. e roda no maximo a 40MHz, metade de um J1 e pouca coisa melhor que um 68k. economicamente, ainda nao eh viavel: o preco de uma spartan-3 de 500 mil gates eh 3x maior que o preco de um coldfire v2 de 166MHz.

eu acho que a conclusao eh simples: quanto mais assimetrico e largo o circuito de decodificacao, mais impacto na performance existe. e para ser viavel, tem que rodar em FPGAs baratas, senao acaba sendo mais em conta usar um microcontrolador. por ex, qq coisa q precisa de uma virtex acho que danca bem rapido: tem muitos powerpcs com clocks monstros e perifericos magicos que deixam qq virtex no chinelo por uma fracao do custo!

luisf.rossi escreveu:Bom realmente isso tenho que concordar. Comparado à ASSPs (acho que seria o termo mais correto no caso) não tem nem comparação. E eu concordo com tudo que você disse, mas acho que está sendo meio drástico na frequência. Eu vi um artigo uma vez que a Intel implementou um ATOM em um FGPA (acho que um virtex 5) e fez funcionar à 100Mhz. Além, acho que esses Cores feitos para FPGAs como NIOS II, Cortex-M1 entre outros consegue chegar à uns 80Mhz em um FPGA de baixo custo.

PS: Raça ein tcpipchip?
Editado pela última vez por msamsoniuk em 06 Abr 2012 23:12, em um total de 1 vez.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor msamsoniuk » 06 Abr 2012 23:09

tcpipchip escreveu:Quando nos construimos nosso processador...sem FPGA....tivemos que rodar a 50Hz para funcar :)


vc tem que aprender e ensinar verilog por aih! daih fica mole p/ fazer coisas com FPGAs! :)

http://www.asic-world.com/verilog/veritut.html

eu perdi anos e anos tentando aprender VHDL, mas verilog para quem manja de C eh tipo gripe: depois de 3 dias de sofrimento vc jah tah bom no negocio! :D
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor tcpipchip » 07 Abr 2012 09:50

Pois Eh
A ultima vez que tive contato com
vhdl foi em 1996...quando fiz um
Programador para o 89cxxxxx, com
O fpga da altera.
Depois disto...só usei cupl Para mostrar
Para gurizada expressões booleanas nos
Gals da atmel
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Anterior

Voltar para ARM

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x