Depuração.

Linguagem descritiva de hardware

Moderadores: 51, guest2003

Depuração.

Mensagempor Red Neck Guy » 19 Jun 2016 17:02

Para iniciar a desenvolver em uma nova plataforma, os requisitos que eu tenho são:
-Domínio básico da sintaxe da linguagem
-Domínio do processo de simulação
-Domínio do processo de depuração.

Eu conheço o básico de VHDL e sei simular utilizando o Modelsim.
Me faltava saber utilizar a ferramenta de depuração, depois de um treinamento que fiz na MacnicaDHW e mais algumas horas gastas aqui em casa para assimilar aquilo tudo, posso dizer que com os signais probes e signal taps da Altera o trabalho se torna muito produtivo.

Você utiliza o IP Catalog da Altera e gera o código em VHDL(ou verilog) do componente que você vai utilizar na sua depuração, junto já vem um exemplo de instanciação.
Depois você mapeia os sinais que deseja visualizar para dentro do probe, tal como:

Código: Selecionar todos
   u0 : component source_probes
      port map (
         --source =>, -- sources.source
         probe(0) => bitCount(21),--  => CONNECTED_TO_probe   --  probes.probe
         probe(1) => bitCount(22),
         probe(2) => bitCount(23),
         probe(3) => bitCount(24),
         probe(4) => bitCount(25),
         probe(5) => bitCount(26),
         probe(6) => sw(0),
         probe(7) => sw(1)
      );   


Depois disso, você roda a sintetize do código, abre o signal probe e pronto!

Imagem
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: Depuração.

Mensagempor tcpipchip » 20 Jun 2016 08:15

broken image
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: Depuração.

Mensagempor msamsoniuk » 22 Jun 2016 03:14

eu eu nunca fui muito adepto desses recursos de debug em FPGAs... quando eu comecei a estudar mais a fundo verilog, no http://www.asic-world.com (recomendo fortemente!), eu considerava CPLD, FPGA, ASIC, etc tudo farinha do mesmo saco. eu tambem conversei com muita gente da area de design de circuitos integrados, o que consolidou minha opcao por verilog e acabou me levando a um fluxo de trabalho parecido com este:

Imagem

curiosamente, nao eh o fluxo de trabalho tipico para FPGAs, mas acaba encaixando bem: tal como no caso de um ASIC, eu nao tenho onde testar previamente, pq a placa onde a FPGA vai estar ainda estah em fase de projeto (especificacao, esquematico, layout, encomenda, producao, etc). entao eu sigo aquele fluxo: especificacao de como as coisas deveriam funcionar, projeto de alto nivel (descrevo em verilog o sistema como um todo) e projeto de baixo nivel (descrevo cada sub-sistema logico com detalhes). neste caso, o que eu tenho eh uma simulacao do sistema como um todo em verilog: a logica que vai dentro da FPGA, a logica que vai na placa que contem a FPGA e, eventualmente, as placas que se conectam nessa placa. eventualmente, eu posso ir lah no backplane do sistema e medir sinais, me certificar de que as simulacoes geram sinais identicos. tendo esse nivel de detalhismo, consigo comecar o ciclo do RTL: escrever o codigo que vai dentro da FPGA, testar pontualmente modulo por modulo, fazer a sintese e verificar se tanto a sintese como a simulacao estao de acordo. a ideia eh atingir 100% do objetivo apenas com simulacao, mas note que, embora nao teste a sintese na FPGA, eu costumo vasculhar o que a ferramenta estah gerando a procura de "interpretacoes erroneas". por exemplo, as vezes vc descreve um MUX, mas a ferramenta nao entende como tal pq vc nao ocupou um numero de entradas multiplo de 2^n. vc percebe isso no esquematico da sintese, corrige o codigo, sintetiza e verifica novamente para ver se agora o seu MUX estah lah. enfim, a ideia eh que esse loop continue ateh que as coisas estejam suficientemente boas para funcionar de primeira. no caso de um ASIC, isso eh essencial: custa caro e demora para produzir um prototipo, entao vc tem que garantir que esteja tudo funcionando. no caso de uma FPGA, vc quer garantir que o cara que vai ligar a placa pela primeira vez vai descarregar a FPGA e ela vai funcionar de primeira. claro, atualizar a FPGA eh infinitamente mais simples que um ASIC em caso de falha, mas em um sistema complexo com processador, memorias e N interfaces para dar problema, a FPGA rodar de primeira eh um bonus consideravel.

desta forma, enquanto o pessoal de HW e SW estah feliz debugando seus detalhes especificos, vc comeca a trabalhar em cima do mundo real, ou seja, fora da FPGA, onde os sinais possuem tempo e amplitude reais!

