Jump to content
Fearless_Idiot

Problem with ports vector binding

Recommended Posts

Hello,

for a uni-project I have to describe a 16bit adressing space main memory using structural view. Among others, I have two components (a decoder and a multiplexer) with arrays of 'sc_out<sc_bv<16> >' and 'sc_in<sc_bv<16> >' respectively. I used sc_vector for the declaration of those arrays. I finally use a module called Memory as a container. The compiling works all fine. But when I run the test i wrote for the module it halts at simulation start with this error:

 

Error: (E109) complete binding failed: port not bound: port 'RAM_16.MUX.in_65535' (sc_in)
In file: ../../../../src/sysc/communication/sc_port.cpp:230

 

Is this really related to wrong binding? It seems all well connected to me and I'm really stuck on this problem. I'm attaching the code for the above-mentioned files.

 

//file Decoder_16.hpp
#ifndef DECODER_16_HPP
#define DECODER_16_HPP

#define RAM_SIZE 65536

#include <systemc.h>
#include <iostream>

SC_MODULE(Decoder_16)
{
	sc_in<bool> clock;
   	sc_in<sc_bv<16> > dec_in;
   	sc_vector<sc_out<sc_bv<1> > > dec_out;

   	void route();

   	SC_CTOR(Decoder_16) 
	{
		dec_out.init(RAM_SIZE);

      		SC_METHOD(route); 

      		sensitive << dec_in << clock.pos(); 
		dont_initialize();
   	}

};

#endif
//file Decoder_16.cpp
#include <systemc.h>
#include "Decoder_16.hpp"

//#define RAM_SIZE 65536

using namespace std;

void Decoder_16 :: route()
{
   sc_bv<16> tmp_in =dec_in.read();
   sc_int<64> tmp = tmp_in.to_uint();
   
   for (unsigned j=0;j < RAM_SIZE; j++)
   {
      if (j==tmp)
	dec_out[j].write('1');
      else
        dec_out[j].write('0');
   }
   return;
}

//file Mux_16.hpp
#ifndef MUX_16_HPP
#define MUX_16_HPP

#define RAM_SIZE 65536

#include <systemc.h>
#include <iostream>

SC_MODULE(Mux_16)
{
	sc_in<bool> clock;
   	sc_vector<sc_in<sc_bv<16> > > in;
        sc_in<sc_bv<16> > sel;
   	sc_out<sc_bv<16> > out;
	sc_signal<sc_bv<16> > sel_sig;
	sc_int<64> sel_dec;
	sc_signal<sc_bv<16> > data_sig;

   	void select();

   	SC_CTOR(Mux_16)
	:   in("in"), sel("sel"), out("out")
	{
		//Debug
		cout << endl << "DEBUG:	Entered MUX constructor!" << endl;

		in.init(RAM_SIZE);

      		SC_METHOD(select); 

      		sensitive << sel << clock.pos();
		dont_initialize();
   	}

};

#endif

//file Mux_16.cpp
#include <systemc.h>
#include "Mux_16.hpp"

//#define RAM_SIZE 65536

using namespace std;

void Mux_16 :: select()
{
   sel_sig = sel.read();
   sel_dec = sel_sig.read().to_uint();
   data_sig = in[sel_dec].read();
   out.write(data_sig);

   return;
}

//file Memory_16b_RISC.hpp
#ifndef MEMORY_16B_RISC
#define MEMORY_16B_RISC


#define RAM_SIZE 65536

#include <systemc.h>
#include <iostream>
#include "Decoder_16.hpp"
#include "Cell.hpp"
#include "And_1.hpp"
#include "Mux_16.hpp"


SC_MODULE(Memory_16b_RISC){

	//Declaration of the inputs
	sc_in<bool> clock;
	sc_in<sc_bv<16> > addr;				//input address <--- ALU output
	sc_in<sc_bv<16> > data_in;			//input data <--- register file 'src2' output.
	sc_in<sc_bv<1> > write_en;			//memory write enable <--- control unit 'we_dmem' output.
	sc_in<sc_bv<1> > read_en;			//memory read enable <--- control unit 're_dmem' output.

	//Declaration of the outputs
	sc_out<sc_bv<16> > data_out;			//output data ---> Multiplexer_3_2 'in3' input. 

	//Signals Declaration
	sc_vector<sc_signal<sc_bv<1> > > sel_bit;
	sc_vector<sc_signal<sc_bv<1> > > read_line;
        sc_vector<sc_signal<sc_bv<1> > > write_line;
        sc_vector<sc_signal<sc_bv<16> > > mux_data_in;


	//Methods Declaration
        void Run();

	//Submodules Declaration
	sc_vector<Cell> MemCell;
	sc_vector<And_1> read_and;
	sc_vector<And_1> write_and;
	Decoder_16 dec16;
        Mux_16 mux16;

	//Constructor
	SC_CTOR(Memory_16b_RISC) 
	   :   MemCell("M1", RAM_SIZE), read_and("A1", RAM_SIZE), write_and("A2", RAM_SIZE), dec16("DEC"), mux16("MUX")
	{
		//Debug
		cout << endl << "DEBUG:	Entered memory constructor!" << endl;

		sel_bit.init(RAM_SIZE);
		read_line.init(RAM_SIZE);
		write_line.init(RAM_SIZE);
		mux_data_in.init(RAM_SIZE);

		SC_METHOD(Run);
			sensitive << clock.pos();
			dont_initialize();
	}	

	//~Memory_16b_RISC();

};//End of Memory Module

#endif

//file Memory_16b_RISC.cpp
#include <systemc.h>
#include <iostream>
#include "Memory_16b_RISC.hpp"

using namespace std;

void Memory_16b_RISC :: Run()
{
	//Debug
	cout << endl << "DEBUG:	Run() has been called!" << endl;

	//Decoder gate port map
	dec16.clock(clock);
	dec16.dec_in(addr);
	dec16.dec_out.bind(sel_bit);

        //Multiplexer gate port map
	mux16.clock(clock);
        mux16.sel(addr);
        mux16.out(data_out);
	mux16.in.bind(mux_data_in);

	for (unsigned i=0; i<RAM_SIZE; i++)
	{
		//Debug
		cout << endl << "DEBUG:	Entered memory mapping cycle!" << endl;

		//Cell port map
		MemCell.at(i).clock(clock);
		MemCell.at(i).wr_en(write_line.at(i));
		MemCell.at(i).re_en(read_line.at(i));
		MemCell.at(i).din(data_in);
		MemCell.at(i).dout(mux_data_in.at(i));

		//Reading AND gate port map
		read_and.at(i).clock(clock);
		read_and.at(i).in1(read_en);
		read_and.at(i).in2(sel_bit.at(i));
		read_and.at(i).out1(read_line.at(i));

		//Writing AND gate port map
		write_and.at(i).clock(clock);
		write_and.at(i).in1(write_en);
		write_and.at(i).in2(sel_bit.at(i));
		write_and.at(i).out1(write_line.at(i));
	}

	return;
}

I can also provide code for the stimulus generation and for the test if that is needed for debugging. Thanks in advance for your help. Bear in mind that I come from vhdl training and I'm still kind of self-training in systemc after taking a course in c++ programming, so don't be too harsh on me : )



 

Share this post


Link to post
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...