在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声明,这变得合法了。