Безопасно ли вызывать sc_fifo :: nb_write () из процесса SC_THREAD? - PullRequest
0 голосов
/ 21 декабря 2018

Я конвертирую часть своего кода из SC_THREAD в SC_METHOD.У меня вопрос, нужно ли прекратить использование класса sc_fifo?Я понимаю, что SC_METHOD не должен вызывать sc_fifo.write (), потому что это использует вызов ожидания, который не разрешен для функций, которые не могут быть приостановлены.Однако sc_fifo предоставляет неблокирующие версии различных функций, и потенциально я мог бы использовать их вместо этого.В некоторой документации, которую я прочитал, указано, что вы никогда не должны использовать sc_fifo из SC_METHOD вообще, но не предоставили обоснования.

Вот пример кода, который я сейчас использую.

class Example : public sc_module {
public:
        sc_fifo<int> myFifo;
        sc_in<bool> clock_in;

        SC_HAS_PROCESS(Example);

        // constructor
        Example(sc_module_name name) : sc_module(name) {
                SC_METHOD(read);
                        sensitive << clock_in;
        }

        void read() {
                int value = -1;
                bool success = myFifo.nb_read(value);
                if (success) { cout << "Read value " << value << endl; }
                else { cout << "No read done but that's okay." << endl; }
        }

};

int sc_main(int argc, char* argv[]) {
        sc_clock clock("clock");
        Example example("example");
        example.clock_in(clock);
        sc_start(10, SC_NS);
        return 0;
}

Это не вызывает ошибок, хотя я вызываю функцию sc_fifo из SC_METHOD.Это плохая политика для использования nb_read () изнутри SC_METHOD?Если так, почему?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Ни nb_read, ни nb_write, как следует из их имен, не вызывают внутреннее ожидание, поэтому их можно использовать из SC_METHOD.

Хотя ваш пример кода работает, он довольно неэффективен, когда вещи помещаются в fifo нечасто.Если вы хотите, чтобы ваш код был более управляемым событиями, вы можете сделать SC_METHOD чувствительным к sc_fifo.data_written_event ();тогда он будет вызываться только тогда, когда что-то действительно записано в fifo (хотя все еще неплохо проверить, что nb_read возвращает true в случае, если что-то еще извлечено из того же fifo).Конечно, это пропустит ваше «Не читал, но ничего страшного».печатает.

Кроме того, я думаю, что заголовок вашего вопроса, вероятно, хотел спросить о вызове nb_write из SC_METHOD, а не SC_THREAD.

0 голосов
/ 22 декабря 2018

Использование sc_fifo неблокирующих вызовов из SC_METHOD должно быть хорошо.Я не нашел ни одного места в стандартном руководстве, которое бы запрещало это.

...