Learn SystemC - SC_HAS_PROCESS

本文为英文版本翻译,原文地址:SC_HAS_PROCESS

文章目录

SC_HAS_PROCESS

SC_HAS_PROCESS在systemC v2.0版本中引入,该宏只有一个参数:模型类的名称。它与SC_CTOR的定义分别如下:

#define SC_CTOR(user_module_name)  \
	typedef user_module_name SC_CURRENT_USER_MODULE; \
	user_module_name( ::sc_core::sc_module_name )
#define SC_HAS_PROCESS(user_module_name)  \
	typedef user_module_name SC_CURRENT_USER_MODULE

由以上两个宏定义可以发现:

  1. 两者都将输入的模型名称定义为SC_CURRENT_USER_MODULE,该定义在注册成员函数到仿真内核时会使用到。注册成员函数到仿真内核使用以下的宏:
    SC_METHOD/SC_THREAD/SC_CTHREAD
  2. SC_CTOR同时声明了一个默认的构造函数,该构造函数只有一个参数:模型名称
    a) SC_CTOR减少使用者一行代码去声明构造函数,当使用SC_HAS_PROCESS时,使用者不得不声明一个类似如下的构造函数
    module_class_name(sc_module_name name, 其它参数...)
    b) 英文SC_CTOR声明了默认构造函数,所以它只能出现在类的定义中

建议

  1. 如果模型类中没有仿真进程(通过SC_METHOD/SC_THREAD/SC_CTHREAD注册到仿真内核的成员函数),那么就不使用SC_CTORSC_HAS_PROCESS
  2. 若实例化时不需要额外的参数(即除了模型名称),就使用SC_CTOR
  3. 若需要额外的参数,就使用SC_HAS_PROCESS

下面看下具体示例:

// Learn with Examples, 2020, MIT license
#include <systemc>
using namespace sc_core;

SC_MODULE(MODULE_A) { // 没有仿真过程的模型,不需要SC_CTOR,SC_HAS_PROCESS
  MODULE_A(sc_module_name name) { // c++ style constructor, the base class is implicitly instantiated with module name.
    std::cout << this->name() << ", no SC_CTOR or SC_HAS_PROCESS" << std::endl;
  }
};

SC_MODULE(MODULE_B1) { // 只有模型名称参数的构造函数
  SC_CTOR(MODULE_B1) { // 声明构造函数:MODULE_B1(sc_module_name)
    SC_METHOD(func_b); // 注册成员函数到仿真内核
  }
  void func_b() { // define function
    std::cout << name() << ", SC_CTOR" << std::endl;
  }
};

SC_MODULE(MODULE_B2) { // 只有模型名称参数的构造函数
  SC_HAS_PROCESS(MODULE_B2); // 没有声明构造函数
  MODULE_B2(sc_module_name name) { // 显示声明构造函数,同样通过sc_module_name实例化基类
    SC_METHOD(func_b); // register member function
  }
  void func_b() { // define function
    std::cout << name() << ", SC_HAS_PROCESS" << std::endl;
  }
};

SC_MODULE(MODULE_C) { // 多个参数模型
  const int i;
  SC_HAS_PROCESS(MODULE_C); // 其实也可以使用SC_CTOR, SC_CTOR会定义一个可能不会使用的构造函数:MODULE_A(sc_module_name);
  MODULE_C(sc_module_name name, int i) : i(i) { // 定义构造函数
    SC_METHOD(func_c); // register member function
  }
  void func_c() { // define function
    std::cout << name() << ", additional input argument" << std::endl;
  }
};

SC_MODULE(MODULE_D1) { // SC_CTOR在类头,构造函数实现在类头外
  SC_CTOR(MODULE_D1);
  void func_d() {
    std::cout << this->name() << ", SC_CTOR inside header, constructor defined outside header" << std::endl;
  }
};
MODULE_D1::MODULE_D1(sc_module_name name) : sc_module(name) { // 构造函数. "sc_module(name)" 可选
  SC_METHOD(func_d);
}

SC_MODULE(MODULE_D2) { // SC_HAS_PROCESS在类头
  SC_HAS_PROCESS(MODULE_D2);
  MODULE_D2(sc_module_name); // 声明constructor
  void func_d() {
    std::cout << this->name() << ", SC_CTOR inside header, constructor defined outside header" << std::endl;
  }
};
MODULE_D2::MODULE_D2(sc_module_name name) : sc_module(name) { // 构造函数. "sc_module(name)"可选
  SC_METHOD(func_d);
}

SC_MODULE(MODULE_E) { // SC_HAS_PROCESS和构造函数定义在类头外
  MODULE_E(sc_module_name name); // c++ style constructor declaration
  void func_e() {
    std::cout << this->name() << ", SC_HAS_PROCESS outside header, CANNOT use SC_CTOR" << std::endl;
  }
};
MODULE_E::MODULE_E(sc_module_name name) { // constructor definition
  SC_HAS_PROCESS(MODULE_E); // 这里不可使用SC_CTOR
  SC_METHOD(func_e);
}

