介绍
Non-blocking传输接口旨在支持 approximately-timed 编码风格。Non-blocking传输就是将一个transaction 分解为多个phase,其中每个phase transition都与一个时间点相关联。对non-blocking传输方法的每次调用和返回都可能对应一个phase transition。
Non-blocking传输接口使用 forward path from initiator to target 和 the backward path from target to initiator。有两个不同的接口,tlm_fw_nonblocking_transport_if(froward path)和tlm_bw_nonblocking_transport_if(backward path)。
Non-blocking传输接口使用(a)non-const reference transaction; (b)timing annotation; (c) pahse(用于指示transaction状态),返回一个枚举值以指示函数的返回是否也表示阶段转换。
virtual tlm_sync_enum nb_transport_fw(TRANS& trans, PHASE& phase, sc_core::sc_time& t) = 0
virtual tlm_sync_enum nb_transport_bw(TRANS& trans, PHASE& phase, sc_core::sc_time& t) = 0
TRANS 和 PHASE template
systemc TLM提供了一种特定的事务类型tlm_generic_payload,简化模型之间的互操作性,同时提供了特定类型tlm_phase用于base protocol。
nb_transport_fw 和 nb_transport_bw call
nb_transport_fw用于前向路径,nb_transport_bw用于后向路径。在不需要区分这两种方法的情况下,斜体术语nb_transport用于描述这两种方法。- 在base protocol中, backward path 经过的socket 必须是 forwad 相反的过程,transaction 返回 initiator 时候,必须使用接收该transaction的socket进行传递。
- 在基本协议的框架下,规定了前向路径和后向路径必须以精确相反的顺序经过完全相同的组件和套接字序列。这意味着从发起方到目标方的前向传输路径,与从目标方返回发起方的后向传输路径,在组件和套接字的使用上是对称的。例如,若前向路径依次经过组件 A、套接字 S1、组件 B、套接字 S2 到达目标方,那么后向路径在返回时就应依次经过套接字 S2、组件 B、套接字 S1、组件 A 回到发起方。这种规定确保了事务在整个传输过程中的一致性和可追溯性,有助于维护系统的稳定性和可预测性。
- 每个组件在事务处理中承担着重要的路由责任。当事务需要返回发起方时,组件必须使用最初接收该事务的目标套接字来进行路由。这一要求保证了事务能够按照正确的路径返回,避免出现路由混乱或错误。例如,组件 B 在接收到来自组件 A 通过套接字 S1 转发的事务后,若该事务在处理后需要返回发起方,组件 B 必须通过套接字 S1 将事务路由回去,而不能使用其他套接字。这样的机制使得整个系统在处理事务时能够保持有序和准确,确保每个事务都能在正确的路径上流动,从而实现系统各部分之间的有效通信和协作,提高系统的可靠性和性能。
- Non-blocking传输接口主要用于处理pipelined transaction。具体而言,同一进程对
nb_transport_fw进行的多次连续调用,每次调用都能够发起单独的transaction,而无需等待第一个transaction完成。 - 原则上,transaction的最终时间点可以通过在forward path或backward path上对
nb_transport的调用或返回进行标记。
trans arguments
- transaction对象的生命周期可能会超出
nb_transport的返回时间,这样一系列对nb_transport的调用可以在initiator、interconnect和target之间forward和backward传递单个transaction对象。 - 如果某个transaction会在多次
nb_transport传递,这个trans arguments应该使用同一个transaction对象表示。
需要区分 transaction 和 transaction对象,transaction是一个抽象概念, transaction对象指的是CPP的一个
tlm_generic_payload
- 由于transaction对象的生命周期可能跨越对
nb_transport的多次调用,调用方或被调用方均更新该transaction对象。例如,对于tlm_generic_payload而言,在接收到读命令的情况下,目标方可以更新transaction对象的数据数组(read data),但不应更新命令字段(TLM_COMMAND)。
phase arguments
- 每次对
nb_transport的调用都会传递一个对phase 对象的引用。就base protocol而言,不允许使用相同phase对nb_transport进行连续调用。每个phase transition 都有一个与之相关联的时间点。使用sc_time参数的时间标注应当相对于阶段转换来延迟该时间点。 - Caller 和 callee都可以改变phase argument
对于 forward path, init 是caller, target 是calle; backward相反。
- phase arguments 用来告知各组件是否被允许读取或修改transaction的属性。如果某一协议的规则允许特定组件在某个特定phase修改transaction属性的值,那么该组件可以在该phase的任意时间进行修改,并且在该阶段内可修改任意次数。该协议应禁止其他组件在该phase读取该属性的值,只允许在下一阶段转换之后读取该值。
- phase arguments的值代表给定传输环节中protocol state machine的当前状态。当单个事务对象在两个以上组件(initiator、interconnect和target)之间传递时,每个传输环节(至少在概念上)都需要一个独立的protocol state machine。
- protocol state machine 是一种用于描述和控制协议执行过程中各种状态以及状态之间转换的工具。它是一种抽象的模型,就像一个按照严格规则运行的自动机。在网络协议、通信协议或者其他事务处理协议中,用于确定协议在不同阶段应该如何操作。
- 以网络通信中的 TCP(传输控制协议)为例。TCP 协议状态机包括诸如 “LISTEN(监听)”、“SYN - SENT(同步已发送)”、“ESTABLISHED(已建立连接)” 等状态。当客户端尝试与服务器建立连接时,它首先进入 “SYN - SENT” 状态,发送一个同步(SYN)数据包。服务器收到这个数据包后,如果允许连接,就会进入 “SYN - RECEIVED” 状态,并发送一个带有确认(ACK)和同步(SYN)的数据包。当客户端收到这个数据包后,进入 “ESTABLISHED” 状态,此时双方的连接就建立成功了。这个过程中,协议状态机严格控制着每个状态的转换,以及在每个状态下可以进行的操作(如发送或接收何种数据包)。
- phase对象通常对于调用方来说是局部的。对于给定事务的每次
nb_transport调用都可以有一个独立的phase对象。不同传输环节(hop)上相应的phase transitions 可能会在simulatuion time的不同时刻发生。
tlm_sync_enum return
- sychronization的概念在多处被提及。To synchronize就是将控制权交给 SystemC 调度器,以便其他进程能够运行,但synchronize对于temporal decoupling还有额外的含义
nb_transport的返回值含义是固定的,不会根据transaction类型或phase类型而变化。因此,以下规则并不局限于base protocol,而是适用于每一种non-blocking传输接口。- TLM_ACCEPTED 被调用方在调用期间不应修改事务对象的状态、阶段或时间参数。换句话说,TLM_ACCEPTED 表示未使用return path。调用方在调用后可以忽略
nb_transport各参数的值。 一般来说,在包含被调用方的组件能够对该transaction做出响应之前,调用方必须让出控制权(暂停执行)。对于基本协议而言,若被调用方正在忽略一个可忽略的阶段,则应返回 TLM_ACCEPTED。 - TLM_UPDATED 被调用方已经更新了事务对象。被调用方可能已经修改了阶段参数的状态,可能已经改变了事务对象的状态,并且可能在调用期间增加了时间参数的值。换句话说,TLM_UPDATED 表示正在使用返回路径,而且被调用方已经推进了与该事务相关联的protocol state machine的状态。被调用方是否确实有义务修改各个参数取决于具体的协议。在对
nb_transport进行调用之后,调用方应当检查阶段、事务以及时间这些参数,并采取相应的行动。 - TLM_COMPLETED 被调用方已更新事务对象,且事务已完成。 被调用方可能已经修改了事务对象的状态,并且可能在调用期间增加了时间参数的值。阶段参数的值是未定义的。换句话说,TLM_COMPLETED 表示正在使用返回路径,并且就特定的socket而言,该事务已完成。在对
nb_transport进行调用之后,调用方应当检查事务对象并采取相应的行动,但应当忽略阶段参数。无论是在前向路径还是后向路径上,都不应再通过当前套接字针对这个特定事务进行更多的传输调用。此处所说的 “完成” 并不一定意味着成功完成。因此,根据事务类型的不同,调用方可能需要检查嵌入在事务对象中的响应状态。 - 一般来说,并没有规定必须要通过让
nb_transport返回TLM_COMPLETED来完成一项事务。无论如何,当协议的最终阶段作为参数传递给nb_transport时,就某个特定的套接字而言,该事务就算是完成了。(对于基本协议来说,最终阶段是END_RESP。)换句话说,TLM_COMPLETED并非是强制要求使用的。