学海荡舟手机网
导航

主页 > 电子设备技术 > 电器电路基础 > > 详细内容

sc_signal<T>、sc_signal_rv<T>和sc_buffer

      sc_signal<T>是最最基本的通道,它用于连接模块的基本端口sc_in<T>、sc_out<T>和sc_inout<T>。这里强调一下sc_signal<T>的设计规则:最多只有一个sc_out<T>或者sc_inout<T>可以连接到sc_signal<T>,否则就会产生典型的多驱动情况,sc_signal<T>可能会在同一时刻被赋予不同的值,导致系统行为的不确定性。可以有多个sc_in<T>同时连接到sc_signal<T>,这将导致一个信号的值被赋给多个信号,这是允许的,也是应该的。
      sc_signal<T>继承了基本通道基类,并实现了sc_signal_inout_if<T>接口。如下面的准代码:

  1. template <class T>  
  2. class sc_signal: publ sc_signal_inout_if<T>,  
  3.  public sc_prim_channel  
  4. {  
  5. public:  
  6. ……} 


      sc_signal_inout_if<T>接口是sc_signal_in_if<T>的扩展,其定义如下:

  1. template <class T>  
  2. class sc_signal_in_if : virtual public sc_interface  
  3. {  
  4. public:  
  5.   // get the value changed event  
  6.     virtual const sc_event& value_changed_event() const = 0;  
  7.     // read the current value  
  8.     virtual const T& read() const = 0;  
  9.    // get a reference to the current value (for tracing)  
  10.     virtual const T& get_data_ref() const = 0;  
  11.     // was there a value changed event?  
  12.     virtual bool event() const = 0;  
  13. protected:  
  14.     // constructor  
  15.     sc_signal_in_if(){}  
  16.  
  17. private:  
  18.     // db  
  19.     sc_signal_in_if( const sc_signal_in_if<T>& );  
  20.     sc_signal_in_if<T>& operator = ( const sc_signal_in_if<T>& );  
  21. };  
  22. template <class T>  
  23. class sc_signal_inout_if  
  24. public sc_signal_in_if<T>  
  25. {  
  26. public:  
  27.     // write the new value  
  28.    virtual void write( const T& ) = 0;  
  29.  
  30. protected:  
  31.     // constructor  
  32.     sc_signal_inout_if(){}  
  33.  
  34. private:  
  35.    // disabled  
  36.    sc_signal_inout_if( const sc_signal_inout_if<T>& );  
  37.    sc_signal_inout_if<T>& operator = ( const sc_signal_inout_if<T>& );  
  38. }; 

  其中最重要的成员函数有read()、write(),其次还有event()和value_changed_event()。

      前面章节给出了较多sc_signal<T>的例子,这里不再给出。

      sc_signal_rv<T>是所谓解析的信号通道,它允许同时有多个端口连接到其上并进行写操作。sc_buffer<T>继承与sc_signal<T>,只是重载了write()和update()函数,代码如下:

  1. template <class T>  
  2. inline void sc_buffer<T>::write( const T& value_ )  
  3. {  
  4. #ifdef DEBUG_SYST  
  5.     this->check_writer();  
  6. #endif  
  7.     this->m_new_val = value_;  
  8.     this->request_update();  
  9. }  
  10.  
  11. template <class T>  
  12. inline void sc_buffer<T>::update()  
  13. {  
  14.    this->m_cur_val = this->m_new_val;  
  15.     this->m_value_changed_event.notify_delayed();  
  16.     this->m_delta = this->simcontext()->delta_count();  

  通过比较可以发现sc_buffer<T>不管write()写的数据是否与原数据相同,都要求进行数据更新,而sc_signal<T>首先要检查新数据是否与原数据相同,如果不同才进行更新。这是sc_signal<T>与sc_buffer<T>的唯一区别。


相关文章