Jump to content

fifo problem with my code


keroroishappy

Recommended Posts

/////////////////stim.h/////////////////////////////////////////////////

#ifndef _STIM_H_
#define _STIM_H_
#include <iomanip>
#include "short_path.h"
using std::setw;


SC_MODULE(stim) {
public:  

  sc_in_clk i_clk;
  int temp_a;
  int temp_b;
  int temp_c;
  sc_out<int> o_src_port;
  sc_fifo_out<sc_uint<WIDTH> > o_a_port;
  sc_fifo_out<sc_uint<WIDTH> > o_b_port;
  sc_fifo_out<sc_uint<WIDTH> > o_c_port;
  sc_fifo_in<sc_uint<WIDTH+1> > i_dis_port;
  sc_fifo_in<sc_uint<WIDTH+1> > i_point_port;
  //Store the previous inputs to FIFOs
  int point;
  int dis;
  int a_arr[17]={0,0,1,1,2,2,2,3,3,4,5,6,6,7,7,9,11};
  int b_arr[17]={1,7,2,1,3,8,5,4,5,5,6,7,8,8,3,1,2};
  int c_arr[17]={4,8,8,11,7,2,4,9,14,10,2,1,6,7,3,2,3};

  SC_CTOR(stim) {
    SC_THREAD(stim_gen);
    sensitive << i_clk.pos();
    dont_initialize();

    SC_THREAD(sink);
    sensitive << i_clk.pos();
    dont_initialize();
  }

  void stim_gen() {
    int src_val = 2;
    o_src_port.write(src_val);
    cout << setw(12) << "time" << setw(12) << "a" << setw(12) << "b" <<
    setw(12) << "dis"<<endl;
    for (int i = 0; i < 17; i++) {
        temp_a = a_arr[i];
        temp_b = b_arr[i];
        temp_c = c_arr[i];
        o_a_port.write(temp_a);
        o_b_port.write(temp_b);
        o_c_port.write(temp_c);
        cout << setw(12) << sc_time_stamp();
        cout << setw(12) << a_arr[i];
        cout << setw(12) << b_arr[i];
        cout << setw(12) << c_arr[i] << endl;
    }
  }

  void sink() {
    while (true) {
      point=i_point_port.read();
      dis=i_dis_port.read();
      cout << setw(12) << sc_time_stamp();
      cout << setw(12) << point;
      cout << setw(12) << dis << endl;
      wait();
    }
  }

};

#endif
  
  
  
  
  
  
  
////////////////////short_path.h/////////////////////////////////
  
#include <iostream>
using namespace std;
#include <systemc>
#include <list>
#include <vector>
#include <queue>
using namespace sc_dt;
using namespace sc_core;
typedef pair<int, int> iPair; 
const int WIDTH = 10;
#define INF 0x3f3f3f3f


class short_path : public sc_module {

public:
  int src;
  int V;
  list<pair<int, int>> *adj;
  sc_in_clk i_clk;
  sc_in<int> i_src_port;
  sc_fifo_in<sc_uint<WIDTH> > i_a_port;
  sc_fifo_in<sc_uint<WIDTH> > i_b_port;
  sc_fifo_in<sc_uint<WIDTH> > i_c_port;
  sc_fifo_out<sc_uint<WIDTH+1> > o_point_port;
  sc_fifo_out<sc_uint<WIDTH+1> > o_dis_port;

  SC_CTOR(short_path){ 
    SC_THREAD(addEdge);  
    sensitive << i_clk.pos();
    dont_initialize();
    SC_THREAD(shortestPathingraph);  
    sensitive << i_clk.pos();
    dont_initialize();
  }

  void addEdge() {
    while (true) {
    _i_a = i_a_port.read();
    cout <<"_i_a : "<< _i_a << endl;
    _i_b = i_b_port.read();
    cout <<"_i_b : "<< _i_b << endl;
    _i_c = i_c_port.read();
    cout <<"_i_c : "<< _i_c << endl;
    wait();
    adj[_i_a].push_back(make_pair(_i_b, _i_c));
    adj[_i_b].push_back(make_pair(_i_a, _i_c));
    }
  }

