#systemc
#systemc
Вопрос:
В качестве примера, скажем, в моем коде есть три функции, которые все чувствительны к положительному фронту одного и того же тактового сигнала. Есть ли способ определить, как данный симулятор SystemC упорядочивает выполнение этих функций?
Я использую симулятор IUS от Cadence.
Я понимаю, что код не должен предполагать последовательность, поскольку он моделирует аппаратное обеспечение. Но я задаю этот вопрос, потому что знание последовательности событий имеет решающее значение для облегчения отладки SystemC.
Ответ №1:
Нет, для процессов, чувствительных к одному и тому же событию, стандарт SystemC не гарантирует определенную последовательность выполнения. Вы должны использовать каналы для межпроцессного взаимодействия, чтобы поведение вашей симуляции не зависело от точной последовательности выполнения.
Внутри объекта event будут храниться дескрипторы всех процессов, чувствительных к одному и тому же событию. Таким образом, при запуске события последовательность выполнения процесса предопределена (по порядку, в котором дескрипторы хранятся внутри события). Однако эта информация является частной, поэтому вы не можете использовать ее в коде приложения:
class sc_event {
...
private:
...
mutable std::vector<sc_method_handle> m_methods_static;
mutable std::vector<sc_method_handle> m_methods_dynamic;
mutable std::vector<sc_thread_handle> m_threads_static;
mutable std::vector<sc_thread_handle> m_threads_dynamic;
}
Комментарии:
1. Да, стандарт SystemC не гарантирует определенную последовательность. Но есть ли способ определить фактическую последовательность, возможно, после компиляции. Это строго для целей отладки. Моя симуляция SystemC завершается сбоем, и я имею дело с 100 тыс. строк кода. Я пытаюсь получить информацию о последовательности событий, чтобы указать, где я должен ставить точки останова.
2. Я изменил свой ответ. Технически вы можете изменить исходный код SystemC, чтобы сделать эту информацию общедоступной или создав дружественную функцию. Вы можете проверить метод sc_event::trigger(), чтобы получить порядок выполнения методов / потоков.