Задержка в один тактовый цикл при обмене данными между одним SC_CTHREAD и другим SC_CTHREAD.

Я пытаюсь смоделировать простой кеш с прямым отображением с модулем основной памяти, который является sc_cthread, и конечным автоматом основной памяти, который также является SC_CTHREAD. Я наблюдаю задержку в один такт от записи сигнала из моего основного модуля памяти и получения его на машине состояний.

Как я могу сделать это только за один такт?


person Dan    schedule 08.08.2019    source источник


Ответы (1)


Вы не можете избежать задержки между потоками при использовании SC_CTHREAD. При записи в sc_signal из одного CTHREAD изменение значения будет видно только другому CTHREAD на следующем фронте тактового сигнала.

Если вы должны использовать CTHREAD (т. е. использовать высокоуровневый синтез), то единственный способ избежать задержки между потоками — поместить обе функции в один CTHREAD.

Если вам нужна только поведенческая модель для моделирования, вы можете использовать SC_THREADs и sc_events. Один поток может генерировать событие sc_event, которое ожидает второй поток. Когда второй поток просыпается по этому событию, он может отслеживать изменения sc_signal, сделанные первым потоком, и затем создавать выходные данные (при желании выровненные с фронтом часов). Использование sc_events дает возможность сэмплировать и обновлять сигналы «между» тактовыми фронтами.

person Mr Bone    schedule 12.08.2019
comment
Спасибо вам большое за ваш ответ. Подскажите, пожалуйста, как мне смоделировать регистр в SC_THREAD. Поскольку я знаю, что если переменная объявлена ​​как sc_signal в SC_CTHREAD, то она ведет себя как регистр, но как я могу сделать это в SC_THREAD. Я могу сделать SC_THREAD чувствительным к clk.pos() и сбросу, но я не думаю, что это будет моделировать регистры там, где я хочу. - person Dan; 13.08.2019
comment
Сделать sc_thread чувствительным к clk.pos() и сбросу достаточно, чтобы sc_signal функционально стал регистром. - person Mr Bone; 13.08.2019