Tutorial Completo de Strings em SystemVerilog: Guia Prático

As strings são elementos fundamentais em diversas linguagens de programação, e 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. não é diferente. Elas permitem o armazenamento e a manipulação de texto, sendo úteis tanto para exibição de mensagens quanto para registro de dados e verificaçãoIntroduçã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. de condições. Neste tutorial, abordaremos os conceitos essenciais de strings 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., como declarar, inicializar, manipular e aplicar boas práticas para garantir eficiência e clareza de código.

Conceitos Básicos sobre Strings🔗

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., a palavra-chave string representa um tipo de dado dinâmico para armazenar sequências de caracteres (ASCIISistemas de Numeração e Códigos: Códigos digitais: BCD, Gray, ASCIISistemas de Numeração e Códigos: Códigos digitais: BCD, Gray, ASCIIDescubra como os códigos BCD, Gray e ASCII revolucionam a eletrônica digital, facilitando o controle, a transmissão de dados e a exibição em displays. ou Unicode). Algumas características importantes:

  • O tamanho da string é redimensionado automaticamente conforme o conteúdo.
  • É possível fazer concatenação e outras manipulações de forma relativamente simples.
  • Pode ser usada tanto em design code (com restrições para síntese) quanto em testbenches, onde é mais comum.

Exemplo de declaração simples:

string saudacao;
initial begin
    saudacao = "Olá, SystemVerilog!";
    $display("Mensagem: %s", saudacao);
end

No exemplo acima, a variável saudacao é definida como string, e em seguida recebe uma atribuição direta do texto "Olá, 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.!". Ao exibir a mensagem, utilizamos o formato %s dentro do $display.

Declaração e Inicialização de Strings🔗

Existem algumas maneiras de começar a trabalhar com strings 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.. A forma direta de declaração é simplesmente definir uma variável do tipo string e atribuir-lhe um valor:

string texto = "Exemplo de uso de strings";

É possível também declarar primeiro e atribuir depois:

string aviso;
initial aviso = "Cuidado: Dados fora de faixa!";

Caso deseje iniciar a variável sem texto, basta declarar e não atribuir nada. A string passa a ter tamanho zero até receber algum valor.

Operações Comuns com Strings🔗

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. oferece diversas funções e métodos de manipulação de strings. Abaixo, apresentamos algumas das principais:

Função/OperaçãoDescriçãoExemplo de Uso
len()Retorna o comprimento (tamanho) da stringtexto.len()
to_upper()Converte todos os caracteres para maiúsculastexto.to_upper()
to_lower()Converte todos os caracteres para minúsculastexto.to_lower()
compare(...)Compara duas strings (retorna 0 se iguais)texto.compare("Hello")
substr(...)Retorna parte da string (substring) a partir de um índicetexto.substr(0, 4)
itoa(...)Converte um valor inteiro (int) em stringtexto.itoa(255, DEC)
utoa(...)Converte um valor inteiro sem sinal (uint) em stringtexto.utoa(1234, HEX)
atoul(...)Converte string em valor longint sem sinalvalor = texto.atoul(DEC);
append(...)Concatena uma string ou valor no final da string principaltexto.append("_continuação");

Vale lembrar que essas funçõesMé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. podem variar conforme a implementação e a ferramenta utilizada. Sempre consulte a documentação de sua toolchain para detalhes exatos.

Exemplos de Uso

Comprimento e Concatenação

string textoA = "Hello";
string textoB = "World";
string resultado;
initial begin
    resultado = textoA + " " + textoB;
    $display("Resultado: %s, Tamanho: %0d", resultado, resultado.len());
    // Exibirá: Resultado: Hello World, Tamanho: 11
end

No exemplo, realizamos a concatenação de duas strings (textoA + " " + textoB) e, em seguida, mostramos o conteúdo final e seu tamanho (11 caracteres).

Alterando Maiúsculas e Minúsculas

string original = "SystemVerilog";
string modificado;
initial begin
    modificado = original.to_upper();
    $display("Original: %s | Maiúsculas: %s", original, modificado);
    modificado = original.to_lower();
    $display("Minúsculas: %s", modificado);
