1. 程式人生 > >systemC三態建模

systemC三態建模

bool 還需 情況 問題 自定義 oid res toolbar base

在verilog或systemVerilog中出現三態時我們需要使用wire語句聲明類型,而在systemC中則是需要使用logic類型。
並且在systemC中我們還需要另外的一些類型用於多驅動的情況,這些類型會自動處理相關的多驅動問題:
sc_signal_rv sc_signal_resolved
sc_out_rv sc_out_resolved
sc_inout_rv sc_inout_resolved

其中resolved為一位類型,rv為多位類型,它們用於多驅動的情況。

這在建立總線模型時十分有用,下面就給出一個使用systemC三態建模的示例:

#include "base.h"
#ifndef TRISTATE
#define TRISTATE
SC_MODULE(tristate_driver){
    sc_in<bool> ready , dina , dinb ; //  多個輸入信號
    sc_out <sc_logic> selectx ;    //  輸出端口,由於
    void prc_selectx();
    
    SC_CTOR(tristate_driver){
        SC_METHOD(prc_selectx);
        sensitive<<dina<<dinb;      //  對dina和dinb輸入敏感
    }
};
#endif

####################################################################################

#include "tristate.h"
void tristate_driver::prc_selectx(){    
    if(ready)   selectx = SC_LOGIC_Z ;     //   如若沒有ready那麽則是高阻態,沒有輸出
    else        selectx = sc_logic(dina.read()&dinb.read());   
}

最後的仿真結果:

技術分享圖片

這裏沒有用到多驅動,只是使用了logic類型使得,在沒有ready時輸出為高阻態。

下面是多驅動時的建模:

#include "base.h"
#ifndef MULTI
#define MULTI
const int BUSSIZE = 4 ;
SC_MODULE(multi_driver){
    sc_in<bool> a_ready , b_ready ;
    sc_in<sc_uint<BUS_SIZE> a_bus , b_bus ;
    sc_out_rv<BUS_SIZE> > z_bus ;
    //  port resolved !!!  端口自定義為可判斷類型的端口,自動判別驅動類型
    //  sc_signal_rv 具有相同的功能
    void prc_a_bus();
    void prc_b_bus();
    SC_CTOR(multi_driver){
        SC_METHOD(prc_a_bus);
        sensitive<<a_bus;
        SC_METHOD(prc_b_bus);
        sensitive<<b_bus;
    }
};
#endif

############################################################################################

#include "multi.h"

void multi::prc_a_bus(){   
 if( a_ready )  z_bus = a_bus.read() ;    
 else           z_bus = "ZZZZ"  ;   //  literal form   字面量賦值方式
}

void multi::prc_b_bus(){    
    if( b_ready )   z_bus = b_bus.read() ;    
    else       z_bus = "ZZZZ" ;
}

可以看出有兩個進程方法在對同一個端口進行輸出,但是由於輸出端口使用了多驅動的rv聲明,這變得合法了。

systemC三態建模