SC_FIFO写:第一次机会异常

时间:2017-03-21 03:01:52

标签: c++ visual-studio-2013 fifo systemc

我写了一个简单的程序,它将2D数组中的数据从一个模块发送到另一个模块,但它似乎不起作用,我不知道为什么。这是我的代码:

Server.h

internal class Sound
{
    public string Name { get; set; }
    public string AudioFile { get; set; }
    public BitmapImage WhiteImage { get; set; }
    public BitmapImage BlackImage { get; set; }
    public KeyColor Color { get; set; }

    public Sound(string name, KeyColor color)
    {
        Name = name;
        Color = color;

        if (color == KeyColor.Black)
        {
            BlackImage = new BitmapImage(new Uri("ms-appx:///Assets/Images/Black.png"));
            AudioFile = string.Format("ms-appx:///Assets/Audio/22.wav", name);
        }
        else if (color == KeyColor.White)
        {
            WhiteImage = new BitmapImage(new Uri("ms-appx:///Assets/Images/White.PNG"));
            AudioFile = string.Format("ms-appx:///Assets/Audio/11.wav", name);
        }
    }
}

public enum KeyColor
{
    Black,
    White
}

Server.cpp

#include <iostream>
#include "stdafx.h"
using namespace std;

SC_MODULE(Server){
    sc_in <bool> clock;
    sc_fifo_out <sc_uint<20> > writePath;

    bool init_flag;
    int numRobots;

    void Server_Main();

    SC_CTOR(Server){
        init_flag = 0;
        numRobots = 4;
        SC_METHOD(Server_Main){ sensitive << clock.pos(); }
    }
};

Sensor.h

#include "stdafx.h"
#include "Server.h"

void Server::Server_Main(){
    if (init_flag == 0){
        int robotPath[4][5] = {
            { 1, 2, 3, 4, 1 },
            { 2, 1, 6, 3, 4 },
            { 3, 2, 9, 5, 1 },
            { 4, 1, 6, 8, 7 }
        };

        //Write robot path to Sensor
        for (int i = 0; i < numRobots; i++){
            for (int j = 0; j < 5; j++){
                cout << "SERVER MODULE: Write Robot Paths " << i << ": " << robotPath[i][j] << endl;
                writePath.write(robotPath[i][j]);
            }
        }
        init_flag = 1;
    }
    else{ sc_stop(); }
}

Sensor.cpp

#include <iostream>
#include "stdafx.h"
using namespace std;

SC_MODULE(Sensor){
    //sc_in <bool> clock;
    sc_fifo_in <sc_uint<20> > readPath;

    int robotPath[4][5]; 

    void loadPath();
    //void Sensor_Main();

    SC_CTOR(Sensor){
        //SC_METHOD(Sensor_Main){ sensitive << clock.pos(); }
        SC_THREAD(loadPath){}
    }
};

Main.cpp的

#include "stdafx.h"
#include "Sensor.h"

void Sensor::loadPath(){
    int i = 0;
    int j = 0;
    while (1){
        robotPath[i][j] = readPath.read();
        cout << "SENSOR MODULE: Read Robot " << i << " Path " << j << " : " << robotPath[i][j] << endl;
        if (j == 4){
            j = 0;  //Set index to beginning of array
            i++;    //Move to next robot
        }
        else{ j++; } //Continue loading path for current robot
    }
}

以下是我的输出结果:

enter image description here

这是我从VS2013得到的错误: enter image description here

当程序尝试将#include "stdafx.h" #include <iostream> #include "Sensor.h" #include "Server.h" using namespace std; int sc_main(int argc, char* argv[]) { sc_clock clock("sysclock", 50, SC_MS, .5); sc_fifo <sc_uint<20> > robotPath; Sensor sensor_mod("Sensor"); sensor_mod.readPath(robotPath); Server server_mod("Server"); server_mod.clock(clock); server_mod.writePath(robotPath); sc_start(); return 0; } 写入fifo但是我不确定原因时似乎抛出异常。我指定我的fifo大小为20,以便它可以一次存储20个值,但我不发送超过20个值,当我尝试写第17个值时发生这个异常,所以也许我误解了robotPath[3][1]的使用。这可能是一个明显的错误,我可以忽略,但我现在已经烧坏了,无法弄清楚它是什么搞乱了。

1 个答案:

答案 0 :(得分:1)

您是尝试使用SystemC建模硬件设计还是尝试使用SystemC进行软件建模? 你好像混淆了上下文。

以下是您需要考虑的指针列表:

  • 在服务器模块中,Server_Main()应注册为SC_THREAD:

    SC_THREAD(Server_Main);
    sensitive << clk.pos();
    

    由于您使用的是内部调用wait()的sc_fifo写入方法,因此在SystemC中使用SC_METHOD中的wait是非法的。

  • 修改Server.cpp,如下所述:

    void Server::Server_Main() {
      int robotPath[4][5] = {{ 1, 2, 3, 4, 1 },
                             { 2, 1, 6, 3, 4 },
                             { 3, 2, 9, 5, 1 },
                             { 4, 1, 6, 8, 7 }};
      //Write robot path to Sensor
      for (int i = 0; i < numRobots; i++){
        for (int j = 0; j < 5; j++){
          cout << "SERVER MODULE: Write Robot Paths " << i << ": " << robotPath[i][j] << endl;
          writePath.write(robotPath[i][j]);
          wait(); //< Notice this wait statement.
        }
      }
    }
    
  • 在Sensor.cpp的while循环中添加 wait()语句。

  • sc_fifo&lt; sc_uint&LT; 20 - ; &gt; 没有像您想象的那样实例化深度为20的 sc_fifo
    实际上,实例化 sc_fifo ,其中 sc_uint&lt; 20&gt; 作为数据类型,用于建模20位无符号整数,默认深度为fifo,按16 SystemC规范。

    您可以实例化深度为20的 sc_fifo&lt;&gt; ,如下所述:

    sc_fifo<sc_uint<20> > robotPath("robotPath", 20);
    

    注意:您不需要这样做,因为上述从SC_METHOD更改为SC_THREAD并且还更新 Server_Main 将使此行为无效。