Domine Herança e Polimorfismo em SystemVerilog OOP

Bem-vindo(a) a este tutorial que aborda herança e polimorfismo 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.. Esses conceitos são fundamentais para o paradigma de Orientação a Objetos, pois permitem reutilizar, especializar e expandir funcionalidades de classes já existentes, promovendo a criação de códigos mais limpos, organizados e flexíveis. Ao final deste estudo, você entenderá como aproveitar esses recursos para tornar 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. mais poderosos e eficientes.

Conceito de Herança🔗

A herança é um mecanismo que possibilita a criação de novas classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. (chamadas de classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. derivadas ou subclasses) a partir de classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. já existentes (chamadas de classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código.-base ou superclasses). Assim, todo o conjunto de atributos e 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. da classe-base pode ser aproveitado diretamente na classe derivada, que ainda tem a liberdade de adicionar ou modificar comportamentos conforme necessário.

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 herança entre classes é indicada pela palavra-chave extends. A sintaxe básica é:

class ClasseBase;
  // Atributos e métodos da classe-base
endclass
class ClasseDerivada extends ClasseBase;
  // Atributos e métodos adicionais ou sobrescritos
endclass

Vantagens da Herança

1. Reutilização de Código: Permite criar classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. derivadas que aproveitam o que já foi definido na classe-base, reduzindo duplicações.

2. Facilidade de Manutenção: Alterações na classe-base se refletem automaticamente nas classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. derivadas.

3. Extensibilidade: Novas funcionalidades podem ser adicionadas sem modificar diretamente o código da classeClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código.-base.

Níveis de Visibilidade

Como em outras linguagens orientadas a objetos, 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 definir níveis de visibilidade para atributos e 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.:

Esses níveis são importantes para garantir o encapsulamentoEncapsulamento e Interfaces: Boas Práticas de DesignEncapsulamento e Interfaces: Boas Práticas de DesignAprenda como encapsular dados e comportamentos em SystemVerilog com interfaces e orientações a objetos para projetos seguros e fáceis de manter. e o design robusto do seu código.

Exemplo de Herança🔗

Para ilustrar, vejamos um exemplo simples. Suponha que temos uma classeClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código.-base que representa um registradorContadores e Registradores: organização e aplicação em sistemas digitaisContadores e Registradores: organização e aplicação em sistemas digitaisDescubra como contadores e registradores são essenciais na organização e manipulação de dados em circuitos digitais, fundamentais para a computação moderna. genérico em um design:

class RegBase;
  protected bit [31:0] data;
  // Construtor
  function new(bit [31:0] initial_value = 0);
    this.data = initial_value;
  endfunction
  // Método para ler o valor
  function bit [31:0] read();
    return data;
  endfunction
  // Método para escrever no registrador
  function void write(bit [31:0] new_value);
    this.data = new_value;
  endfunction
endclass

Agora, criamos uma classeClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. derivada que estende essa funcionalidade ao incorporar, por exemplo, um 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. de escritas. Observe:

class RegWithCounter extends RegBase;
  protected int write_count;
  // Construtor
  function new(bit [31:0] initial_value = 0);
    super.new(initial_value);
    write_count = 0;
  endfunction
  // Sobrescrevendo o método write
  function void write(bit [31:0] new_value);
    // Chamando implementação original
    super.write(new_value);
    // Incrementa o contador de escritas
    write_count++;
  endfunction
  // Método para ler contagem de escritas
  function int get_write_count();
    return write_count;
  endfunction
endclass

No exemplo acima:

1. Extensão da ClasseClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código.: RegWithCounter extends RegBase aproveita todos os 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 RegBase.

2. Construtor da Subclasse: Chama super.new(initial_value) para usar o construtor da classeClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código.-base.

3. Sobrescrita de 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.: function void write(...) redefinido para contar cada operação de escrita.

4. Chamada ao super: Utilizamos super.write(...) para que a funcionalidade original seja executada, preservando o comportamento base.

Dica: Sempre que sobrescrever um método, certifique-se de chamar super caso deseje manter a lógica herdada. Caso contrário, a implementação anterior será completamente substituída.

Conceito de Polimorfismo🔗

O polimorfismo é a capacidade de uma mesma referência de classeClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. se comportar de formas diferentes dependendo da instância real a que esteja associada. Em termos práticos, significa que um método pode ter implementações distintas em classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. derivadas e, quando o método for acionado, o comportamento correto será invocado automaticamente de acordo com a instância real.

Métodos Virtuais

Para que o polimorfismo funcione corretamente, os 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. que podem ser sobrescritos devem ser declarados como virtual. Dessa forma, quando chamamos um método a partir de um ponteiro ou referência genérica, 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. sabe que deve procurar a implementação mais específica possível.

Exemplo:

class MultiReg;
  virtual function void do_something();
    $display("Fazendo algo na classe-base MultiReg");
  endfunction
endclass
class SpecialReg extends MultiReg;
  // Sobrescrevendo método, utilizado polimorfismo
  virtual function void do_something();
    $display("Fazendo algo específico na classe derivada SpecialReg");
  endfunction
endclass

Quando escrevemos código como:

