您当前的位置:五五电子网电子知识电子学习基础知识电脑-单片机-自动控制SystemC静态规则检查 正文
SystemC静态规则检查

SystemC静态规则检查

点击数:7926 次   录入时间:11-27 08:57:15   整理:http://www.55dianzi.com   电脑-单片机-自动控制

      设计规则是指设计中不能够违反的设计法则,如一个sc_signal<T>只能被一个进程驱动,一个sc_fifo<T>只能连接一个读端口和一个写端口等。在设计中进行规则检查能够尽早发现设计中产生的一些不合理性。

      设计规则检查分为静态规则检查和动态规则检查。静态规则检查是指在系统运行前进行的静态检查,比如一个sc_fifo<T>只能连接一个读端口和一个写端口的检查。但是只有静态规则检查是不够的,有些规则检查必须在运行时间进行,这就是动态规则检查。比如一个sc_signal<T>只能被一个进程驱动这样的规则只能在运行时通过动态的进行检查。

      作为SystEMC的用户,首先要了解有哪些设计规则,在设计中不能够违反这些规则。其次用户在实际设计中也可以使用设计规则检查,以使自己的代码更好的满足设计要求。

      首先我们来看一个静态规则检查的例子。下面是基本通道sc_fifo<T>的静态规则检查部分的源代码:

  1. template <class T>  
  2. inline 
  3. void 
  4. sc_fifo<T>::register_port( sc_port_base& port_,  
  5.                 const char* if_typename_ )  
  6. {  
  7.    sc_string nm( if_typename_ );  
  8.     if( nm == typeid( sc_fifo_in_if<T> ).name() ) {  
  9.     // only one reader CAN be connected  
  10.     if( m_reader != 0 ) {  
  11.        SC_REPORT_ERROR( SC_ID_MORE_THAN_ONE_FIFO_READER_, 0 );  
  12.    }  
  13.    m_reader = &port_;  
  14.    } else {  // nm == typeid( sc_fifo_out_if<T> ).name()  
  15.     // only one writer can be connected  
  16.     if( m_writer != 0 ) {  
  17.        SC_REPORT_ERROR( SC_ID_MORE_THAN_ONE_FIFO_WRITER_, 0 );  
  18.    }  
  19.    m_writer = &port_;  
  20.    }  

      SystEMC约定:当一个端口与一个通道相连接,这时相应通道的:register_port()函数就会被调用。用户可以自己重载这个函数进行专门的静态设计规则检查。这里typeid( sc_fifo_in_if<T> )返回类型为const type_info&。下面是type_info的定义如下:

  1. class type_info {  
  2. publIC:  
  3.   virtual ~type_info();  
  4.    int operator==(const type_info& rhs) const;  
  5.   int operator!=(const type_info& rhs) const;  
  6.   int before(const type_info& rhs) const;  
  7.    const char* name() const;  
  8.    const char* raw_name() const;  
  9. private:  
  10.    ...  
  11. }; 

      这是编译器保存类型信息的数据结构。name()函数返回该结构的类型,当此类型与nm相等,这说明有一个合法的读端口要连接到通道sc_fifo<T>。但如果此时m_reader不为空,则说明在此之前已经有一个合法的读端口连接到sc_fifo<T>,这就违反了sc_fifo<T>只能连接一个读端口的原则,对于写端口也是同样的道理。

      下面我们来看看sc_signal<T>如何进行静态规则检查,要检查的规则为:只允许有一个sc_out<T>类型的端口连接到sc_signal<T>上。

      下面是类sc_signal<T>检查该规则的代码:

  1. template <class T>  
  2. inline 
  3. void 
  4. sc_signal<T>::register_port( sc_port_base& port_, const char* if_typename_ )  
  5. {  
  6. #ifdef DEBUG_SYSTEMC  
  7.     sc_string nm( if_typename_ );  
  8.     if( nm == typeid( sc_signal_inout_if<T> ).name() ) {  
  9.     // an out or inout port; only one can be connected  
  10.     if( m_output != 0 ) {  
  11.        sc_signal_invalid_writer( name(), kind(),  
  12.                       m_output->name(), port_.name() );  
  13.    }  
  14.    m_output = &port_;  
  15.    }  
  16. #endif  

      与sc_signal<T>对应的是sc_signal_rv<N>,它允许任意多个sc_in<T>、sc_out<T>和sc_inout<T>与它相连。

      通过重载register_port(),用户可以定义自己所需要的静态规则检查。




本文关键字:暂无联系方式电脑-单片机-自动控制电子学习 - 基础知识 - 电脑-单片机-自动控制