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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×