História e Evolução do SystemVerilog na Indústria Eletrônica
Tutorial Prático: Vectores e Arrays em SystemVerilog
Neste tutorial, vamos explorar como lidar com vetores e arrays em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital., abordando três tipos principais:
- Tamanho Fixo
- Dinâmicos
- Associativos
Este tema é fundamental para quem deseja construir designs ou realizar verificações em níveis mais avançados dentro do SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital., pois possibilita organizar dados e controlar sua alocação de forma versátil.
Conceitos Básicos🔗
No SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital., um array nada mais é do que uma sequência de elementos que podem ser acessados por um índice. Dependendo do tipo de array, esse índice pode ser:
- Um intervalo fixo (no caso de arrays de tamanho fixo).
- Uma faixa de valores que se altera durante a execução (no caso de arrays dinâmicos
Principais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions.).
- Ou até mesmo um índice de qualquer tipo, como inteiros, strings ou enumeradores (no caso de arrays associativos
Principais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions.).
Há, ainda, uma distinção importante em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. entre arrays empacotados (packed) e arrays desempacotados (unpacked). Em geral:
- Arrays empacotados (ou “packed”) são usados para representar conjuntos de bits
Sistemas de Numeração e Conversão: Binário, Decimal, Octal e HexadecimalAprenda conversões de sistemas numéricos em eletrônica digital. Descubra métodos para converter entre decimal, binário, octal e hexadecimal com exemplos. (típico para sinais e barramentos).
- Arrays desempacotados (ou “unpacked”) são usados para organização de dados em estrutura
Estruturas e Uniões: Organizando Dados ComplexosAprenda como aplicar estruturas e uniões em SystemVerilog. Descubra a diferença entre packed e unpacked com exemplos práticos e dicas para um design otimizado. mais geral (por exemplo, vetores de registros, vetores com tamanho variável, etc.).
Para fins deste tutorial, vamos nos concentrar principalmente nos arrays “desempacotados”, pois eles encapsulam melhor os conceitos de tamanho fixo, dinâmicos e associativos.
Arrays de Tamanho Fixo🔗
Declaração Básica
Os arrays desempacotados de tamanho fixo são declarados especificando-se o número de elementos entre colchetes após o tipo. Por exemplo:
// Array de 8 elementos, cada um do tipo 'logic'
logic [7:0] meu_array_fixo [0:7];
Nesse caso:
logic
indica que cada elemento do array é um vetor de 8 bitsTipos de Dados Básicos: Bit, Logic e Reg em DetalhesDescubra as diferenças entre os tipos de dados Bit, Logic e Reg em SystemVerilog neste tutorial prático, com dicas de uso e melhores práticas. [7:0]
Sistemas de Numeração e Conversão: Binário, Decimal, Octal e HexadecimalAprenda conversões de sistemas numéricos em eletrônica digital. Descubra métodos para converter entre decimal, binário, octal e hexadecimal com exemplos..
[0:7]
indica que existem 8 posições (índices de 0 a 7) no array desempacotado.
Ou seja, temos um array com 8 posições, e cada posição possui um vetor de 8 bitsSistemas de Numeração e Conversão: Binário, Decimal, Octal e HexadecimalAprenda conversões de sistemas numéricos em eletrônica digital. Descubra métodos para converter entre decimal, binário, octal e hexadecimal com exemplos..
Acesso e Atribuição
Para acessar ou atribuir valores a um elemento específico do array:
meu_array_fixo[0] = 8'b1010_1010; // Atribui valor ao primeiro elemento
meu_array_fixo[3] = 8'd255; // Atribui valor decimal 255 ao quarto elemento
Varrendo Arrays
O SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. permite a varredura de arrays por meio de loops clássicos (
for
) ou do novo loop foreach
. Exemplo com foreach
:
foreach (meu_array_fixo[i]) begin
meu_array_fixo[i] = i; // Atribui o valor de 'i' a cada posição
end
Esse recurso facilita percorrer todos os índices de um array sem precisar controlar manualmente o valor do contadorRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasAprenda as diferenças entre contadores assíncronos e síncronos, e descubra como utilizar sequências personalizadas para otimizar sistemas digitais..
Arrays Dinâmicos🔗
Os arrays dinâmicosPrincipais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions. possuem tamanho variável, permitindo redimensionar a quantidade de elementos durante a simulação. Eles são declarados usando
[]
sem especificar um intervalo fixo:
int dinamico_array[]; // Declarando array dinâmico de inteiros
Alocação de Memória
Para que o array possa ser utilizado, você deve alocar memória por meio do métodoMétodos e Sobrecarga: Técnicas para Maior FlexibilidadeDescubra como métodos, tasks, functions e sobrecarga em SystemVerilog otimizam a programação orientada a objetos com exemplos práticos e dicas de boas práticas.
new
:
dinamico_array = new[10];
// Agora 'dinamico_array' possui 10 elementos, de 0 a 9
Métodos Úteis
Arrays dinâmicosPrincipais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions. possuem métodos integrados, como:
- push_back: Insere um elemento no final do array.
- push_front: Insere um elemento no início do array.
- delete: Remove todos os elementos (ou um elemento específico, dependendo da sintaxe).
Exemplo:
dinamico_array.push_back(100); // Adiciona um elemento ao final
dinamico_array.push_front(200); // Adiciona um elemento no início
dinamico_array.delete(); // Esvazia completamente o array
Redimensionamento
Você pode redimensionar o array simplesmente fazendo uma nova alocação:
// Redimensionando para 20 elementos
dinamico_array = new[20];
Arrays Associativos🔗
Os arrays associativosPrincipais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions. permitem usar qualquer tipo de dado como índice, oferecendo muita flexibilidade. Esses arrays são úteis quando não sabemos antecipadamente quais índices serão acessados ou quando o intervalo de índices pode ser muito grande.
Declaração
Declara-se um array associativoPrincipais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions. usando os colchetes com o tipo do índice. Por exemplo:
int assoc_array[string]; // Índice do tipo string
int assoc_array2[int]; // Índice do tipo inteiro
logic [7:0] assoc_bits[bit]; // Índice do tipo 'bit' (0 ou 1)
O exemplo acima mostra diferentes tipos possíveis de índice. Você pode escolher o que melhor se ajustar ao seu projetoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital..
Inserção e Acesso
A inserção e o acesso aos elementos funcionam de forma muito prática:
assoc_array["um"] = 1;
assoc_array["dois"] = 2;
// Atribuindo valor de 'assoc_array["um"]' a uma variável
int valor_um = assoc_array["um"];
Caso tente acessar um índice que não existe, não ocorrerá erro imediato; o elemento retornará o valor default se não tiver sido atribuído previamente.
Métodos Importantes
Arrays associativosPrincipais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions. em SystemVerilog oferecem métodos para facilitar a manipulação:
- exists(index): Retorna verdadeiro se o índice existir no array.
- delete(index): Remove o elemento do array para aquele índice.
- size(): Retorna o número de elementos atualmente armazenados.
Exemplo:
if (assoc_array.exists("um")) begin
assoc_array.delete("um");
end
int tamanho_atual = assoc_array.size();
Dicas e Boas Práticas🔗
1. Escolha o tipo de array corretamente:
- Se você já sabe o tamanho fixo, prefira arrays de tamanho fixo para facilitar a síntese e a organização do código.
- Se o tamanho pode variar ao longo da simulação, use arrays dinâmicos
Principais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions..
- Se o índice for uma informação fora do padrão (por exemplo, strings ou valores esparsos), arrays associativos
Principais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions. são a melhor escolha.
2. Use loopsLei de Ohm e Leis de Kirchhoff: Aplicações PráticasExplore os fundamentos da eletricidade: aprenda a aplicar a Lei de Ohm e as Leis de Kirchhoff para analisar circuitos simples e complexos com clareza.
foreach
: Simplifica a escrita de código, especialmente quando não se sabe o tamanho do array ou se o índice não é sequencial.
3. Gerencie memória e índices com cuidado: Em arrays dinâmicos, sempre crie ou redimensione antes de acessar posições não existentes. Em arrays associativosPrincipais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions., verifique se o índice existe para evitar comportamentos indesejados.
4. Evite confusões com “packed” e “unpacked”:
- “Packed” é muito usado para declaração de vetores de bits
Sistemas de Numeração e Conversão: Binário, Decimal, Octal e HexadecimalAprenda conversões de sistemas numéricos em eletrônica digital. Descubra métodos para converter entre decimal, binário, octal e hexadecimal com exemplos. que representam um sinal ou barramento.
- “Unpacked” é mais adequado quando precisa de vetores de acesso (como listas, tabelas etc.).
5. Documente bem: Sempre que possível, adicione comentários e definições claras, pois o uso avançado de arrays pode se tornar confuso em projetosIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. maiores.
Exemplos Práticos Complementares🔗
Exemplo: Uso combinado de arrays fixosTipos de Resistores: Fixo, Variável, SMD e MaisExplore os principais tipos de resistores, desde fixos até SMD, e aprenda como escolher o ideal para otimizar a segurança e desempenho dos seus circuitos. e dinâmicos
module exemplo_arrays;
// Array de tamanho fixo
logic [7:0] buffer [0:3];
// Array dinâmico
int lista[];
initial begin
// Inicialização de array fixo
foreach (buffer[i]) begin
buffer[i] = i * 10;
end
// Criação e uso de array dinâmico
lista = new[3];
lista[0] = 100;
lista[1] = 200;
lista[2] = 300;
lista.push_back(400); // Agora lista tem 4 elementos
// Exibição de valores para verificação
$display("Buffer fixo: %0d, %0d, %0d, %0d",
buffer[0], buffer[1], buffer[2], buffer[3]);
$display("Lista dinâmica: %0d, %0d, %0d, %0d",
lista[0], lista[1], lista[2], lista[3]);
end
endmodule
Exemplo: Manipulação de array associativoPrincipais Recursos da Linguagem: O que Torna o SystemVerilog PoderosoDescubra como o SystemVerilog integra design e verificação de hardware, com recursos como tipos estendidos, arrays dinâmicos, interfaces, OOP e assertions. com índice do tipo inteiro
module exemplo_array_associativo;
// Array associativo que mapeia inteiro -> inteiro
int map_inteiros[int];
initial begin
// Inserindo elementos
map_inteiros[10] = 100;
map_inteiros[20] = 200;
// Verificando existência
if (map_inteiros.exists(10)) begin
$display("Índice 10 existe com valor: %0d", map_inteiros[10]);
end
// Removendo elemento
map_inteiros.delete(10);
// Tamanho atual
$display("Tamanho do array associativo: %0d", map_inteiros.size());
end
endmodule
Conclusão🔗
Neste tutorial, discutimos como declarar e utilizar arrays de tamanho fixo, dinâmicos e associativos em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital.. Cada tipo de array oferece vantagens em cenários específicos:
- Tamanho Fixo: Boa escolha quando o número de elementos é conhecido e não varia durante o projeto
Introdução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital..
- Dinâmicos: Ideal para situações em que o número de elementos pode mudar ao longo da simulação.
- Associativos: São a opção mais flexível, pois permitem qualquer tipo (ou range amplo) de índice.
À medida que você pratica o uso desses recursos, ficará mais claro qual array é mais apropriado para cada solução de design ou verificação. Tenha em mente as boas práticas: declarar corretamente, gerenciar memória quando precisar e sempre documentar bem o código. Assim, você conseguirá tirar o máximo proveito dos arrays em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital..
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- Cursos gratuitos sobre SystemVerilog, focados em embarcados e verificação: www.embarcados.com.br/cursos-gratis-sobre-systemverilog/
- Livro sobre SystemVerilog, abordando design usando modelagem de hardware: www.amazon.com.br/SystemVerilog-Design-Using-Hardware-Modeling/dp/0387364943
- Recursos e guias para aprendizado e aplicação de SystemVerilog em projetos de design e verificação: www.systemverilog.io
- Tutoriais detalhados e exemplos práticos sobre SystemVerilog para design e verificação ASIC: www.asic-world.com/systemverilog/
- Tutorial abrangente sobre SystemVerilog, cobrindo desde conceitos básicos até tópicos avançados: www.chipverify.com/systemverilog/systemverilog-tutorial