Sc_inout <bool>不更改值

时间:2017-04-18 05:28:28

标签: signals fifo systemc

我正在尝试调试我写的更大的程序,我提取了一个线程,它基本上是将24个值的数组写入fifo,另一个端是另一个应该只读取数据的线程完成所有这些之后。

Transmit.h

#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中的某些内容。

enter image description here

更新

在while循环之后添加wait(SC_ZERO_TIME);有助于更改ServerTx的值,但现在当我添加我的接收代码时,我收到以下错误:

enter image description here

这是我的接收代码:

#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;
}

1 个答案:

答案 0 :(得分: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. 如果您可以从Ground Up(第2版)访问SystemC的硬拷贝。
  3. 参考:第2章第2.4节第29页关于SystemC仿真内核。 (或者查看Google图书快照here)。