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çãoIntroduçã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çãoIntroduçã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çãoIntroduçã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:

Há, ainda, uma distinção importante em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntroduçã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:

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:

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 HexadecimalSistemas 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çãoIntroduçã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 personalizadasRegistradores 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 PoderosoPrincipais 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 FlexibilidadeMé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 PoderosoPrincipais 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 PoderosoPrincipais 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 PoderosoPrincipais 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çãoIntroduçã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 PoderosoPrincipais 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:

2. Use loopsLei de Ohm e Leis de Kirchhoff: Aplicações PráticasLei 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 PoderosoPrincipais 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”:

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çãoIntroduçã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 MaisTipos 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 PoderosoPrincipais 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çãoIntroduçã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:

À 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çãoIntroduçã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🔗

Compartilhar artigo