Как проверить частоту с помощью UVM / Systemverilog

Это более объективный вопрос. Как лучше всего проверить тактовую частоту? (В основном при работе с симуляциями RTL симуляция на уровне ворот должна отключать эти проверки)

Раньше я делал это с помощью утверждений, но мне хотелось узнать мнение, так как я столкнулся с несколькими из следующих проблем:

  1. Рассмотрим протокол SPI, часы действительны только тогда, когда CS действителен, поэтому проверка должна выполняться только тогда, когда CS отключен, это не преобразуется в прямое утверждение, поскольку конфигурация пэда изменяет синхронизацию и функциональность CS.

  2. Часы, у которых нет точного периода даже в моделировании RTL, в зависимости от логических часов имеют диапазон +/-.


person wisemonkey    schedule 20.10.2014    source источник


Ответы (3)


Если вы хотите только проверить частоту часов, я думаю, вы знаете, когда часы действительны, а затем вы можете запустить моделирование в течение некоторого времени и поддерживать счетчик часов, тогда вы получите $ time and counter, frequency = $ time / прилавок. Примерно можно получить частоту.

Если вы хотите проверить точность или рабочий цикл, я думаю, что это связано с функцией часов, должно принадлежать к категории аналогового дизайна, такой как PLL, Oscillators. Аналоговый инженер должен доказать свою правоту. Они могут использовать имитацию специй.

Да, это хорошая тема для обсуждения не только для SV / UVM.

Пожалуйста, поправьте меня, если я неправильно понимаю. :-)

person sean    schedule 18.11.2014
comment
Спасибо, вопрос ориентирован на часы, генерируемые цифровой логикой (например, периодический запуск, но в зависимости от сигнала занятости запуск может иметь 10% погрешности) - person wisemonkey; 02.03.2016

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

Часы с рабочим циклом 50% и частотой 1 МГц

property p_clk_hi; 
      time v; 
      @(posedge clk) (1, v=$time) |-> @(negedge clk) ($time-v)==500ns;
    endproperty 
    ap_clk_hi: assert property(p_clk_hi);  

property p_clk_lo; 
  time v; 
  @(negedge clk) (1, v=$time) |-> @(posedge clk) ($time-v)==500ns;
endproperty 
ap_clk_lo: assert property(p_clk_lo);  

конечный модуль

person Abhi Sanghvi    schedule 24.02.2016
comment
Именно так я закодировал свои утверждения, я надеялся увидеть, есть ли другие методы / способы. Это утверждение также должно учитывать погрешность +/- 10 (скажем)%. (например, периодический запуск, но в зависимости от сигнала занятости начало может иметь 10% погрешности) - person wisemonkey; 02.03.2016

В вашем RTL, если количество тактов меньше, тогда утверждения будут лучшим выбором, но если у вас огромное количество тактов, тогда реализация «Clock Checker» будет лучшим вариантом.

Clock checker имеет ряд преимуществ по сравнению с SVA, например:

  • Повторное использование
  • Лучшая настраиваемость
  • Легко реализовать дополнительные функции, такие как рабочий цикл, тонна, измерения Toff и т. Д.
  • Все преимущества УВМ

Обзор реализации:

Как показано на блок-схеме ниже, нам нужно создать простой агент проверки часов с экземпляром класса монитора, интерфейса и конфигурации, созданного в нем; Кроме того, также создайте тестовый пример, который включает средство проверки через дескриптор конфигурации. Обзор реализации Nikunj Hinsu

Две проблемы, с которыми вы столкнулись, можно просто решить с помощью этой программы проверки.

  1. Через интерфейс вы также можете передать бит CS для проверки, и все часы SPI могут быть отключены во время низкого состояния CS.
  2. Через тестовый набор вы можете передать поле допуска (т.е. + -5%, 10%), которое будет управлять логикой проверки и отчета монитора.

В дополнение к этому, эта программа проверки становится спасителем, если у вас есть сверхскоростные IP-адреса, такие как PCIe, где тактовая частота изменяется в соответствии с Gen1, Gen2, Gen3 на протяжении моделирования.

Надеюсь, это решит вашу проблему !!

  • Никундж Хинсу
person Nikunj Hinsu    schedule 06.03.2016