neste caso eu abandono totalmente a simulacao (usada para verificar as entranhas da FPGA) e vou para o osciloscopio, conferir se as coisas estao boas do ponto de vista eletrico. a forma com que trabalho eh bem simples: normalmente eu reservo quatro pinos de GPIO para conectar um osciloscopio e em cada modulo eu reservo 4 sinais para funcoes de debug. essas linhas de debug de cada modulo acabam indo para um MUX no top level que eu posso setar por algum registro, de modo que eu posso selecionar modulo por modulo os 4 sinais de debug que eu escolhi no modulo e observar no osciloscopio. no caso, esse debug eh parte integral do projeto, portanto nao fico com aquele classico risco de "funciona quando o debug estah sintetizado junto e para de funcionar quando retira o debug". e bom, aqui vc percebe que simulacoes sao perfeitas, mas nao sao completas. no caso de um projeto em que colocamos um cluster de DSPs em uma FPGA, conseguimos no maximo simular algo em torno de 1 segundo de operacao. para coisas simples, eh suficiente, mas normalmente nao dah nem para o comeco: problemas criticos podem acontecer depois de horas e horas de perfeita operacao! jah peguei o caso de um ASIC que funcionava perfeitamente por horas e horas, mas sempre gerava um pequeno glitch que fazia o sistema todo parar... demoramos semanas para cercar o problema, mas acabamos pegando o momento exato com um osciloscopio de persistencia infinita. vc pode simular de todo jeito uma FPGA e, do ponto de vista logico, funcionar tudo perfeitamente, daih coloca para funcionar e falha miseravelmente. o problema, quase sempre eh justamente pq os sinais no mundo real possuem tempo e amplitude reais. e para isso vc precisa de um osciloscopio, pq o debug da FPGA soh trabalha com tempo e amplitude discretos.

em uma certa ocasiao eu pensei em usar os recursos de debug da FPGA, pois era um caso em que a funcionalidade de aquisicao de dados discretos era suficiente (operacoes bem comportadas de leitura/escrita), mas rapidamente percebi que era um volume de informacao fora da realidade. bom, o debug da FPGA, na realidade, funciona como uma janela de aquisicao de um osciloscopio: algum evento externo trigga a captura, ele armazena em uma memoria e transfere via JTAG... mas eh meio limitado em termos de capacidade. no caso, eu precisava espiar um barramento de processador em realtime e pelo tempo que demorasse para o sistema subir e comecar a funcionar, ou seja, quase 10 minutos de captura continua! daih eu tirei uma solucao da manga: capturar evento por evento e armazenar em um buffer em alta velocidade. obviamente o buffer eh tao grande quando seria com o mecanismo de debug proprio da FPGA, mas o pulo do gato eh esvaziar o buffer de forma igualmente rapida, enviando os dados para um PC. o recurso de debug da FPGA faz isso via JTAG, mas eu acredito que o software para isso nao esta preparado para trabalhar com um volume gigantesco de informacao e/ou com um taxas de transferencias continuas elevadas. entao eu montei minha propria solucao para transferir quantidades cavalares de dados em alta velocidade para o PC. eu acho que eh uma opcao bem consideravel e escala muito bem, por exemplo, se vc usar uma interface GbE, vc pode capturar barramentos a taxas de 125Mbytes/s! :O

a galera mais antiga, por outro lado, utilizava bastante esse recurso de debug... eu acompanhei os caras mais de perto ano passado e, bom... nao senti muita firmeza.

jah comecou o classico "funciona quando o debug estah sintetizado junto e para de funcionar quando retira o debug". e claro, o pessoal usava VHDL... como usuario de verilog, eu francamente nao boto muita feh que o cara consiga dominar bem todos os aspectos da linguagem, enfim, era evidente que algumas descricoes de alto nivel simplesmente nao produziam codigo e eram silenciosamente ignoradas na sintese. eh facil explicar a diferenca: em verilog vc usa apenas dois tipos (reg e wire) e eles correspondem a entidades fisicas definidas (flip-flops e fios), que se organizam em arrays (registros e barramentos). por outro lado, em VHDL vc pode usar uma infinidade de tipos (inteiro, ponto flutuante, etc) e organizar em uma infinidade de formas (arrays, estruturas, etc). em verilog vc tem que esculpir silicio flip-flop por flip-flop para expressar problemas do mundo real, enquanto que em VHDL vc simplesmente programa e magia gera o hardware. o problema eh quando a magia nao acontece e nada eh gerado! ironicamente, quando vc vai tentar olhar pq nao funciona, vc acaba induzindo a ferramenta da sintese a gerar aquela parte do codigo e as coisas funcionam... daih vc tira o recurso de debug, para de funcionar. e nesse trem tem projetos antigos com todo tipo de defeito: FPGA que para de funcionar quando esquenta, FPGA que para de funcionar quando coloca uma placa do lado, FPGA que para de funcionar quando vc espirra, etc. ter mais recursos, como VHDL fornece, ateh seria legal. mas as limitacoes de sintaxe do verilog sao meio que presas as limitacoes do proprio HW, o que impede de extrapolar alem do que o HW consegue fazer bem... mas daih jah eh assunto para outro dia! hehehe

