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>的静态规则检查部分的源代码:
- template <class T>
- inline
- void
- sc_fifo<T>::register_port( sc_port_base& port_,
- const char* if_typename_ )
- {
- sc_string nm( if_typename_ );
- if( nm == typeid( sc_fifo_in_if<T> ).name() ) {
- // only one reader CAN be connected
- if( m_reader != 0 ) {
- SC_REPORT_ERROR( SC_ID_MORE_THAN_ONE_FIFO_READER_, 0 );
- }
- m_reader = &port_;
- } else { // nm == typeid( sc_fifo_out_if<T> ).name()
- // only one writer can be connected
- if( m_writer != 0 ) {
- SC_REPORT_ERROR( SC_ID_MORE_THAN_ONE_FIFO_WRITER_, 0 );
- }
- m_writer = &port_;
- }
- }
SystEMC约定:当一个端口与一个通道相连接,这时相应通道的:register_port()函数就会被调用。用户可以自己重载这个函数进行专门的静态设计规则检查。这里typeid( sc_fifo_in_if<T> )返回类型为const type_info&。下面是type_info的定义如下:
- class type_info {
- publIC:
- virtual ~type_info();
- int operator==(const type_info& rhs) const;
- int operator!=(const type_info& rhs) const;
- int before(const type_info& rhs) const;
- const char* name() const;
- const char* raw_name() const;
- private:
- ...
- };
这是编译器保存类型信息的数据结构。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>检查该规则的代码:
- template <class T>
- inline
- void
- sc_signal<T>::register_port( sc_port_base& port_, const char* if_typename_ )
- {
- #ifdef DEBUG_SYSTEMC
- sc_string nm( if_typename_ );
- if( nm == typeid( sc_signal_inout_if<T> ).name() ) {
- // an out or inout port; only one can be connected
- if( m_output != 0 ) {
- sc_signal_invalid_writer( name(), kind(),
- m_output->name(), port_.name() );
- }
- m_output = &port_;
- }
- #endif
- }
与sc_signal<T>对应的是sc_signal_rv<N>,它允许任意多个sc_in<T>、sc_out<T>和sc_inout<T>与它相连。
通过重载register_port(),用户可以定义自己所需要的静态规则检查。
本文关键字:暂无联系方式电脑-单片机-自动控制,电子学习 - 基础知识 - 电脑-单片机-自动控制