在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声明,这变得合法了。
转载于:https://blog.51cto.com/13824643/2137420