bom, sao os meus dois centavos sobre o assunto... e olha que eu nem sou muito xiita em termos de simulacao: tem um colega que projetou um DSP integralmente apenas com simulacao e sintese. quer dizer, eu nunca vi ele descarregar o projeto em uma FPGA para ver se funcionava! isso que ele gosta de usar recursos "low-level" obscuros da FPGA que vc tem certeza que nem tem como simular, sem falar nos 10 warnings por linha na hora de fazer o build... mas nao eh que no final das contas funcionou de primeira? eu simplesmente peguei o codigo do DSP, construi as interfaces de IO em volta, usei um generate para criar um cluster com multiplos cores, escrevi um firmare de teste (o assembler para o DSP foi feito em awk e foi testado, imagina soh, apenas na simulacao...), fiz o build da FPGA e bingo: 20 mil MIPS de performance de pico funcionando feito um relogio. se fosse um ASIC, ele tinha acertado no primeiro prototipo! :O
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Re: Depuração.

Mensagempor andre_luis » 22 Jun 2016 08:35

msamsoniuk escreveu:eentao eu sigo aquele fluxo: especificacao de como as coisas deveriam funcionar, projeto de alto nivel (descrevo em verilog o sistema como um todo) e projeto de baixo nivel (descrevo cada sub-sistema logico com detalhes). neste caso, o que eu tenho eh uma simulacao do sistema como um todo em verilog: a logica que vai dentro da FPGA, a logica que vai na placa que contem a FPGA e, eventualmente, as placas que se conectam nessa placa. eventualmente, eu posso ir lah no backplane do sistema e medir sinais, me certificar de que as simulacoes geram sinais identicos.


Se entendi corretamente, esse parece ser realmente o caminho mais inteligente, descrever funcionalmente as interfaces dos blocos em alto-nivel e depois implementar um H/W que vai se virar pra atender áquelas temporizações. Assim já é possivel validar conceitualmente a coisa antes mesmo de ser implementada. É meio que uma abordagem top-down.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Depuração.

Mensagempor msamsoniuk » 25 Jun 2016 02:40

andre_teprom escreveu:
msamsoniuk escreveu:eentao eu sigo aquele fluxo: especificacao de como as coisas deveriam funcionar, projeto de alto nivel (descrevo em verilog o sistema como um todo) e projeto de baixo nivel (descrevo cada sub-sistema logico com detalhes). neste caso, o que eu tenho eh uma simulacao do sistema como um todo em verilog: a logica que vai dentro da FPGA, a logica que vai na placa que contem a FPGA e, eventualmente, as placas que se conectam nessa placa. eventualmente, eu posso ir lah no backplane do sistema e medir sinais, me certificar de que as simulacoes geram sinais identicos.


Se entendi corretamente, esse parece ser realmente o caminho mais inteligente, descrever funcionalmente as interfaces dos blocos em alto-nivel e depois implementar um H/W que vai se virar pra atender áquelas temporizações. Assim já é possivel validar conceitualmente a coisa antes mesmo de ser implementada. É meio que uma abordagem top-down.


bom, os caras que trabalham com ASICs nao possuem a mesma flexibilidade que temos em uma FPGA de reconfigurar a cada reload, entao acredito que as metodologias deles sao inteligentes por necessidade... curiosidades a parte, verificacao eh um termo forte hoje em dia no ambiente de ASICs e a necessidade justamente eh tentar cobrir o maximo possivel de testes antes de encomendar os chips... esse blog tem um exemplo bem didatico disso:

http://whatisverification.blogspot.com. ... birds.html

bom, um fluxograma bem mais complexo eh apresentado nesse mesmo blog:

Imagem

http://whatisverification.blogspot.com. ... -flow.html

note que nem aparece o desenvolvimento... supostamente, o desenvolvimento eh feito em paralelo e ali meio que no fim esse fluxograma encontra o codigo desenvolvido para fazer a verificacao. certa vez, por sinal, ouvi o pessoal comentar que facilmente mais de 2/3 dos custos do projeto de um ASIC sao gastos em verificacao. e pelos aumentos que o cara constatou ali no artigo dele, parece que a verificacao daqui a pouco vai consumir 90% dos recursos (fato: a maioria dos empregos que encontrei por aih na industria de ASICs eh para verificacao)... fico pensando no que seria esse cenario: 1 estagiario escrevendo codigo e 10 caras supervisionando para ver se nao tem bugs! ou ateh um cenario mais extremo: macacos com maquinas de escrever criando codigos randomicos e um exercito de especialistas lendo e tentando encontrar codigos inovadores para design de chips de alta performance! :v
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Re: Depuração.

