Определить временную шкалу в системе Verilog - PullRequest
2 голосов
/ 01 октября 2019

Как определить точность шкалы времени, использованную в симуляции, из исходного кода? Предположим, у меня есть параметр конфигурации (cfg_delay_i) некоторого значения задержки, заданного пользователем в единицах времени как fs . Если пользователь дает 1000 , мой код должен ждать 1000fs или 1ps перед выполнением.

#(cfg_delay_i * 1fs );//will wait only if timescale is 1ps/1fs
do_something(); 

Если точность шкалы времени равна 1fs , проблем не будет, но если точность выше, чем эта, она не будет ждать и будет работать как 0 задержка . Поэтому я хочу написать код, который будет определять временную шкалу, используемую пользователем, и соответственно указывать задержку. Мой ожидаемый псевдокод будет выглядеть следующим образом:

if(timeprecision == 1fs )#(cfg_delay_i * 1fs ) ; 
else if(timeprecision == 1ps )#(cfg_delay_i/1000 * 1ps ) ;

Пожалуйста, помогите мне с логикой, чтобы определитьединица измерения времени и точность внутри.

1 Ответ

3 голосов
/ 01 октября 2019

Вы можете написать if (int'(1fs)!=0) // the time precision is 1fs и так далее. Но в этом нет необходимости.

#(cfg_delay_i/1000.0 * 1ps)

Вышеописанное работает независимо от того, равна ли точность 1ps или меньше. Обратите внимание на использование реального литерала 1000.0, чтобы сохранить реальное деление. 1ps уже является действительным числом, поэтому результат всего выражения будет действительным. Вы также можете сделать

#(cfg_delay_i/1.e6 * 1ns)

Если точность времени в точке, где расположен этот код, больше 1fs, результат округляется до ближайшей единицы точности. Например, если cfg_delay равно 500, а текущая точность равна 1ps, это будет округлено до #1ps.

Имейте в виду, что пользовательский параметр cfg_delay должен проявлять такую ​​же осторожность, чтобы убедиться, что егозначение установлено с правильным масштабированием / точностью.

...