systemC三態建模
阿新 • • 發佈:2018-07-07
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
並且在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三態建模