Нужна помощь для реализации симулятора контроллера прерываний, который обрабатывает ISR

#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), а также быть чувствительным к вводу прерываний.