  void shortestPathingraph(){  
    while(true){
    src = i_src_port.read(); 
    cout<<"src received and src value is : "<<src<<endl;
    priority_queue<iPair, vector<iPair>, greater<iPair>> pq;  
    vector<int> dist(V, INF); 
    pq.push(make_pair(0, src));  
    dist[src] = 0; 
      while (!pq.empty()) { 
        int u = pq.top().second;  
        pq.pop();
        list<pair<int, int>>::iterator i;  
        for (i = adj[u].begin(); i != adj[u].end(); ++i) {  
            int v = (*i).first;  
            int weight = (*i).second;  
            if (dist[v] > dist[u] + weight) {   
                dist[v] = dist[u] + weight;  
                pq.push(make_pair(dist[v], v));  
            }  
        }  
      }  



      for (int i = 0; i < V; ++i){
        printf("%d \t\t %d\n", i, dist[i]); 
        o_point_port.write(dist[i]);
        o_dis_port.write(i);
      }
    }
  } 


  //sc_uint<WIDTH> i_a() { return _i_a; }
  //sc_uint<WIDTH> i_b() { return _i_b; }
  //sc_uint<WIDTH> o_sum() { return _o_sum; }

private:
  sc_uint<WIDTH> _i_a;
  sc_uint<WIDTH> _i_b;
  sc_uint<WIDTH> _i_c;
  //sc_uint<WIDTH + 1> _o_point;
  //sc_uint<WIDTH + 1> _o_dis;
};




///////////////main///////////////////////////////

#include "stim.h"
#define CLOCK_PERIOD 1.0

int sc_main(int argc, char *argv[]) {
  
  //Create modules and signals
  stim testbench("testbench");
  short_path dut("dut");
  sc_clock clk("clk", CLOCK_PERIOD, SC_NS);
  sc_signal<int> src("src");


  //Create FIFO channels
  sc_fifo<sc_uint<WIDTH> > fifo_i_a;
  sc_fifo<sc_uint<WIDTH> > fifo_i_b;
  sc_fifo<sc_uint<WIDTH> > fifo_i_c;
  sc_fifo<sc_uint<WIDTH+1> > fifo_o_dis;
  sc_fifo<sc_uint<WIDTH+1> > fifo_o_point;

  //Connect FIFO channels with modules
  testbench.i_clk(clk);
  testbench.o_src_port(src);
  dut.i_clk(clk);
  dut.i_src_port(src);
  testbench.o_a_port(fifo_i_a);
  testbench.o_b_port(fifo_i_b);
  testbench.o_c_port(fifo_i_c);
  testbench.i_dis_port(fifo_o_dis);
  testbench.i_point_port(fifo_o_point);
  dut.i_a_port(fifo_i_a);
  dut.i_b_port(fifo_i_b);
  dut.i_c_port(fifo_i_c);
  dut.o_dis_port(fifo_o_dis);
  dut.o_point_port(fifo_o_point);


  sc_start();
  return 0;
}

Hi everyone

the code above is my systemC practice

i use "stim.h" to deliver my data to "short_path.h" (dijkstra algo) through fifo 

but "short_path.h" cannot receive the data from "stim.h" 

i try my effort to debug and want to find the problem but have no idea.

hope someone could tell me where is the problem

thank u

Link to comment
Share on other sites

1 hour ago, Andy Goodrich said:

I believe your problem is with the pointer variable, adj. I assume you want an array of lists to be associated with adj, but you have never allocated storage for that array of lists. So when you access adj in short_path.h you get a segment fault. 

thank you i sloved the problem, but i have another question

when i use c++(not systemC), it is ok without specifying "adj" with specific value like " list<pair<int, int>> adj[10] ".

I can just use pointer " list<pair<int, int>> *adj " 

what make me have to use this form ( list<pair<int, int>> adj[] )  instead of pointer

 

thank u

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...