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