Mensagempor andre_luis » 25 Jun 2016 15:45

O interessante dessas metodologias de verificação é que aparentemente eles primam também pelo reaprovaitamento, tipo dividindo a coisa em camadas, tal como programando classes em alto-nivel. Não lembro do termo que o pessoal de programação usa, mas é quando se faz um código que ainda que a camada superior e inferior sejam diferentes, a camada do meio pode ser a mesma, e não precisam pagar alguem pra a escrever novamente dedicada para um novo projeto, ou seja, é modulável. É isso que rola também em verificação ? Esse têrmo coverage também tá aparecendo muito por aí...
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Depuração.

Mensagempor msamsoniuk » 25 Jun 2016 17:06

andre_teprom escreveu:O interessante dessas metodologias de verificação é que aparentemente eles primam também pelo reaprovaitamento, tipo dividindo a coisa em camadas, tal como programando classes em alto-nivel. Não lembro do termo que o pessoal de programação usa, mas é quando se faz um código que ainda que a camada superior e inferior sejam diferentes, a camada do meio pode ser a mesma, e não precisam pagar alguem pra a escrever novamente dedicada para um novo projeto, ou seja, é modulável. É isso que rola também em verificação ? Esse têrmo coverage também tá aparecendo muito por aí...


entao, uma serie de novos conceitos apareceu nos ultimos anos depois da introducao de systemverilog no mercado. aqui tem uma boa introducao sobre coverage:

http://www.asic-world.com/systemverilog/coverage.html

de acordo com a propria historia de systemverilog, a ideia era justamente adicionar ao verilog uma capacidade extra de verificacao em nivel de sistema, permitindo simulacoes e verificacoes mais avancadas. se vc observar a evolucao de verilog e systemverilog, eh facil perceber o aumento de potencial com a nova linguagem:

Imagem

parece interessamte, mas infelizmente ainda tenho que trabalhar com FPGAs de geracoes passadas e ferramentas que ainda nao suportam systemverilog... entao eu tento, meio que no braco, aplicar alguns conceitos em verilog mesmo.

daih uma coisa que eu jah vi utilizarem em VHDL e que provavelmente usam muito em systemverilog eh encapsular interfaces em struturas. bom, como nao uso a fundo, a partir daqui eh um tanto quanto especulativo: estou partindo do principio que systemverilog suporta alguma coisa de C, mas nao vou me atentar efetivamente se a sintaxe estah correta ou nao, apenas ilustrar o conceito que eu pensei... por exemplo, suponha que vc tem um modulo que tem uma interface com o host e uma HDLC. em verilog vc vai simplesmente fazer algo assim:

Código: Selecionar todos
module(
  input CLK,
  input RES,
  input RD,
  input WR
  input CS,
  input [3:0] ADDR,
  input [7:0] DATA,
  output [7:0] DATO,
  input CLK,
  input RX,
  output TX
);


tem um erro proposital: tem 2x o CLK. eh que a interface com o host tem um CLK e o HDLC tambem tem um CLK... bom, vc iria mudar o nome e usar nomes criativos, como HCLK para o host clock. ou entao HCLK para HDLC clock... nao eh tao simples. digamos que fosse possivel definir globalmente:

Código: Selecionar todos
struct {
  input CLK,
  input RES,
  input RD,
  input WR
  input CS,
  input [3:0] ADDR,
  input [7:0] DATA,
  output [7:0] DATO
} BUS_IF;

struct {
  input CLK,
  input RX,
  output TX
} HDLC_IF


assim, em todas as instancias do tal bus, vc poderia usar:

Código: Selecionar todos
module(
  struct BUS_IF bus,
  struct HDLC_IF hdlc
);

  assign bus.DATO = MEM[bus.ADDR];

...


me parece que fica bem mais organizado e limpo! em essencia, no silicio, nao muda absolutamente nada: eh apenas sintaxe. mas imagine a organizacao e limpeza na hora de construir um modulo complexo que contem interfaces PCI-express, RGMII, etc. vc faz o include de um rgmii.v com a definicao da estrutura e tem garantia de que aquela estrutura de fios da interface vai se preservar em todo o projeto, por mais complexo que ele seja!

eu vi um exemplo mais ou menos assim aqui:

https://cseweb.ucsd.edu/classes/sp11/cs ... rilog.html

mas eu nao investiguei muito a fundo... sem ter ferramenta para escrever o codigo e sintetizar para ver o que aparece, fica dificil prestar atencao nos detalhes... mas eh questao de tempo! :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04


Voltar para Verilog, VHDL, SystemC ( PLAs, CPLDs, FPGAs, etc... )

Quem está online

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

x