end

Comparação de Strings

string senhaCerta = "abc123";
string tentativa  = "abc123";
initial begin
    if (senhaCerta.compare(tentativa) == 0) begin
        $display("Acesso permitido");
    end else begin
        $display("Acesso negado");
    end
end

Caso as strings sejam iguais (compare retornar 0), exibimos “Acesso permitido”.

Funções de Formatação e Conversão🔗

Para casos em que é preciso converter valores numéricos para texto, ou vice-versa, podemos empregar:

Exemplo com $sformatf:

int valor = 42;
string mensagem;
initial begin
    mensagem = $sformatf("Valor em decimal: %0d | em hex: %0h", valor, valor);
    $display("%s", mensagem);
end

Boas Práticas de Uso de Strings🔗

1. Evitar uso excessivo de strings em código sintetizável: Apesar de strings serem suportadas 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., muitos recursos podem não ser compatíveis na síntese para FPGAsIntrodução a Dispositivos Lógicos Programáveis: CPLD e FPGAIntrodução a Dispositivos Lógicos Programáveis: CPLD e FPGAExplore os Dispositivos Lógicos Programáveis: compreenda CPLDs e FPGAs, suas vantagens e aplicações para projetos digitais modernos e eficientes. ou ASICs. Sempre cheque se sua toolchain suporta string em blocos de hardware.

2. Uso controlado em rotinas de verificaçãoIntroduçã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.: Em testbenches e métodos de verificaçãoIntroduçã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., strings são muito úteis para logs, mensagens de alerta e formatação de dados de monitoramento.

3. Padronizar formatação: Utilizar métodosMé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. como $display ou $sformatf de forma padronizada, para manter a consistência no 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..

4. Documentar manipulações complexas: Caso sejam necessários cortes de substring, conversão repetida de valores ou comparação com diversas variáveisMapas de Karnaugh: Otimização de Circuitos e Minimização de FunçõesMapas de Karnaugh: Otimização de Circuitos e Minimização de FunçõesDescubra como os Mapas de Karnaugh simplificam expressões lógicas, otimizando circuitos digitais e facilitando o projeto em eletrônica digital., documente de forma clara para facilitar a manutenção.

5. Tamanho e desempenho: Ao lidar com strings muito longas ou concatenadas repetidamente, considere métodosMé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. de manipulação eficientes para evitar consumo desnecessário de memória e tempo de simulação.

Exercício Prático Sugerido🔗

Para reforçar o aprendizado, implemente um pequeno testbench que faça:

1. Leitura de uma string de entrada (pode ser um nome de usuário).

2. Comparação com uma lista de nomes válidos, armazenada em um array de strings.

3. Exibição de mensagem adequada (“Usuário encontrado” ou “Usuário inválido”).

4. Conversão de um valor numérico (por exemplo, um código de acesso) para string e concatenação a uma mensagem de log.

Exemplo simplificado de como armazenar strings em um array:

string usuariosValidos[3] = '{
    "Alice",
    "Bob",
    "Carol"
};
string nomeEntrada = "Bob";
int   i;
initial begin
    for (i = 0; i < 3; i++) begin
        if (usuariosValidos[i].compare(nomeEntrada) == 0) begin
            $display("Usuário encontrado: %s", nomeEntrada);
            disable for;
        end
    end
end

Conclusão🔗

O uso de strings 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. traz praticidade e clareza para o desenvolvimento, principalmente em rotinas de verificaçãoIntroduçã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. e debug. Ainda que tenham algumas limitações no que diz respeito ao código sintetizável, são ferramentas poderosas para lidar com mensagens, formatação de dados e manipulação textual durante testes. Dominar suas funcionalidades - como comparação, conversão e formatação - torna o processo de desenvolvimento mais eficiente e organizado, além de favorecer a criação de testbenches bem estruturados.

Referência Rápida:

Com estes recursos, você está pronto para manipular texto de forma mais eficiente em seus projetos 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