SystemC-多驱动


    在实际中多驱动也是很常见的。

     如下图,模块1~3的输出同时连接到信号result上,那么result的值到底应该如何选择呢?比如图中所示情况,driver2和driver3是关闭的,而只有driver1在驱动,所以result应该为0。

   

图1 一个多驱动的例子


    如果上图中driver2的值为1,那么这时result的值该如何决定呢?由于1与0的驱动强度一样,所以result应该为X。Syst定义的逻辑值解析表如下,它定义了多驱动情况下如何进行逻辑值解析。

表1 Syst的逻辑值解析

 

0 1 Z X
0 0 X 0 X
1 X 1 1 X
Z 0 1 Z X
X X X X X

    SystemC中引入了解析逻辑向量信号(Resolved Log Vector signal)来解决多驱动的问题。可以使用下面的方法定义解析型端口:
    sc_in_rv<n> x;  //x被定义为n比特宽的解析逻辑向量型输入端口
    sc_out_rv<n> y;  //y被定义为n比特宽的解析逻辑向量型输出端口
    sc_inout_rv<n> z; //z被定义为n比特宽的解析逻辑向量型双向端口
    这里n是任意正值。值得注意的是解析型的端口比普通的端口需要更多的仿真时间,如果不是必须,最好不要使用。

    类似的,解析型信号的定义方法如下:
    sc_signal_rv<n> x;  //宽度为n比特的解析型向量信号x。 
    下面举一个使用解析向量信号的例子,如图2-8。

图2 2选1的3态驱动输出逻辑

      给出源代码如下:

  1.   #ifndef __TRISTATE_H  
  2.   #define __TRISTATE_H  
  3.   #include <systemc.h>  
  4.   // Three-state buffer inference with resolved logic output  
  5.   #include "systemc.h"  
  6.  SC_MODULE(Tristate) {  
  7.     sc_in<bool> in_sela, in_selb;  
  8.     sc_in<bool> in_a;   
  9.     sc_in<bool> in_b;  
  10.     sc_out_rv<1> out_1;  
  11.   // Method for first three-state driver  
  12.     void tristate_a();  
  13.   // Method for second three-state driver  
  14.     void tristate_b();  
  15.   // Constructor  
  16.  SC_CTOR( Tristate) {  
  17.     SC_METHOD( tristate_a);  
  18.     sensitive << in_sela << in_a;  
  19.     SC_METHOD( tristate_b);  
  20.     sensitive << in_selb << in_b;  
  21.   }  
  22.   };  
  23.  void Tristate::tristate_a() {  
  24.      if (in_sela.read()){  
  25.   out_1.write(in_a.read());  
  26.      }else{  
  27.   out_1.write("Z");//SC_LOGIC_Z  
  28.    }  
  29.  }  
  30.   void Tristate::tristate_b() {  
  31.     if (in_selb.read()){  
  32.   out_1.write(in_b.read());  
  33.  }else{  
  34.  out_1.write("Z");  
  35.  }  
  36.  }  
  37. #endif