2016-01-22 263 views
2

我第一次使用systemC。我尽我所能地追踪了这些例子,但我无法弄清楚这个错误是由什么引起的。错误:(E112)获取接口失败:端口未绑定 - SystemC

目标是创建一个ALU,增加和减去与桶式移位器

alu.h

#include "systemc.h"  

SC_MODULE(alu){ 
sc_in<bool> op; 
sc_in<sc_int<8> > a; 
sc_inout<sc_int<8> > b; 
sc_out<sc_int<8> > output; 

void alu_method(); 

SC_CTOR(alu) { 
    SC_METHOD(alu_method); 
    dont_initialize(); 
    sensitive << a,b,op; 
    } 
}; 

alu.cpp

#include "alu.h" 

void ALU::alu_method(){ 
if (op.read() == 0){ 
    //substract 
    out.write(in.read() - in_bs.read()); 
} 
else{ 
    //add 
    out.write(in.read() + in_bs.read()); 
    } 
} 

barrelshift.h

#include <systemc.h>  
    void make_barrel(); 

    SC_MODULE(barrel_shift) { 
    sc_in<bool> clk; 
    sc_in<bool> enable; 
    sc_in<bool> left_right; 
    sc_in<sc_uint<3> > shift_amt; 
    sc_in<sc_int<8> > din; 
    sc_inout<sc_int<8> > dout; 

void barrel_method(); 

    SC_CTOR(barrel_shift) { 

    SC_METHOD(barrel_method); 
dont_initialize(); 
    sensitive << clk.pos(); //edge sensitive 
    } 

}; 

barrelshift.cpp

#include "barrelshift.h" 

    void barrel_shift :: barrel_method(){ 

if(enable.read() == 1){ 
    if(left_right.read() == 0){ //shift left 
       dout.write(din.read() << shift_amt.read()); 

    }else if(left_right.read() == 1){ // right shift 
       dout.write(din.read() >> shift_amt.read()); 
    } 
} 
else 
     cout << "Not enabled "<<endl; 
     dout <= din;  
} 

sc_main.cpp

#include <systemc.h> 
    #include "alu.h" 
    #include "barrelshift.h" 

    int sc_main(int argc, char* argv[]){ 
sc_trace_file *tf; 

//Signals 
sc_signal <bool> enable, op, l_r; 
sc_signal <sc_int<8> > a, output,b, bin; 
sc_signal < sc_uint<3> > shift_amt; 

//Clock 
sc_clock clk("clk",10,SC_PS,0.5); 

alu myALU("myALU"); 
barrel_shift myShifter("myShifter"); 

myALU.a(a); 
myALU.b(b); 
myALU.output(output); 
myALU.op(op); 

myShifter.clk(clk); 
myShifter.din(bin); 
myShifter.enable(enable); 
myShifter.left_right(l_r); 
myShifter.shift_amt(shift_amt); 
myShifter.dout(b); 

tf = sc_create_vcd_trace_file("trace_file"); 
sc_trace(tf, clk, "clk"); 
sc_trace(tf, a, "a"); 
sc_trace(tf, bin, "BarrelShifter In"); 
sc_trace(tf, op, "op"); 
sc_trace(tf, shift_amt, "shift_amt"); 
sc_trace(tf, l_r, "left_right"); 
sc_trace(tf, enable, "enable"); 
sc_trace(tf, b, "b"); 
sc_trace(tf, output, "output"); 



sc_close_vcd_trace_file(tf); 

cout << "The result from the ALU is: " << output.read(); 
} 

有没有错误,当我构建它。但是每当我尝试执行它时,我都会收到以下错误:

错误:(E112)get interface failed:port is bound:port'myALU.port_0'(sc_in) In file:sc_port.cpp:231

回答

4

该错误消息

Error: (E112) get interface failed: port is not bound: port 'myALU.port_0' (sc_in) 

意味着端口myALU.port_0未绑定到的信号。但是alu模块中的哪个端口对应于port_0

不管您使用哪种类型的硬件描述语言,命名所有端口和信号都是一种很好的做法,可以使这样的错误更容易诊断。

名称在alu构造的端口:

SC_CTOR(alu) : 
    op("op"), 
    a("a"), 
    b("b"), 
    output("output") 
{ 
    // ... 

我无法重现你看到的错误。我看到这个错误(所有端口和信号提供名称之后):

Error: (E115) sc_signal<T> cannot have more than one driver: 
signal `signal_5' (sc_signal) 
first driver `myShifter.dout' (sc_inout) 
second driver `myALU.b' (sc_inout) 

我注意到在你的代码的一些其他问题:

  • 您的代码不编译,因为使用了错误的变量名在alu_method()
  • sc_start()sc_main()中未被调用。
  • 存在无效sensitive呼叫alu() - 应该是sensitive << a << b << op;
+0

任何想法如何命名端口阵列(具体地讲,所有阵列成员)? op [0](“op_0”)似乎不起作用。 – ysap

+0

发现此问题:http://stackoverflow.com/q/35425052/274579。有评论表明,在SC中没有好的解决方案。 – ysap

+1

'sc_core :: sc_vector > op'对此很有效。使用op(“op”,3“)初始化它,并且这三个元素得到名字'op_0','op_1'和'op_2'。 – DarrylLawson

0

问题是与用于ALU的灵敏度列表

应该已经

敏感< <一个< < b < <运算;