Comprender e imprimir timescales de Verilog en cualquier alcance
Timescale por defecto
Aunque se espera que los módulos de Verilog tengan un timescale definido antes del módulo, los simuladores pueden insertar un timescale por defecto. El timescale real que se aplica en cualquier alcance en una jerarquía elaborada de Verilog puede imprimirse usando la tarea de sistema $printtimescale que acepta el alcance como argumento.
module tb;
initial begin
// Imprimir timescale de este módulo
$printtimescale(tb);
// $printtimescale($root);
end
endmodule
Vea que aunque una directiva de timescale no se colocó antes de este módulo, el simulador terminó aplicando un valor de timescale 1ns/1ns.
xcelium> run Time scale of (tb) is 1ns / 1ns xmsim: *W,RNQUIE: Simulation is complete.
Alcance de timescale estándar
Por defecto, una directiva de timescale colocada en un archivo se aplica a todos los módulos que siguen a la directiva hasta la definición de otra directiva de 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
En el ejemplo anterior, tb y alu terminan con un timescale de 1ns/1ns mientras que des obtiene un timescale de 1ns/10ps debido a la colocación de la directiva antes de la definición del módulo des.
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.
Alcance entre archivos de Verilog
Otros archivos pueden incluirse en el archivo actual usando una directiva `include que es una directiva de preprocesador y hace que el compilador coloque el contenido del archivo incluido antes de la compilación. Así, esto es equivalente a simplemente pegar todo el contenido del otro archivo en este archivo 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
Vea que los resultados son exactamente los mismos que en el ejemplo anterior. alu obtiene un timescale de 1ns/1ps porque fue la última directiva que se mantuvo válida hasta que el compilador encontró la definición de alu a pesar de colocarlo en un archivo diferente. des obtiene un timescale de 1ns/10ps porque la directiva fue reemplazada antes de su definición.
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.
Intercambiar archivos puede cambiar timescale
El orden de inclusión de archivos juega un papel importante en la redefinición de directivas de timescale, lo cual es evidente en el ejemplo a continuación.
// 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! Orden de inclusión intercambiado
`include "file_des.v"
`include "file_alu.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
Vea que el módulo alu ahora obtiene un timescale de 1ns/10ps.
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 es una de las razones para tener una directiva de timescale al principio de los archivos para que todos los módulos en ese archivo asuman el timescale correcto independientemente de la inclusión de archivos.
Sin embargo, este enfoque puede dificultar la compilación con una precisión de timescale diferente (valor siguiente a la oblicua) sin alterar cada archivo. Muchos compiladores y simuladores también proporcionan una opción para sobrescribir valores de timescale por defecto que se aplicarán a todos los módulos.
Verilog
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la concatenación en Verilog: Guía práctica
- Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Dominar el alcance de referencia jerárquica en Verilog: Evitar colisiones de nombres en módulos y bloques
- Generador de reloj en Verilog: Guía de diseño e implementación
- Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
- Dominar $timeformat en Verilog: Control de precisión y visualización
- Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar