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>接口。如下面的准代码:
- template <class T>
- class sc_signal: publ sc_signal_inout_if<T>,
- public sc_prim_channel
- {
- public:
- ……}
sc_signal_inout_if<T>接口是sc_signal_in_if<T>的扩展,其定义如下:
- template <class T>
- class sc_signal_in_if : virtual public sc_interface
- {
- public:
- // get the value changed event
- virtual const sc_event& value_changed_event() const = 0;
- // read the current value
- virtual const T& read() const = 0;
- // get a reference to the current value (for tracing)
- virtual const T& get_data_ref() const = 0;
- // was there a value changed event?
- virtual bool event() const = 0;
- protected:
- // constructor
- sc_signal_in_if(){}
- private:
- // db
- sc_signal_in_if( const sc_signal_in_if<T>& );
- sc_signal_in_if<T>& operator = ( const sc_signal_in_if<T>& );
- };
- template <class T>
- class sc_signal_inout_if
- : public sc_signal_in_if<T>
- {
- public:
- // write the new value
- virtual void write( const T& ) = 0;
- protected:
- // constructor
- sc_signal_inout_if(){}
- private:
- // disabled
- sc_signal_inout_if( const sc_signal_inout_if<T>& );
- sc_signal_inout_if<T>& operator = ( const sc_signal_inout_if<T>& );
- };
其中最重要的成员函数有read()、write(),其次还有event()和value_changed_event()。
前面章节给出了较多sc_signal<T>的例子,这里不再给出。
sc_signal_rv<T>是所谓解析的信号通道,它允许同时有多个端口连接到其上并进行写操作。sc_buffer<T>继承与sc_signal<T>,只是重载了write()和update()函数,代码如下:
- template <class T>
- inline void sc_buffer<T>::write( const T& value_ )
- {
- #ifdef DEBUG_SYST
- this->check_writer();
- #endif
- this->m_new_val = value_;
- this->request_update();
- }
- template <class T>
- inline void sc_buffer<T>::update()
- {
- this->m_cur_val = this->m_new_val;
- this->m_value_changed_event.notify_delayed();
- this->m_delta = this->simcontext()->delta_count();
- }
通过比较可以发现sc_buffer<T>不管write()写的数据是否与原数据相同,都要求进行数据更新,而sc_signal<T>首先要检查新数据是否与原数据相同,如果不同才进行更新。这是sc_signal<T>与sc_buffer<T>的唯一区别。
- 上一篇:SystemC-sc_mutex
- 下一篇:SystemC-基本通道