MultiReg regA;
regA = new; // Instância de MultiReg
regA.do_something(); // Chama método da classe-base
regA = new SpecialReg(); // Instância polimórfica
regA.do_something(); // Chama método sobrescrito, da classe derivada

O resultado será:

1. "Fazendo algo na classeClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código.-base MultiReg"

2. "Fazendo algo específico na classeClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. derivada SpecialReg"

Por isso dizemos que a chamada de 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. é polimórfica – depende da instância real que está alocada no momento, mesmo que seja acessada através de um ponteiro ou referência da classeClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código.-base.

Comparação entre Herança e Polimorfismo🔗

ConceitoDescriçãoExemplo Prático
HerançaReutilizar e especializar uma classe existente.Criar uma classe derivada que extenda a funcionalidade de um registro base.
PolimorfismoPermitir que métodos sobrescritos sejam chamados de forma diferente dependendo da instância.Ter um método do_something() que se comporta de maneira distinta em cada classe derivada.

Como se vê, herança e polimorfismo frequentemente andam juntos, pois o polimorfismo depende de herança para possibilitar a sobrescrita de 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..

Aplicações Práticas em SystemVerilog🔗

No contexto 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. hardware, herança e polimorfismo são amplamente empregados para:

1. Criação de Testes Genéricos: Uma classe-base define a estruturaEstruturas e Uniões: Organizando Dados ComplexosEstruturas 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. geral de um teste, enquanto subclasses especializam o comportamento para cenários específicos.

2. Componentes Customizados de Testbench: É comum termos classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. de driver, monitor, sequencer, entre outros, que estendem classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código.-base provendo maior flexibilidade.

3. Extensão de Funcionalidades por Fases: Quando um fluxo 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. precisa evoluir, novas classes derivadas podem ser adicionadas, aproveitando a base já validada.

Boas Práticas🔗

1. Defina 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. Virtuais: Sempre que um 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. puder ter diferentes implementações em subclasses, utilize virtual.

2. Evite Herança Excessiva: Herança é útil, mas o acoplamentoCapacitores de Acoplamento e Desacoplamento: Princípios e AplicaçõesCapacitores de Acoplamento e Desacoplamento: Princípios e AplicaçõesDescubra como os capacitores de acoplamento e desacoplamento atuam em circuitos, garantindo qualidade no sinal e estabilidade na alimentação. entre classes pode crescer desnecessariamente. Avalie se a composição seria mais adequada em alguns casos.

3. Utilize super com Critério: Reaproveite a implementação da classe-base sempre que ela fizer sentido para a classeClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. derivada.

4. Organize Atributos: Faça uso dos níveis de visibilidade (public, protected, local) para manter seu design limpo e seguro.

5. Implemente Testes de Unidade: Teste tanto a classe-base quanto as classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. derivadas para garantir que o comportamento herdado e sobrescrito funcione como esperado.

Exemplo Completo🔗

Abaixo, segue um exemplo integrando herança e polimorfismo em um cenário retornando dados de sensores fictícios. Teremos uma classe-base para Sensor, com métodos virtuais para leitura de dados, e classesClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código. derivadas especializadas que simularão a leitura de cada tipo de sensor.

class Sensor;
  // Construtor
  function new();
    // Inicialização base se necessário
  endfunction
  // Método virtual para leitura
  virtual function real read_data();
    return 0.0; // Implementação básica ou neutra
  endfunction
endclass
class TempSensor extends Sensor;
  real temperature;
  function new();
    super.new();
    temperature = 25.0; // Valor inicial ou simulado
  endfunction
  // Sobrescrevendo leitura
  virtual function real read_data();
    // Atualiza ou simula leitura de temperatura
    temperature += 0.5;
    return temperature;
  endfunction
endclass
class LightSensor extends Sensor;
  real luminosity;
  function new();
    super.new();
    luminosity = 100.0; // Valor inicial ou simulado
  endfunction
  // Sobrescrevendo leitura
  virtual function real read_data();
    // Atualiza ou simula leitura de luminosidade
    luminosity += 10.0;
    return luminosity;
  endfunction
endclass
program test_sensors;
  Sensor s;
  initial begin
    // Instanciando TempSensor
    s = new TempSensor();
    $display("Leitura de Sensor de Temperatura: %0f", s.read_data());
    // Polimorfismo - mesma referência, outra instância
    s = new LightSensor();
    $display("Leitura de Sensor de Luminosidade: %0f", s.read_data());
  end
endprogram

Esse pequeno testbench demonstra:

Conclusão🔗

Neste tutorial, aprofundamos o uso de herança e polimorfismo 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., dois conceitos cruciais da Orientação a Objetos. Vimos como aproveitar a reutilização de código, sobrescrever métodos para comportamentos específicos e criar estruturas de verificação facilmente estendíveis.

Essas técnicas não apenas tornam seu projeto mais organizado, como também abrem caminho para abordagens de verificação mais robustas. Experimente criar suas próprias hierarquias de classes e aproveite a flexibilidade que o polimorfismo oferece em seus testbenches de 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..

Continue explorando esses recursos e descubra como grandes arquiteturas de verificação podem ser construídas, camada por camada, baseadas em classes genéricas e funcionalidades especializadas!
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