在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());   
}

最后的仿真结果:

Screenshot from 2018-07-07 09-03-32.png

这里没有用到多驱动,只是使用了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声明,这变得合法了。