Sc_inout‹bool› Значение не меняется

Я пытаюсь отладить более крупную программу, которую я написал, и я извлек один из потоков, который в основном записывает массив из 24 значений в fifo, а другой конец - это еще один поток, который должен читать данные только после того, как все они было написано.

Передача.ч

#include "stdafx.h"
#include <iostream>
SC_MODULE(Transmit){
    sc_inout <bool> ServerTx;
    sc_fifo_out<int> PacketTx;

    void Tx();

    SC_CTOR(Transmit){
        sc_fifo<int> PacketTx(24);
        SC_THREAD(Tx){}
    }
};

Transmit.cpp

#include "stdafx.h"
#include "Transmit.h"

void Transmit::Tx(){
    int imageInfo[24] = { 1, 3, 2, 4, 1, 200, 600, 400, 800, 2, 400, 200, 600, 400, 3, 600, 400, 800, 600, 4, 800, 600, 1000, 800 };
    while (1){
        if (ServerTx == 0){
            cout << "ServerTx Before Write: " << ServerTx << endl;
            for (int i = 0; i < 24; i++){
                cout << "Transmit Value: " << imageInfo[i] << endl;
                PacketTx.write(imageInfo[i]);
            }
            ServerTx = 1;
            cout << "ServerTx After Write: " << ServerTx << endl;
        }
        else{
            cout << "Done Transmitting Packet." << endl;
        }
    }
}

Main.cpp

#include "stdafx.h"
#include "Transmit.h"

int _tmain(int argc, _TCHAR* argv[])
{
    sc_signal <bool> ServerTx;
    sc_fifo<int> Packet(24);

    Transmit t1("Transmit");
    t1.PacketTx(Packet);
    t1.ServerTx(ServerTx);

    ServerTx = 0;
    sc_start();
    return 0;
}

Что я вижу, так это то, что независимо от типа, который я объявляю своим сигналом ServerTx, он никогда не обновляет свое значение. Я не знаю, есть ли какая-то задержка в systemC с обновлением значений сигнала или нет, но я понятия не имею, что делать дальше. Я расширяю это простое рукопожатие в большую программу, которую я написал, и если это не сработает, мне, возможно, придется отказаться от всего этого.

Вот отладочная распечатка того, что я вижу. Я ожидал, что ServerTx будет равно 1, так как я только что установил его значение, но оно остается равным 0. Не знаю, что происходит, или я что-то неправильно понимаю в SystemC.

введите здесь описание изображения

Обновление:

Добавление wait(SC_ZERO_TIME); после цикла while работало при изменении значения ServerTx, но теперь, когда я добавляю его в свой код получения, я получаю следующую ошибку:

введите здесь описание изображения

Вот мой код получения:

#include "stdafx.h"
#include "Receive.h"

    void Receive::Rx(){
        while (1){
            if (ServerTx == 1){
                cout << "ServerTx before Read: " << ServerTx << endl;
                for (int i = 0; i < 24; i++){
                    imageInfo[i] = PacketRx.read();
                    cout << "Receive Value: " << imageInfo[i] << endl;
                }
                ServerTx = 0; //Done reading server packet data
                cout << "ServerTx after Read: " << ServerTx << endl;
            }
            else{
                wait(10, SC_NS);
            }
            wait(SC_ZERO_TIME);
        }
    }

и я изменил Main.cpp на следующее:

#include "stdafx.h"
#include "Receive.h"
#include "Transmit.h"

int _tmain(int argc, _TCHAR* argv[])
{
    sc_signal <bool> ServerTx;
    sc_fifo<int> Packet(24);

    Receive r1("Receive");
    r1.PacketRx(Packet);
    r1.ServerTx(ServerTx);

    Transmit t1("Transmit");
    t1.PacketTx(Packet);
    t1.ServerTx(ServerTx);

    ServerTx = 0;
    sc_start();


    return 0;
}

person Javia1492    schedule 18.04.2017    source источник


Ответы (1)


В вашем потоке Transmit::Tx вы не позволяете управлению вернуться к ядру SystemC.

SystemC — это совместная многозадачная среда моделирования. Это означает, что вам нужно периодически синхронизировать состояние симуляции с ядром SystemC.

Попробуйте эту модификацию в Transmit.cpp для добавления дельта-задержки в вашу симуляцию:

#include "stdafx.h"
#include "Transmit.h"

