Verilog ofrece tres tareas del sistema relacionadas con el paso de tiempo de la simulación:
$time
devuelve la hora actual como un entero de 64 bits, en unidades del paso de tiempo definido por la 'directiva de escala de tiempo'.
$stime
devuelve el mismo valor que un entero de 32 bits.
$realtime
devuelve el mismo valor que un número real.
Sin embargo, es probable que ninguna de estas directivas del sistema sea útil para la síntesis. Normalmente se implementarán mediante un código especial en el simulador que accede a las variables en el programa del simulador.
Para realizar un seguimiento del tiempo en un circuito real, debe comenzar con un reloj de entrada con una frecuencia conocida. Para una buena precisión, generaría esto con un circuito de oscilador de cristal, que estaría completamente fuera de su dispositivo si está trabajando en un FPGA.
Luego simplemente construye un contador para hacer un seguimiento de las marcas de tu reloj (nota código no probado):
module time_counter(input clk, input rst, output reg [31:0] ticks)
always @(posedge clk or posedge rst) begin
if (rst) begin
ticks <= 32'h00000000;
end
else begin
ticks <= ticks + 1;
end
end
endmodule
Hay un límite a la velocidad con la que puede funcionar un contador como este, y varios trucos para crear contadores más rápidos si es necesario.
Si necesita encontrar el período de una entrada con un período desconocido, necesita compararlo con un reloj con un período conocido. Conceptualmente, es más simple hacer que el reloj conocido sea mucho más rápido que el reloj desconocido y contar los tics del reloj conocido para cada período del reloj desconocido. Si eso no es posible, puede dividir el reloj desconocido por algún factor (por ejemplo, 16 o 128 o 1024) y contar los tics del reloj conocido para cada ciclo del divisor para resolver el período desconocido.