Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

Entendendo e Imprimindo Timescales do Verilog em Qualquer Escopo

Timescale Padrão

Embora módulos Verilog sejam esperados para ter um timescale definido antes do módulo, simuladores podem inserir um timescale padrão. O timescale real que é aplicado em qualquer escopo em uma hierarquia Verilog elaborada pode ser impresso usando a tarefa de sistema $printtimescale que aceita o escopo como argumento.


module tb;
    initial begin
        // Imprimir timescale deste módulo
        $printtimescale(tb);
        // $printtimescale($root);
    end
endmodule

Veja que mesmo embora uma diretiva timescale não foi colocada antes deste módulo, o simulador acabou aplicando um valor de timescale 1ns/1ns.

Log de Simulação

xcelium> run
Time scale of (tb) is 1ns / 1ns
xmsim: *W,RNQUIE: Simulation is complete.

Escopo de Timescale Padrão

Por padrão, uma diretiva timescale colocada em um arquivo é aplicada a todos os módulos que seguem a diretiva até a definição de outra diretiva timescale.


`timescale 1ns/1ps
module tb;
    des m_des();
    alu m_alu();
    initial begin
        $printtimescale(tb);
        $printtimescale(tb.m_alu);
        $printtimescale(tb.m_des);
    end
endmodule

module alu;
endmodule

`timescale 1ns/10ps
module des;
endmodule

No exemplo acima, tb e alu acabam com um timescale de 1ns/1ps enquanto des obtém um timescale de 1ns/10ps por causa da colocação da diretiva antes da definição do módulo des.

Log de Simulação

xcelium> run
Time scale of (tb) is 1ns / 1ps
Time scale of (tb.m_alu) is 1ns / 1ps
Time scale of (tb.m_des) is 1ns / 10ps
xmsim: *W,RNQUIE: Simulation is complete.

Escopo entre Arquivos Verilog

Outros arquivos podem ser incluídos no arquivo atual usando uma diretiva `include que é uma diretiva de pré-processador e faz o compilador colocar o conteúdo do arquivo incluído antes da compilação. Então, isso é equivalente a simplesmente colar todo o conteúdo do outro arquivo neste arquivo principal.


// main.v
`timescale 1ns/1ps
module tb;
    des m_des();
    alu m_alu();
    initial begin
        $printtimescale(tb);
        $printtimescale(tb.m_alu);
        $printtimescale(tb.m_des);
    end
endmodule

`include "file_alu.v"
`include "file_des.v"

// file_alu.v
module alu;
endmodule

// file_des.v
`timescale 1ns/10ps
module des;
endmodule

Veja que os resultados são exatamente os mesmos do exemplo anterior. alu obtém um timescale de 1ns/1ps porque foi a última diretiva que permaneceu válida até o compilador encontrar a definição de alu apesar de colocá-lo em um arquivo diferente. des obtém um timescale de 1ns/10ps porque a diretiva foi substituída antes de sua definição.

Log de Simulação

xcelium> run
Time scale of (tb) is 1ns / 1ps
Time scale of (tb.m_alu) is 1ns / 1ps
Time scale of (tb.m_des) is 1ns / 10ps
xmsim: *W,RNQUIE: Simulation is complete.

Trocando arquivos pode mudar timescale

A ordem de inclusão de arquivos desempenha um papel importante na redefinição de diretivas timescale, o que é evidente no exemplo abaixo.


// main.v
`timescale 1ns/1ps
module tb;
    des m_des();
    alu m_alu();
    initial begin
        $printtimescale(tb);
        $printtimescale(tb.m_alu);
        $printtimescale(tb.m_des);
    end
endmodule

// NOTA! Ordem de inclusão trocada
`include "file_des.v"
`include "file_alu.v"

// file_alu.v
module alu;
endmodule

// file_des.v
`timescale 1ns/10ps
module des;
endmodule

Veja que o módulo alu agora obtém um timescale de 1ns/10ps.

Log de Simulação

xcelium> run
Time scale of (tb) is 1ns / 1ps
Time scale of (tb.m_alu) is 1ns / 10ps
Time scale of (tb.m_des) is 1ns / 10ps
xmsim: *W,RNQUIE: Simulation is complete.

Esta é uma das razões para ter uma diretiva timescale no topo dos arquivos para que todos os módulos naquele arquivo assumam o timescale correto independentemente de inclusão de arquivos.

No entanto, esta abordagem pode tornar difícil compilar com uma precisão de timescale diferente (valor seguinte à barra oblíqua) sem alterar cada arquivo. Muitos compiladores e simuladores também fornecem uma opção para sobrescrever valores padrão de timescale que serão aplicados a todos os módulos.

Verilog

  1. Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
  2. Dominando Concatenação Verilog: Guia Prático
  3. Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
  4. Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
  5. Dominando Funções em Verilog para Design RTL Eficiente
  6. Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
  7. Dominando Referência Hierárquica em Verilog: Evite Colisão de Nomes em Módulos e Blocos
  8. Gerador de Clock Verilog: Guia de Design e Implementação
  9. Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente
  10. Dominando $timeformat do Verilog: Precisão e Controle de Exibição