void Transmit::Tx(){
  int imageInfo[24] = { 1, 3, 2, 4, 1, 200, 600, 400, 800, 2, 400, 200, 600, 400, 3, 600, 400, 800, 600, 4, 800, 600, 1000, 800 };
  while (1){
    if (ServerTx == 0){
      cout << "ServerTx Before Write: " << ServerTx << endl;
      for (int i = 0; i < 24; i++){
          cout << "Transmit Value: " << imageInfo[i] << endl;
          PacketTx.write(imageInfo[i]);
      }
      ServerTx = 1;
      cout << "ServerTx After Write: " << ServerTx << endl;
    }
    else{
      cout << "Done Transmitting Packet." << endl;
    }
    wait(SC_ZERO_TIME); //< Delta Delay
  }
}

Примечания:

  1. Для лучшего понимания стандарта SystemC вы можете обратиться к SystemC LRM.
  2. Если у вас есть доступ к печатной копии SystemC от Ground Up (2-е издание).

См.: Глава 2, раздел 2.4, страница: 29 о ядре моделирования SystemC. (или взгляните на снимок Google Книги здесь).

person AmeyaVS    schedule 18.04.2017
comment
Это сработало. Однако, как только я включил часть кода Receive, я получаю другую ошибку Необработанное исключение по адресу 0x7777A932 в ConsoleApplication3.exe: исключение Microsoft C++: sc_core::sc_report в ячейке памяти 0x0161F324. Мой код получения в основном такой же, как мой код передачи, за исключением того, что я проверяю, если ServerTx==1, и если да, я читаю данные FIFO в массив. Как только я закончил чтение данных FIFO, я очищаю ServerTx, поэтому ServerTx = 0;. Внутри операторов else я добавил ожидание 5 нс. Есть идеи, что происходит? Я обновил свой вопрос, чтобы отразить это. - person Javia1492; 18.04.2017
comment
Ваши потоки являются свободно работающими потоками, которые по умолчанию не чувствительны к каким-либо событиям SystemC, вам по крайней мере нужен один оператор ожидания в ваших SC_THREAD. Если бы вы могли уточнить сценарий или указать на более ранний вопрос, это облегчило бы определение сценария, который вы пытаетесь смоделировать с помощью SystemC. - person AmeyaVS; 18.04.2017
comment
Однако я включил ожидания в свои потоки. Смотрите мой обновленный вопрос о том, что я пытаюсь сделать. - person Javia1492; 18.04.2017
comment
Основная концепция, которую я пытаюсь смоделировать, - это взаимодействие между серверным модулем и тремя мобильными модулями. Сервер отправляет пакет данных на каждый мобильный телефон, который, в свою очередь, обрабатывается и отправляется обратно. Только один модуль может читать или писать в сети, и я хотел использовать sc_inout в качестве флага, показывающего, занята сеть или нет. Функциональность моего основного кода есть, но я не могу заставить работать системные части, такие как эти потоки. Точно так же мне нужно использовать потоки, так как мне нужно остановить выполнение и повторить чтение/запись в сети, если она уже используется. - person Javia1492; 18.04.2017
comment
Если вы пытаетесь смоделировать программную/логическую сетевую симуляцию, тогда SystemC не подходит для запуска такого рода симуляции, так как вы будете реализовывать много логики для модуля маршрутизатора и других вспомогательных модулей. - person AmeyaVS; 18.04.2017
comment
Если вы пытаетесь ввести несколько значений в интерфейс порта sc_inout в нескольких модулях, вы вскоре столкнетесь с проблемой нескольких драйверов. В этом случае вам придется использовать тип sc_resolved. - person AmeyaVS; 18.04.2017
comment
Это не такая сложная сеть, как вы думаете. Это очень просто. просто передача и обработка пакетных данных. Мне не нужно на самом деле моделировать маршрутизаторы или что-то в этом роде. просто очень простая передача/получение данных. Что касается проблемы с несколькими драйверами, я использую некоторые переменные, чтобы избежать этого, например. Потоки, которые читают/записывают из FIFO, настроены на ожидание в разное время. Таким образом, если кто-то читает или пишет, никто другой не может. Точно так же я использую другой набор флагов, чтобы определить, кто должен читать или писать. Мне просто нужно понять, почему я не могу запустить эти два потока выше одновременно. - person Javia1492; 18.04.2017
comment
Давайте продолжим обсуждение в чате. - person AmeyaVS; 18.04.2017