本节包含一个完整的简单设计,以演示SystemC中模块和进程的使用。
为了简单起见,它是非常低的水平 - 不是你通常在系统级设计语言期望的编码风格!
所展示的要点是
- 创建层次结构
- 所述sc_signal原始信道
- (专门)端口
- 进程(SC_METHOD,SC_THREAD,SC_CTHREAD)
- 一个简单的测试台(test bench)
SystemC背景
为什么要看模块和进程?原因在于SystemC的目的是要处理硬件和软件,并允许大型系统建模。
进程是与其他进程同时运行的小块代码。几乎所有开发的高级系统级设计(SLD)工具都使用了一个流程网络的基础模型。SystemC提供进程来支持构建独立(并行/并行)代码段的网络。
SLD需要处理大型设计。为了应付这种情况,通常使用层次结构。在SystemC中通过使用模块实现层次结构,该模块可以使用端口链接到其他模块。模块允许一个设计单独工作。模块可能包含进程和其他模块的实例。
示例设计
该设计由一个用四个与非门(NAND)实现的异或(EXOR)门组成。此外,重要的是要注意,这不是一个典型的设计风格 - 但它是好的,简单的理解。设计看起来像这样
第一步是模拟NAND门。与非门是一个组合电路; 其输出纯粹是输入值的函数。它没有记忆,也不需要时钟。正因为如此,该模型可以使用最简单的一种SystemC进程,SC_METHOD。
SC_METHOD只是C ++函数。因此,SystemC类库必须使它们像进程一样工作。尤其是
- SystemC类库包含一个模拟内核 - 一段代码,用于模拟时间的流逝,并调用函数来计算输ru发生变化时的输出。
- 该函数必须声明为SC_METHOD,并对其输入敏感。
这是NAND门的代码,在一个文件nand.h中
#include“systemc.h” SC_MODULE(nand2)//声明nand2 sc_module { sc_in <bool> A,B; //输入信号端口 sc_out <bool> F; //输出信号端口 void do_nand2()//一个C ++函数 { F.write(!(A.read()&& B.read())); } SC_CTOR(nand2)// nand2的构造函数 { SC_METHOD(do_nand2); //用内核注册do_nand2函数作 进程 sensitive << A << B ; //敏感表 } };
SystemC中的层次结构是使用类sc_module创建的。可以直接使用sc_module,也可以使用宏SC_MODULE “隐藏” 。上面的例子SC_MODULE创建一个名为nand2的sc_module类对象。
接下来是声明的输入和输出端口。通常,使用类sc_port声明一个端口。例如,使用