#systemc
#systemc
Вопрос:
Я занимаюсь реализацией симулятора контроллера прерываний, который будет принимать сигналы от других остальных модулей HW при моделировании и запускать ISR.
Ниже приведен примерный код SystemC, чтобы прояснить концепцию. В этом случае нам нужно, чтобы ISR обрабатывался таким образом, чтобы, даже если FW_main застрял внутри цикла while(1).
В приведенной ниже реализации контекст находится только внутри цикла FW_main. Добавление ожидания в FW_main — это не то, что мы хотим. Нам нужна правильная функциональность контроллера прерываний. Есть идеи, как избавиться от этой проблемы?
SC_MODULE (processor)
{
sc_in < bool > interrupt;
void ISR(void)
{
cout << "i am in ISRn";
}
void FW_main(void)
{
while(1)
{
cout << "i am in FW_mainn";
}
}
SC_CTOR (processor)
{
SC_METHOD(ISR);
sensitive << interrupt;
SC_THREAD(FW_main);
}
};
Комментарии:
1. Вы пытаетесь смоделировать процессор? Можете ли вы предоставить схему архитектуры, которую вы пытаетесь смоделировать?
2. Почему вы пытаетесь избежать wait() в вашем потоке FW_main? Без него управление не может быть передано для запуска других процессов.
3. в FW могут быть жесткие циклы while. Это зависит от того, кто пишет FW, если возникает такая напряженная ситуация с циклом while, мы не хотим блокировать сигналы прерывания для FW.
Ответ №1:
К сожалению, процессы SystemC являются совместными, а не упреждающими. Даже ядро SystemC не может вмешаться и приостановить метод FW_main .
Ни одна процессорная система / FW действительно не застревает в цикле while таким образом. Любой симулятор набора команд должен пошагово определять время по каким-либо стробоскопам или событиям, в идеале по фронтам синхронизации.
Функциональное представление системы, которую вы пытаетесь смоделировать, будет выглядеть примерно следующим образом.
SC_MODULE (processor)
{
sc_in < bool > clk;
sc_in < bool > interrupt;
void ISR(void)
{
cout << "i am in ISRn";
}
void FW_main(void)
{
cout << "i am in FW_mainn";
}
SC_CTOR (processor)
{
SC_METHOD(ISR);
sensitive << interrupt;
SC_METHOD(FW_main);
sensitive << clk;
}
};
В приведенном выше коде, который я предложил, есть две проблемы. Во-первых, вам, вероятно, не нужен фактический тактовый сигнал, который нуждается в переключении извне или вообще в каком-либо смысле времени, если на то пошло. Во-вторых, в одноядерной процессорной системе ISR и FW_Main на самом деле не параллельны по своей природе. Более реалистичная реализация того, что вы пытаетесь смоделировать, будет выглядеть следующим образом.
SC_MODULE(processor)
{
sc_in < bool > interrupt;
void ISR(void)
{
cout << "i am in ISRn";
}
void FW_main(void)
{
if(interrupt.read())
{
ISR();
}
cout << "i am in FW_mainn";
next_trigger(SC_ZERO_TIME, interrupt);
}
SC_CTOR (processor)
{
SC_METHOD(FW_main);
}
};
next_trigger(SC_ZERO_TIME, interrupt)
Оператор заставляет FW_main эмулировать while(1), а также быть чувствительным к вводу прерываний.