9.3 sc_signal_resolved, sc_signal_rv
有时需要有多个writers,SystemC提供了专门的通道sc_signal_resolved和sc_signal_rv<>。
SystemC的逻辑值解析表:
9.4 Template Specializations of sc_signal Channels
模板特殊化发生在当为一个明确的模板值提供了定义时,如果有多于一个模板变量在其中,我们称之为部分特殊化。 例如,sc_signal 有单一的模板变量表示typename。SystemC 为sc_signal
Sc_signal
值得注意的是sc_buffer不支持这种特殊化。
(十)结构 Design Hierarchy
10.1 Module Hierarchy 模块层次
SystemC的设计层次使用模块的实例作为父模块成员数据,也就是说,要建立一个层次级别,应在父模块中创建一个表示子模块的sc_module对象。
模块实例化在构造函数中发生,可以把构造函数的执行代码写在头文件或.cpp文件中.
C++提供了两种方法來示例模块,首先一个模块对象可以直接由声明创建,另一种是模块对象可通过指针或动态分配被间接引用。
10.2 Direct Top-Level Implementation
direct instantiation 直接实例化
10.3 Indirect Top-Level Implementation
main 中有间接实例化(indirect instantiation),
这种设计增加了两行语法:一个指针声明,一个通过new创建的实例。
10.4 Direct Sub-Module Header-Only Implementation
C++语义在直接方法中需要使用初始化列表, 当处理子模块时,变得更加有趣。
10.5 Indirect Sub-Module Header-Only Implementation
对sub-module header-only 案例,间接使用使得实例化读取变得简单些
10.6 Direct Sub-Module Implementation
在之前所讲的方法中,缺点是构造函数体会呈现给所有潜在用户。可以把构造函数写道.cpp文件中,这时需用到SC_HAS_PROCESS。
10.7 Indirect Sub-Module Implementation
10.8 Contrasting Implementation Approaches
(十一)通信 端口
11.1 Communication: The Need for Ports
端口就是指向模块外某一通道的指针。
端口连接模块内的进程(行为)和通道(通信)
模块的端口使数据能够在模块间通过,模块之间通过信号将端口连接起来。端口分为in、out和inout三种类型,如果需要将某一个端口的数据赋给模块自身的其它信号,那么该端口就应该是inout类型。
端口必须与特定的通道接口相连,或者同父模块的端口相连。一个模块的端口连接到零个、一个或者多个通道,或者零个、一个或者多个父模块的端口,但必须至少连接到1个通道或者父模块的端口上 。
11.2接口: C++ and SystemC
如果一个类没有数据成员,只包含纯虚函数,那么称这个类是接口类。
在多态性上接口具有强大的功能。C++中,多态指一个衍生类可以由父类的成员函数执行。
SystemC接口是一个抽象类,继承于sc_interface,只提供纯虚方法的声明,由SystemC的通道和端口引用。不提供实现和数据。
SystemC通道是实现一个或多个SystemC接口类并继承于sc_channel或sc_prim_channel的类。通道实现继承接口类的所有方法。
接口的特性是不牵扯具体实现;所以它能够联系行为与通信 接口的实现:C++中的抽象类 。(抽象类和纯虚函数)
抽象类的特点是它定义了一组抽象方法(这里”方法”是C++中的一个名词,通常理解为类的成员函数),但不定义这些方法的具体实现(这里实现指的是给出成员函数的函数体部分)
通道(channel)实现一个或者多个接口 。
11.3 简单的 SystemC 端口声明
SystemC端口是继承于SystemC接口的一个类。语法如下:
11.4 Many Ways to Connect
模块端口
进程通道
接口是一个C++抽象类,它定义了一组抽象方法,但不定义这些方法的具体实现。
通道实现一个或者多个接口。也就是说,通道必须继承一个或者多个接口,这些接口中定义的抽象方法必须在通道中实现。 端口总是与一定的接口类型相关联的,端口只能连接到实现了该类接口的通道上。
通过端口,模块中的进程可以连接到通道并使用通道提供的方法
11.5 端口关联机制
关联(Association)基本等于连接(Connect),也称为绑定(Bind)。
关联(Association)分为位置关联和名字关联。名字关联就是按照名字一一对应;位置关联就是按照端口定义的顺序一一对应。
位置关联在一个只有少量端口的模块的初始化中是非常合适的,它能够使描述简单化。然而在对一个有大量端口的模块的初始化中使用位置关联将是非常危险的,因为实际工作中设计者可能会不经意间修改了模块的端口的顺序,这时就会产生关联错误,而这种错误很可能是很难发现的。遇到这种情况最好使用下文所述的名字关联。所以对于一个大的SystemC项目,一般建议统一的使用名字关联。
当模块和通道都实例化后模块将被连接到通道。
11.6 从进程内部访问端口
端口访问语法:
(十二)端口 Specialized & sc_export
12.1 标准接口 1. sc_fifo 接口
sc_fifo
sc_fifo_out_if<>接口,提供了从一个模块输出到一个sc_fifo<>的所有方法。 模块通过write()或nb_write()将数据输入到FIFO。num_free()显示有多少空闲单元。