2016-01-22 179 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 < <運算;