编辑
2024-03-04
SystemC
00
请注意,本文编写于 374 天前,最后修改于 374 天前,其中某些信息可能已经过时。

目录

SystemC模块
SystemC_Module.cpp
结果

SystemC模块

systemC模块:

  1. 最小的功能容器,具有用于分层连接的状态、行为和结构。
  2. 一个C类,它继承了一个systemC基本类:sc_module
  3. SystemC的主要结构构件。
  4. 用于表示实际系统中的组件。

如何定义systemC模块:

  1. SC_MODULE(module_name){}:它使用systemC定义的宏"SC_MODULE",它是#2的设备。
  2. Struct module_name: public sc_module{}:继承sc_moduleStruct
  3. module_name: public sc_module {public:}:继承sc_module的类。 注意,与struct的“public”相比,class的默认访问控制模式为“private”,与struct的“public”不同。

如何使用systemC模块:

  1. sc_module的对象只能在细化过程中构造。在模拟过程中实例化模块是错误的。
  2. 每个直接或间接从sc_module派生的类都应该至少有一个构造函数。每个构造函数应该有且只有一个sc_module_name类的参数,但可以有sc_module_name以外的其他类的参数。
  3. 一个字符串值的参数应该传递给每个模块实例的构造函数。如果存在这样的变量,则使该字符串名称与引用模块的C变量名称相同是一种良好的做法。
  4. 模块间通信通常应该使用接口方法调用来完成;也就是说,模块应该通过其端口与其环境通信。其他通信机制是允许的,例如,用于调试或诊断目的。

SystemC_Module.cpp

c++
#include <systemc> using namespace sc_core; SC_MODULE(MODULE_A) { // 方法#1,使用systemC提供的SC_MODULE宏 SC_CTOR(MODULE_A) { // 默认构造函数 std::cout << name() << " constructor" << std::endl; // Name()返回对象名称,该名称在实例化期间提供 } }; struct MODULE_B : public sc_module { // 方法#2,使用c语法,可读性更强 SC_CTOR(MODULE_B) { std::cout << name() << " constructor" << std::endl; } }; class MODULE_C : public sc_module { // 方法#3,使用class代替struct public: // 必须显式声明构造函数为public SC_CTOR(MODULE_C) { std::cout << name() << " constructor" << std::endl; } }; int sc_main(int, char*[]) { // 系统入口点 MODULE_A module_a("module_a"); // 声明并实例化module_a,通常的做法是分配模块名==对象名 MODULE_B module_b("modb"); // 声明并实例化module_b,模块名!=对象名 MODULE_C module_c("module_c"); // 声明并实例化module_c sc_start(); // 在本例中可以跳过这一点,因为模块实例化发生在精化阶段,在sc_start之前 return 0; }

结果

c++
SystemC 2.3.3-Accellera --- Oct 4 2020 22:59:38 Copyright (c) 1996-2018 by all Contributors, ALL RIGHTS RESERVED module_a constructor modb constructor module_c constructor

本文作者:古月流新

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!