Проблема с 5 ns
в директиве `timescale
заключается в том, что это недопустимый синтаксис в соответствии со стандартом IEEE Std. Разрешены только 1, 10 и 100.
Однако есть также проблема с вашим другим примером кода:
`timescale 1 ns/1 ns
forever #2.5 clk = ~clk;
Это не создает тактовую частоту 200 МГц. Тактовая частота составляет 166 МГц. Вы указали точность времени 1 нс, что означает, что дробные задержки будут округлены. В таком случае. 2,5 округляется до 3, что означает, что в итоге получается период 6 нс, а не 5 нс. Вы можете убедиться в этом, добавив следующий код в свой тестовый стенд:
initial $monitor($realtime, "\tclk=%b", clk);
Тогда вы увидите, что период clk
равен 6 нс:
0 clk=0
3 clk=1
6 clk=0
9 clk=1
12 clk=0
15 clk=1
Один из способов достижения 200 МГц часы должны использовать точность 100ps:
`timescale 1 ns / 100 ps
forever #2.5 clk = ~clk;