sc_fifo_in_if()提供了从sc_fifo<>写入一个模块的所有方法。模块通过read()会nb_read()从sc_fifo<>获取数据。
2. sc_signal 接口
实现接口sc_signal_in_if<>和sc_signal_out_if<>,另外还有第三个接口sc_signal_inout_if<>。
3. sc_mutex 和 sc_semaphore 接口
这两个接口都没有为敏感表提供任何事件方法,如果需要事件敏感表,必须自己写通道和接口。 sc_mutex_if
sc_semaphore_if
12.2 静态敏感表
端口和指针在elaboration阶段就初始化了,当敏感方法需要知道他们时,他们是不确定的。SystemC提供了一个特殊类解决该困难:sc_event_finder。 sc_event_finder让实际事件的确定延迟到elaboration之后。对接口定义的每一个事件都需要定义一个sc_event_finder,因此定义端口/接口的特殊化模板
来实例化端口,并且在该专门类中包含sc_event_finder。
SystemC允许指定一个端口名字当且仅当相关联的接口提供一个default_event()方法,该方法返回一个sc_event引用。标准接口sc_signal和sc_buffer提供了这个方法。
12.3 Specialized Ports专用接口
SystemC提供了专门模板用来在标准接口上提供端口定义,并且包含合适的event finders。
12.4 The sc_port<> Array
语法如下:
N不为0时,必须有N个通道连接到该端口上。 N=0时,允许任意多个通道到端口上。 size()可用来检测声明的端口大小。
12.5 SystemC Exports
sc_export是要把通道放在定义的模块的内部,并在外部就像通道一样使用该端口。关于export,每个sc_export都包含一个特殊接口。如果不需要连接,sc_export也允许创建隐藏接口。
语法如下:
12.6 连接
连接规则:
1.进程可以和同一模块内的其他进程通过通道进行通信。
2.进程可以和同一模块内的其他进程通信,使用事件同步信息交换 3.进程可以和更高层次的进程通信,通过由sc_port访问的接口 4. 5. 6. 7. 8.
9.
(十三)自定义通道和数据
13.2 中断-自定义的基本通道
如何在位于不同模块的进程间提供简单事件或中断。 一个通道必须有一个或多个接口来实现,理想的接口只为特定的目的提供需要的方法,对我们设计的通道,我们创建两个接口。一个接口用来发送事件,叫做ea_interrupt_gen_if,另一个接口用来接收事件,叫做ea_interrupt_evt_if。为了能够在静态敏感表中简单使用,可以指定default_event。
13.3 The Packet-SystemC自定义的数据类型
创建自定义的基本通道并不常见,但是创建一个sc_signal通道或sc_fifo却很常见。当和内建数据类型一起使用时,SystemC为这两种通道定义了所有必需的特征。对于自定义数据类型,SystemC需要对你的数据类型定义一些方法。 赋值操作符(operator=()) 相等操作符(operator==())
流输出(ostream&operator<<()) sc_trace(建议总是提供该方法)
13.4 The Heartbeat-自定义的分层通道
分层通道一定是继承于sc_channel,然而sc_channel仅仅是sc_module的一个宏定义。分层通道必须也要继承于一个接口,来让他们可以和sc_port一起使用。 简单来看,我们模拟一个简单的时钟或heartbeat。这个heartbeat通道发出一个简单的事件。
对该接口的头文件设计如下:
13.5 适配器-自定的基本通道
适配器是一种通道,专门用来在具有不同接口的模块间转化。 研究两种适配器:一种是使用evaluate-update机制的简单基本通道。另一种是分层通道。
对于很多简单通信,适配器只需要一些成员函数和“握手”来交换数据。
13.6 The Transactor-自定义的分层通道
当遇到更加复杂的通信时,需要使用分层通道。
Transactor允许测试平台把transactions转变成pin-level stimulus.
分层通道具有可见结构,可以包含进程,可以直接调用其它通道,它是一个实现了一个或者多个接口的模块 常见的分层通道有两种:
一是在一个通道中直接例化并使用其它通道,被例化的通道可以是分层通道,也可以是基本通道。这种类型的通道比较常见,被称为一般分层通道; 二是一个通道利用端口进行间接通道调用,调用穿越了一个以上的通道。被穿过的通道似乎被“合成”到了一起,这种通道是一种特殊的分层通道,称作合成通道(composite channel)。合成通道间接的体现了通道的层次性。 凡是例化了其它通道的通道都可以归入一般分层通道之列。
一个模块可以利用端口穿越了一个以上的通道进行间接通道调用。被穿过的通道似乎被“合成“到了一起。
(十四)
14.1 sc_clock 预定义的进程
在SystemC中,时钟被作为一个特殊的对象处理,它就是sc_clock类。 语法如下:
如果是在模块内部使用的,那么sc_clock必须在使用前定义和初始化。
14.2 钟控线程, the SC_CTHREAD
SC_CTHREAD继承于线程进程 SC_THREAD。
SC_CTHREAD只能在时钟的上升沿或者下降沿被触发或者激活,这种行为更加接近实际硬件的行为。引入钟控线程进程的目的是产生更好的行为综合(行为综合是从高层次描述综合为寄存器传输级描述的过程)
SC_CTHREAD的敏感表与其它类型的线程不同,它必须在指定线程名字的同时指定时钟和它的边沿 。
SC_CTHREAD在下一个时钟沿重启,如果想要停止SC_CTHREAD,需要调用halt()方法。
SC_CTHREAD进程中通常有一个死循环,但有时候需要初始化一些变量和信号,或者当某些条件满足的时候能够让进程从循环中跳出来。使用watching结构可以跳出循环。watching结构会不停地监视某一个条件,一旦该条件发生,则SC_CTHREAD进程就会跳出循环从进程的开始处重新执行。
SC_CTHREAD提供了监视信号的概念,当一个监视的信号激活时,执行跳到wait()返回后的新的位置而不是下一个语句。SystemC有两种监视:global和local。 全局监控的信号激活是在一开始就重启钟控进程。
相对的,一种更利于控制管理的监视形式使用四类宏:W_BEGIN, W_DO, W_ESCAPE, 和W_END。
当watching的条件成立的时候,整个进程就会重新开始运行,但有的时候会只需要局部代码重新运行,这时候就需要使用局部watching。
14.4 Debugging and Signal Tracing
SystemC允许将仿真结果保存为以下三种标准的波形格式: VCD (Value Change Dump)
WIF (Waveform Intermediate Format) ISDB (Integrated Signal Data Base) 通过三步获得VCD文件:
首先打开VCD文件,然后选择要追踪的信号,这两步在elaboration阶段完成;运行仿真阶段将会自动把选择的数据写入dumpfile。最后,关闭追踪文件。语法如下:
SystemC波形跟踪的特点:
只有在整个仿真期间都存在的信号和变量才能被跟踪,这与多数仿真器是一样的。它能够保证模块中的所有信号和数据成员都被跟踪。函数的本地变量只有在函数被调用期间才存在,所以不能跟踪。
任何类型的信号和变量包括标量、数组和其它聚合类型(如结构struct类型)都能被跟踪。
不同格式的波形文件可以在同一次仿真过程中同时产生,任何一个信号和变量都可以在不同格式的波形文件中不限制次数的被跟踪。
14.5 动态进程
14.6 SC_FORK/SC_JOIN
动态测试配置