Escopo da escala de tempo da Verilog
Prazo padrão
Embora se espere que os módulos Verilog tenham uma escala de tempo definida antes do módulo, os simuladores podem inserir uma escala de tempo padrão. A escala de tempo real que é aplicada em qualquer escopo em uma hierarquia elaborada em Verilog pode ser impressa usando a tarefa do sistema
$printtimescale
que aceita o escopo como um argumento.
module tb;
initial begin
// Print timescale of this module
$printtimescale(tb);
// $printtimescale($root);
end
endmodule
Veja que mesmo que uma diretiva de escala de tempo não tenha sido colocada antes deste módulo, o simulador acabou aplicando um valor de escala de tempo de 1ns/1ns.
Registro de simulação
xcelium> run Time scale of (tb) is 1ns / 1ns xmsim: *W,RNQUIE: Simulation is complete.
Escopo de escala de tempo padrão
Por padrão, uma diretiva de escala de tempo colocada em um arquivo é aplicada a todos os módulos que seguem a diretiva até a definição de outra diretiva de escala de tempo.
`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 terminam com uma escala de tempo de 1ns/1ns enquanto des obtém uma escala de tempo de 1ns/10ps por causa da colocação da diretiva antes da definição do módulo des
Registro 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 um
`include
diretiva que é uma diretiva de pré-processador e faz com que o compilador coloque o conteúdo do arquivo incluído antes da compilação. Portanto, isso equivale 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 uma escala de tempo de 1ns/1ps porque foi a última diretiva que permaneceu válida até que o compilador encontrou a definição de alu apesar de colocá-la em um arquivo diferente. des recebe uma escala de tempo de 1ns/10ps porque a diretiva foi substituída antes de sua definição.
Registro 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.
A troca de arquivos pode alterar a escala de tempo
A ordem de inclusão dos arquivos desempenha um papel importante na redefinição das diretrizes de escala de tempo, o que fica 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
// NOTE! Swapped order of inclusion
`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 recebe uma escala de tempo de 1ns/10ps.
Registro 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 de escala de tempo na parte superior dos arquivos para que todos os módulos nesse arquivo assumam a escala de tempo correta, independentemente da inclusão do arquivo.
No entanto, essa abordagem pode dificultar a compilação com uma precisão de escala de tempo diferente (valor após o oblíquo) sem alterar cada arquivo. Muitos compiladores e simuladores também oferecem uma opção para substituir os valores de escala de tempo padrão que serão aplicados a todos os módulos.
Verilog