[0036] 需要说明的是,每一C++线程对应一个C++线程函数,SystemC线程具体可以为sc_thread、sc_method、sc_cthread。SystemC线程和C++线程函数协调配合,虚拟平台通过C++线程函数调用硬件加速器或者FPGA中的API函数从而配合硬件实现真正的多通道通信。需要说明的是,在仿真过程中,所述SystemC线程始终处于唤醒状态,C++在simulation阶段,根据具体需求处于阻塞状态或唤醒状态。需要说明的是,elaboration和simulation是现有的SystemC kernel执行程序的两个必经的阶段,且先执行elaboration阶段,elaboration阶段执行结束后,执行simulation阶段,simulation阶段执行完毕后,结束程序执行,具体细节在此不再赘述。
[0037] 所述C++线程为生产线程,在simulation阶段,所述C++线程进入唤醒状态,用于生成数据,并存储至对应的线程安全容器中,当所述线程安全容器的数据量符合SystemC线程对应的预设数据量需求时,对应的C++线程进入阻塞状态。需要说明的是,elaboration和simulation是现有的SystemC kernel执行程序的两个必经的阶段,且先执行elaboration阶段,elaboration阶段执行结束后,执行simulation阶段,simulation阶段执行完毕后,结束程序执行,具体细节在此不再赘述。
[0038] 所述SystemC线程为消费线程,在simulation阶段,所述SystemC线程周期性获取对应的线程安全容器中的数据量,当对应的线程安全容器中的数据量符合SystemC线程对应的预设数据量需求时,所述SystemC线程从所述线程安全容器中读取数据进行处理,当读取完毕时,所述SystemC线程向对应的C++线程发送唤醒指令,对应的C++线程继续生成数据并存储至对应的线程安全容器中。
[0039] 需要说明的是,所述SystemC线程基于预设的硬件周期,周期性地获取对应的线程安全容器中的数据量。作为一种实施例,所述硬件周期为硬件时间周期或者基于SystemC线程内部机制触发预设的sc‑event事件,实现所述预设的硬件周期。作为一种实施例,所述C++线程中配置有对应的C++线程的预设数据量需求信息,
[0040] 当所有C++线程结束仿真后,通知systemc线程停止仿真,程序安全退出。
[0041] 图3示出了一个systemc线程和一个C++线程实现实施例二的组成的系统结构,可以理解的是,根据C++线程、线程安全容器数量和连接关系的不同,可以基于图3做出适应性调整,不再一一列出。
[0042] 需要说明的是,现有的SystemC kernel原来只有SystemC的单线程,只能模拟硬件的并发状态,而不能实现软件的并发,数据的产生在CPU上是有执行顺序的,软件上仍然是单线程。本发明中除了SystemC线程,至少还包括一个C++线程,基于多个线程实现数据并发传输,提高了虚拟平台与硬件联合仿真的传输带宽,进而提高了传输速率。
[0043] 作为一种实施例,所述SystemC线程和C++线程之间进行数据交互,实现资源共享与同步时,SystemC线程和C++线程之间的交互需要符合以下约束规则:所述SystemC线程中不能调用C++线程的wait函数,例如condition_variable.wait函数。所述C++线程不能调用SystemC sc_event的notify函数和SystemC的wait函数。如果不满足上述约束,则会出现线程死锁,仿真程序则无法正常进行。
[0044] 需要说明的是,SystemC kernel需要将仿真的开始和结束通知C++线程,从而保证C++线程在elaboration阶段和simulation阶段合理访问SystemC的资源。作为一种实施例,当elaboration阶段开始时,所述SystemC线程向所述C++线程发送elaboration阶段开始指令,所述C++线程处于阻塞状态;当simulation阶段开始时,所述SystemC线程向所述C++线程发送simulation阶段开始指令,当所述C++线程收到所述SystemC线程的唤醒指令时,进入唤醒状态。需要说明的是,在elaboration阶段可以构建对应的C++线程,完成后,在进入simulation阶段之前,C++线程需要处于阻塞状态,也即这个过程中,C++线程不可以从对应的线程安全容器中读取数据,因为如果C++线程在elaboration阶段从对应的线程安全容器中读取数据,则有可能会产生数据错误,因此,C++线程需要明确获知SystemC kernel对应的处理阶段。
[0045] 作为一种实施例,所述线程安全容器包括线程锁,具体的,可以将线程安全容器封装在一个预设的线程锁中,得到线程安全容器。所述线程锁用于在对应的线程安全容器存储的数据符合SystemC线程对应的预设数据量需求时,控制对应的C++线程不能向所述线程安全容器中存储数据,在所述C++线程从对应的线程安全容器中存储数据的过程中,控制所述SystemC线程不能向对应的线程安全容器中读取数据。
[0046] 作为一种实施例,所述SystemC线程用于向所述C++线程发送对应的SystemC线程对应的预设数据量,当所述C++线程监测到对应的线程安全容器存储的数据符合SystemC线程对应的预设数据量需求时,所述C++线程进入阻塞状态,不能向所述线程安全容器中存储数据。
[0047] 作为一种实施例,所述线程安全容器以queue(队列)、vector(数组)、map(key‑value形式)、list(链表)等存储结构存储数据,具体结构基于所述系统的具体组成结构来确定。
[0048] 实施方式一、
[0049] N=M,每一C++线程对应一个线程安全容器,所述SystemC线程定向向每一线程安全容器读取对应的数据,也即每一C++线程对应一个独立的线程安全容器,根据具体应用场景,配置所述SystemC线程定向向每一线程安全容器读取数据。例如,每一C++线程需要存储的数据均不相同,那么每一线程安全容器中存储的数据也均不相同。再如,在某些场景下,需要从多个C++线程中获取相同的数据,则此时可以向对应的多个C++线程所对应的多个线程安全容器存储相同的数据。此种实施方式下,线程安全容器的存储结构存储数据可以为queue、vector、map或list中的任意一种。
[0050] 实施方式二、
[0051] M < N,所述线程安全容器对应一个或多个C++线程,当所述线程安全容器对应多个C++线程时,所述多个C++线程共享一个线程安全容器,需要说明的是,对于多个C++线程共享一个线程安全容器的情况,C++线程需要配置为map形式的数据结构,若M=1,则所有的C++线程共享一个线程安全容器。线程安全容器对应一个C++线程的情况下,线程安全容器的存储结构存储数据可以为queue、vector、map或list中的任意一种。
[0052] 实施例二适用于数据从C++线程流向systemc线程,即数据流从硬件流向虚拟平台的场景,基于多个线程实现数据从C++线程流向systemc线程的并发传输,提高了虚拟平台与硬件联合仿真的传输带宽,进而提高了传输速率。
[0053] 需要说明的是,实施例一和实施例二可以组合使用,实施例一和实施例二中未提及的,在另一实施例中有详细描述的相同技术细节均可相互适用,不再重复赘述。
[0054] 以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。