int sc_main(int, char*[]) {
  MODULE_A module_a("module_a");
  MODULE_B1 module_b1("module_b1");
  MODULE_B2 module_b2("module_b2");
  MODULE_C module_c("module_c", 1);
  MODULE_D1 module_d1("module_d1");
  MODULE_D2 module_d2("module_d2");
  MODULE_E module_e("module_e");
  sc_start();
  return 0;
}

运行结果:

module_a, no SC_CTOR or SC_HAS_PROCESS
module_b1, SC_CTOR
module_b2, SC_HAS_PROCESS
module_c, additional input argument
module_d1, SC_CTOR inside header, constructor defined outside header
module_d2, SC_CTOR inside header, constructor defined outside header
module_e, SC_HAS_PROCESS outside header, CANNOT use SC_CTOR
<think> 我们正在处理一个关于SystemC版本不匹配的编译错误。根据引用内容,用户的环境是:gcc 9.2, VCS 2023.3, SystemC 2.3.3, UVM 1.1。错误信息指出系统检测到的SystemC版本是'230'(即2.3.0),但VCS支持的版本是2.2和2.3.1,并且没有找到SystemC模型。 错误分析: 1. **Error-[SC-SYSCAN-VERSION] Incorrect SystemC version**: 这个错误表明VCS的`syscan`命令检测到的SystemC版本不被支持。 2. 具体信息:`The SystemC version '230' is not supported`,说明当前尝试使用的SystemC版本是2.3.0(230表示2.3.0)。 3. 支持版本:`systemc-2.2 (IEEE-1666-2005): -sysc=2.2` 和 `systemc-2.3.1 (IEEE-1666-2011): -sysc=2.3.1`。 4. 另一个错误:`Note-[SC-VCS-NO-SYSC] No SystemC models found`,这表明没有找到SystemC模型,可能是因为版本不匹配导致编译过程中未正确识别。 可能的原因: - 用户安装的SystemC版本是2.3.3,但VCS 2023.3可能只支持到2.3.1(根据错误信息,它明确支持2.3.1,但不支持2.3.0,更不用说2.3.3了)。然而,错误信息中却显示检测到的是2.3.0(230),这很奇怪。 - 另一种可能是,用户的环境变量(如`SYSTEMC_HOME`)指向了一个旧版本的SystemC(2.3.0)或者VCS在查找SystemC时找到了一个不兼容的版本。 解决方案: 1. **确认SystemC安装版本**:检查`SYSTEMC_HOME`指向的SystemC版本。用户可以通过以下命令查看: ```bash echo $SYSTEMC_HOME ls $SYSTEMC_HOME/include ``` 在include目录下,通常有一个名为`systemc`的目录,检查其内容或者查看`systemc`目录中的版本信息。另外,也可以查看`$SYSTEMC_HOME/INSTALL`或`README`文件来确认版本。 2. **确保使用支持的版本**:根据错误信息,VCS支持2.2和2.3.1。因此,用户需要安装2.3.1版本(因为2.3.3不被明确支持)。用户可以到SystemC官网下载2.3.1版本,并设置`SYSTEMC_HOME`指向新安装的路径。 3. **在编译时指定版本**:使用`syscan`命令时,通过`-sysc`参数指定版本。例如,如果使用SystemC 2.3.1,则添加`-sysc=2.3.1`。 4. **重新编译SystemC库**:如果用户下载了2.3.1版本,需要按照SystemC的安装说明进行编译(使用相同的gcc版本,即9.2)。通常步骤: ```bash tar xvf systemc-2.3.1.tar.gz cd systemc-2.3.1 mkdir build && cd build ../configure --prefix=/path/to/install/systemc-2.3.1 CXX=g++ CC=gcc make make install ``` 然后设置`SYSTEMC_HOME`为安装路径(例如`/path/to/install/systemc-2.3.1`)。 5. **确保VCS使用正确的库**:在VCS编译命令中,确保通过`-sysc=2.3.1`指定版本,并且链接到正确位置的库。 示例编译命令可能如下(参考引用[2]中的方法): ```bash vcs -sverilog -ntb_opts uvm-1.1 \ -sysc=2.3.1 \ -LDFLAGS "-L$SYSTEMC_HOME/lib-linux64 -lsystemc" \ -CFLAGS "-I$SYSTEMC_HOME/include" \ ...其他文件... ``` 或者如果使用`syscan`来编译SystemC模型: ```bash syscan -sysc=2.3.1 your_systemc_file.cpp vcs ... [其他选项] ... -sysc=2.3.1 ... ``` 6. **检查VCS版本是否支持SystemC 2.3.3**:虽然错误信息没有提到2.3.3,但用户实际安装的是2.3.3。如果用户希望使用2.3.3,需要确认VCS 2023.3是否支持。查阅VCS 2023.3的发布说明,或者尝试在编译命令中指定`-sysc=2.3.3`(如果支持的话)。但是根据错误信息,目前只支持2.2和2.3.1,所以很可能需要降级到2.3.1。 7. **关于UVM和UVMC**:引用[2]提到使用UVMC,并且没有提前编译为动态库,而是通过`syscan`编译为`uvmc.o`。因此,在编译命令中需要包含UVMC相关文件。但当前错误是SystemC版本问题,因此先解决版本问题。 8. **注意gcc版本兼容性**:引用[2]提到低版本VCS可能不支持gcc9.2,但用户使用的是VCS2023.3,应该支持。不过,编译SystemC库时使用的gcc版本必须和VCS使用的gcc版本一致(这里都是9.2)。 总结步骤: - 步骤1:安装SystemC 2.3.1,并设置`SYSTEMC_HOME`。 - 步骤2:在编译命令中明确指定`-sysc=2.3.1`。 - 步骤3:确保VCS命令正确链接到SystemC库(通过`-LDFLAGS`和`-CFLAGS`设置路径)。 如果用户坚持使用SystemC 2.3.3,则需要确认VCS是否支持。如果不支持,则只能使用2.3.1。 相关问题: 1. 如何检查Linux系统中安装的SystemC版本? 2. VCS编译SystemC/UVMC混合仿真时有哪些常见错误? 3. 如何设置环境变量`SYSTEMC_HOME`? 4. 为什么在VCS中需要指定SystemC版本? </think>### `Error-[SC-SYSCAN-VERSION]` 报错原因分析及解决方案 #### 核心问题:SystemC版本不兼容 该报错的根本原因是**VCS工具链与SystemC库版本不匹配**。具体表现为: ```bash Error-[SC-SYSCAN-VERSION] Incorrect SystemC version The SystemC version '230' is not supported Supported are: systemc-2.2 (IEEE-1666-2005): -sysc=2.2 systemc-2.3.1 (IEEE-1666-2011): -sysc=2.3.1 Note-[SC-VCS-NO-SYSC] No SystemC models found ``` #### 关键原因分解 1. **版本号解码错误** `'230'` 表示SystemC 2.3.0,但VCS 2023.3仅明确支持: - **2.2.x**(对应`-sysc=2.2`) - **2.3.1**(对应`-sysc=2.3.1`)[^2] 虽然用户实际安装的是SystemC 2.3.3,但VCS错误解析为2.3.0。 2. **编译检测机制冲突** VCS的`syscan`命令通过检测`systemc`头文件中的版本宏(如`SC_VERSION`)进行版本校验。不同版本的头文件存在宏定义差异: ```cpp // SystemC 2.3.1 头文件示例 #define SC_VERSION_ORIGINATOR "Accellera" #define SC_VERSION_MAJOR 2 #define SC_VERSION_MINOR 3 #define SC_VERSION_PATCH 1 ``` 2.3.3的头文件可能包含VCS无法识别的版本标识。 3. **库文件链接失败** `No SystemC models found`表明: - VCS未找到有效SystemC实现库(`.so`或`.a`) - 版本不匹配导致自动扫描失败[^1] --- ### 解决方案 #### 方法1:强制指定兼容版本(推荐) 在编译命令中显式声明兼容版本: ```bash syscan -sysc=2.3.1 your_module.cpp # 声明使用2.3.1接口规范 vcs -sysc=2.3.1 top_module.sv # 统一版本标识 ``` 这会绕过自动检测,直接使用2.3.1的ABI接口规范。 #### 方法2:源码级版本适配 修改SystemC头文件版本标识(需管理员权限): 1. 定位头文件: ```bash find $SYSTEMC_HOME -name systemc # 典型路径:/path/to/systemc/include/systemc ``` 2. 编辑`sc_version.h`: ```cpp // 修改版本宏定义 #define SC_VERSION_MAJOR 2 #define SC_VERSION_MINOR 3 #define SC_VERSION_PATCH 1 // 伪装成2.3.1 ``` #### 方法3:升级VCS工具链 若环境允许,升级至支持SystemC 2.3.3的VCS版本: ```bash # 检查VCS更新(需License支持) vcs -version # 确认当前版本 ``` 需验证2023.3之后的版本是否已添加2.3.3支持。 --- ### 根本原因图示 ```mermaid graph TD A[VCS syscan] -->|扫描头文件| B(SC_VERSION宏) B --> C{版本校验} C -->|2.3.1| D[通过编译] C -->|2.3.0/2.3.3| E[触发SC-SYSCAN-VERSION] E --> F[中断链接] F --> G[报错退出] ``` --- ### 预防措施 1. **版本兼容性矩阵** | Tool | SystemC支持版本 | 编译选项 | |-----------|----------------|---------------| | VCS 2023.3| 2.2.x / 2.3.1 | `-sysc=2.3.1` | | GCC 9.2 | 全版本 | N/A | 2. **环境隔离** 使用`module`管理多版本: ```bash module load systemc/2.3.1 # 显式加载指定版本 echo $SYSTEMC_HOME # 验证路径 ``` --- ### 相关问题 1. 如何检查当前SystemC的精确版本? 2. VCS编译时如何忽略版本检测? 3. SystemC 2.3.1与2.3.3的ABI兼容性如何? 4. 多版本SystemC库如何共存于同一系统?[^1] [^1]: 引用内容 [^2]: 引用内容
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值