Как лучше всего проверить частоту часов с допуском +/-%?

Ниже показано свойство, которое я использую в настоящее время.

property freq_chk (time clk_period , bit disable_chk=0);
  time current_time; 
  disable iff ( disable_chk )
  ('1, current_time = $time) |=> 
   ( (($time - current_time) >= (clk_period-1)) && 
     (($time - current_time) <= (clk_period+1)) );
endproperty : freq_chk

поэтому здесь мы рассматриваем предел допуска по тактовому периоду как +/- 1. Какой будет лучший метод для того, чтобы пройти процент допуска и соответственно проверить частоту?

Я смотрю на что-то вроде того, что ниже (ЭТО НЕ РАБОТАЕТ, просто для демонстрации того, на что я смотрю).

property freq_chk_with_tol (time clk_period , bit disable_chk=0, int tolerance=0);
  time current_time; 
  disable iff ( disable_chk )
  ('1, current_time = $time) |=> 
   ( (($time - current_time) >= ( (clk_period * (1 - (tolerance/100) )) - 1)) && 
     (($time - current_time) <= ( (clk_period * (1 + (tolerance/100) )) + 1)) );
endproperty : freq_chk_with_tol

Как лучше всего проверить частоту часов с допуском +/-%?


person Vineeth VS    schedule 11.05.2017    source источник
comment
Возможно, вы захотите проверить заголовок на предмет опечаток ...   -  person    schedule 11.05.2017
comment
Да, это хуй.   -  person Bathsheba    schedule 11.05.2017
comment
Спасибо. исправлено :)   -  person Vineeth VS    schedule 11.05.2017
comment
tolerance/100 возвращает целое число; поэтому допуск 8 будет равен 0. Попробуйте tolerance/100.0, который вернет вещественное число (также известное как число с плавающей запятой).   -  person Greg    schedule 11.05.2017
comment
@Greg Спасибо. Мне не хватало этой части.   -  person Vineeth VS    schedule 22.05.2017


Ответы (2)


Как предположил Грег, изменение целочисленных значений на реальные помогло мне.

Ниже рабочий код.

property freq_chk_tol (time clk_period , bit disable_chk=0, real tolerance=0.00);
  time current_time; 
  disable iff ( disable_chk )
  ('1, current_time = $time) |=> 
   ( (($time - current_time) >= ( (clk_period * (1 - (tolerance/100.00) )) - 1)) && 
     (($time - current_time) <= ( (clk_period * (1 + (tolerance/100.00) )) + 1)) );
endproperty : freq_chk_tol
person Vineeth VS    schedule 22.05.2017

Зачем использовать утверждение? Разве не проще использовать поведенческий код?

time clk_margin = <set it to whatever value you need>;   // calculate it once, don't calculate on the fly
time last_clk_tick;
always_ff @(posedge clk) begin
  assert (abs($time - last_clk_tick) < clk_margin);  // abs() is a user function return the absolute value
  last_clk_tick = $time;
end
person hevangel    schedule 23.07.2017
comment
Лично я считаю, что использование метода утверждения свойств упрощает повторное использование одного и того же фрагмента кода для нескольких часов, а также упрощает отслеживание функционального покрытия. - person Vineeth VS; 25.07.2017