• Nenhum resultado encontrado

Um aspecto crítico da verificação funcional é a detecção de seu término. Dado que a compa- ração dos resultados do Modelo de Referência e do DUV é realizada através de simulação, para a grande maioria dos sistemas atuais, não é possível fazer com que todos os cenários possíveis do projeto sejam exercitados em um tempo aceitável. O que se costuma fazer é empregar uma técnica para detectar se o projeto foi suficientemente exercitado durante a verificação funcional. Esta técnica é conhecida como análise de cobertura.

A análise de cobertura é uma técnica usada para medir o progresso da verificação em relação a algum conjunto de critérios. A análise de cobertura pode ser compreendida como sendo um conjunto de metas que devem ser atingidas durante a verificação funcional. Essas metas podem ser especificadas em função de diversos critérios. De acordo com esses crité- rios, podemos classificar dois tipos de cobertura principais: análise de cobertura de código e

análise de cobertura funcional.

2.3.1

Análise de Cobertura de Código

Para a cobertura de código, a ferramenta de análise de cobertura vai reportar quais partes do código foram executadas e quais não foram durante a simulação. Este tipo de análise é importante por revelar ao engenheiro se existe alguma parte do projeto que não foi exercitada. A existência de partes do projeto que não foram exercitadas é ruim porque elas podem conter algum erro. Este tipo de cobertura requer algum tipo de instrumentação do código. Esta instrumentação consiste de pontos de observação no código para registrar se tal parte foi exercitada de fato. As seguintes métricas podem ser usadas para este tipo de cobertura: linhas de código, caminhos de execução e expressões.

Na cobertura de linhas de código, a ferramenta mede quais linhas exatamente foram executadas e quais não foram. Para se alcançar 100% de cobertura de código é necessário compreender quais condições lógicas devem ser satisfeitas para se alcançar as linhas desco- bertas. Contudo, é muito comum que a codificação defensiva leve à produção de blocos de comandos que nunca são executados, fazendo com que a cobertura total nunca seja alcan- çada.

A cobertura de caminhos de execução mede as possíveis seqüências de linha de comando que podem ser executadas em um projeto. A existência de comandos de fluxo de controle, tais como estruturas condicionais do tipo if then else, faz com que existam vários caminhos de execução. Por exemplo, temos um caminho em que o bloco then é executado e temos outro referente ao bloco else. Este tipo de cobertura é bem mais precisa que a cobertura de linhas de código, pois um erro pode ser revelado somente quando uma seqüência específica ocorre. Em contrapartida, o número de seqüências cresce exponencialmente em função do número de comandos de fluxo de controle.

Ainda mais precisa do que a cobertura de caminhos de execução, a cobertura de expres- sões analisa as diversas instâncias que um caminho de execução pode ocorrer. Por exemplo, a condição de um bloco if pode conter uma expressão com o operador lógico ou. Natural- mente, esta expressão pode ser satisfeita quando um dos operandos for verdadeiro, fazendo com que existam pelo menos três instâncias do mesmo caminho de execução.

2.3.2

Análise de Cobertura Funcional

A análise de cobertura funcional mede o quanto da especificação original foi exercitado. Ela pode analisar, por exemplo, o nível de ocupação de um buffer, a quantidade de pacotes en- viados, requisição de barramento etc. Assim, a cobertura funcional está focada no propósito da função implementada enquanto a cobertura de código está focada na execução do código. A cobertura funcional, portanto, depende do domínio da aplicação. Na prática, isto sig- nifica que a especificação dos critérios de cobertura deve ser realizada manualmente pelo engenheiro de verificação, isto é, os critérios de cobertura não podem ser extraídos automa- ticamente do código em linguagem de descrição do hardware. Assim como na análise de cobertura de código, os valores das execuções são extraídos durante a simulação e armaze- nados em uma base de dados. A partir dessa base, a análise de cobertura ocorre propriamente em função do que foi especificado. Os critérios comumente utilizados para cobertura funci- onal são os seguintes: cobertura de valores escalares individuais e cobertura cruzada.

Na cobertura de valores escalares, o engenheiro especifica o conjunto de valores rele- vantes que devem ser observados na verificação, seja como estímulos de entrada, seja como resultados de saída. Exemplos de valores escalares utilizados para este tipo de cobertura são: tamanho de pacote, ocupação de buffer, acesso a barramento etc. É uma tarefa com- plexa especificar e medir cobertura desta natureza, sendo que as medições chegam bem perto de 100% na maioria das vezes [19; 88]. É importante que fique claro que 100% de cober- tura não garante que o projeto está isento de erros. Isto que significa que todos os critérios especificados foram totalmente satisfeitos.

A cobertura cruzada de valores1 mede a ocorrência da combinação de diversos valores.

Ela é útil para especificar propriedades do tipo: “um pacote corrompido foi inserido em todas as portas?” ou “todos os buffers ficaram preenchidos ao mesmo tempo? ”. A implementação de cobertura cruzada segue o mesmo princípio da cobertura de valores escalares, a diferença é que na cobertura cruzada várias valores são coletados ao mesmo tempo.