gpt4 book ai didi

c++ - SC_FIFO 写入 : First chance exception

转载 作者:行者123 更新时间:2023-11-28 05:14:35 26 4
gpt4 key购买 nike

我写了一个简单的程序,它将数据从一个模块的二维数组发送到另一个模块,但是它似乎不起作用,我也不确定为什么。这是我的代码:

服务器.h

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

服务器.cpp

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

传感器.h

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

传感器.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
}
}

main.cpp

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

这是我的输出:

enter image description here

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

程序似乎在尝试将 robotPath[3][1] 写入 fifo 时抛出异常,但我不确定为什么。我将我的 fifo 大小指定为 20,这样它可以一次存储 20 个值,但我发送的值不超过 20 个,当我尝试写入第 17 个值时会发生此异常,所以我可能误解了 sc_fifo_out< 的使用。这可能是我忽略的一些明显错误,但此时我有点筋疲力尽,无法弄清楚我搞砸了什么。

最佳答案

您是尝试使用 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< sc_uint<20>> 并未像您想象的那样实例化深度为 20 的 sc_fifo
    它实际上是用sc_uint<20>实例化一个sc_fifo作为数据类型,用于建模一个20位无符号整数,fifo的默认深度为16 SystemC规范。

    您可以实例化深度为 20 的 sc_fifo<>,如下所述:

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

    注意:您不需要执行此操作,因为上述从 SC_METHOD 更改为 SC_THREAD 以及更新 Server_Main 将使此行为无效。

关于c++ - SC_FIFO 写入 : First chance exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42917674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com