Как проверить значения сигналов на всех уровнях иерархии компонентов в VHDL - PullRequest
0 голосов
/ 07 января 2020

Обычно я делаю это с помощью команд TCL и симулятора, чтобы убедиться, что все сигналы инициализируются на допустимое значение во время сброса, но я хочу знать, есть ли способ выполнить sh в чистом VHDL.

Вот пример на основе TCL. Очень удобно использовать циклы * и foreach вместе с командой симулятора find для захвата всех имен сигналов. Я просто вызываю процедуру check_sigs всякий раз, когда хочу проверить правильность всех сигналов.

# List of all signals to inspect
set sig_list {
  /tb/POR
  /tb/GSM/POR_SD_0/*
  /tb/GSM/*
  /tb/GSM/CLOCK_Condition/*
  /tb/GSM/HB_Timer_Local/*
  /tb/GSM/HB_Timer_Remote/*
  /tb/GSM/HB_Monitor_Local/*
  /tb/GSM/HB_Monitor_Remote/*
}

proc check_sigs {} {
  foreach sig_set $::sig_list {
    foreach sig [find sig $sig_set] {
      if {[exa -decimal $sig] == "X" || [exa -decimal $sig] == "U"} {
        ...
        report error here, etc
        ...
      }
    }
  }
}

Я знаю, что могу использовать иерархические имена в VHDL-2008 , но это будет слишком обременительно так записывать каждый сигнал.

Кто-нибудь знает способ сделать это с помощью чистого VHDL?

1 Ответ

0 голосов
/ 07 января 2020

Иерархические имена - это единственный способ получить доступ к внутренним сигналам. И здесь нет подстановочных знаков, поэтому вам нужно будет захватить каждый вручную. Может быть, вы могли бы поставить утверждение внутри каждого блока, который имеет сброс? Или как насчет использования типов, которые не допускают значения 'X' или 'U', или нескольких драйверов?

...