路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

vSV及UVM接口应用篇之二:DPI接口和C测试(下)

已有 1669 次阅读| 2018-6-10 18:01 |个人分类:验证系统思想|系统分类:芯片设计

多核并行处理实现

接下来我们还需要考虑更复杂的部分。如何实现多核并行处理呢?多核处理时,往往会遵循一些基本的规则:

  • 假定它们都在一个时钟域和电源域的情况下,它们会共同对时钟供给和复位触发做出相同的反应,例如在复位时同时跳转到程序入口执行。

  • 不同核之间在没有同步要求的情况下,是各自执行代码的。而在需要占用处理器子系统对外访问总线时,由于总线的唯一性,这就需要总线对不同核的访问做出仲裁,继而授予访问权。

  • 在真实情况下,系统的初始化会有主核来首先启动,继而依次初始化其它的核。在虚核的多核模拟仿真中,并不需要区分谁是主核,以及先后的启动顺序。


在接下来的代码中我们模拟了一个基本的多核并行方式,该子系统由两个核组成,它们之间对系统总线的优先级是平等的。在上面的virtual_core_pkg基础上,我们保留virtual_core类的定义,而修改了SV DPI方法的定义,便使得它可以支持多核的并行处理:



当在virtual_core_pkg中声明了关联数组virtual_core cores[int]之后,在调用DPI时需要传入额外的一个参数,即int id。该参数是为了从C一侧执行时,传入虚核的ID,通过id参数即可以有效索引正确的虚核,并另它执行方法。通过额外的参数传递,即可以解决多核并行处理的问题。相应地,virtual_core类也做了相应的更新用来支持多核处理。



virtual_core中添加了新的成员virtual_core::id,而在例化虚核时,会自动为其分配一个独一无二的id值同时将该实例的句柄装入到virtual_core_pkg::cores。这一行为方便了上面提到了通过virtual_core_pkg::cores来索引正确的虚核句柄。而在virtual_core::run_phase中也做了相应的更新,使得不同的核在复位之后,会执行相应的C函数,这就如不同核执行各自的程序一样。在这里,读者需要注意的是,关于复位的处理中,我们并没有更多地完善关于复位的细节,但希望读者注意到,针对处理器子系统在掉电之后的上电、又或者在软件复位之后,复位信号都可能多次触发,也因此关于复位的处理我们应当保持时刻监测和及时复位。


对于下面这段用来测试多核并行处理的C代码,输出结果与我们希望地一致。而有一点,即在多核同时请求总线UVC的访问权限时,仲裁的方式已经交给了UVC的sequencer,而sequencer自带的多种仲裁机制和可配置方法,可以很好地保证模拟多核访问总线时是按照轮询授权还是优先级授权等。



输出结果:



中断响应实现

对于中断的响应,我们需要再回顾之前在SV中提到的关于线程的控制方法,例如暂停、恢复和中断等。下面关于中断影响的实现,仍然基于之前的代码,我们在virtual_core_pkg分别添加了新的DPI方法、同时也更新了virtual_core类。新添加的主要代码如下:



从上面的代码中我们可以看到,新添加的代码包括了:

  • virtual_core类中关于添加中断线程信息、暂停或者恢复主线程coreX_thread()、以及中断监测处理的方法。通过这些方法可以使得在C一侧调用了中断安装dpi_install_irq()之后可以将有关中断的信息(中断服务程序、中断号)等留存下来,同时在监测到有效中断之后,可以做出将主程序暂停、继而转入中断C程序、在中断结束之后又可以返回到主程序中断处。通过SV的线程控制方式,我们可以来模拟虚核的中断行为。

  • 分别导出了dpi_install_irq()和导入了C一侧的serve_irq()方法。这两种方法分别用来从C到SV传入中断处理的信息,以及从SV到C调用相关中断的服务程序。


那么上面新添加的成员virtual_core::main_proc,指向的是哪个线程呢?我们提到的“主线程”即指的是正常的执行程序,也因此virtual_core::run_phase进行了如下更新:



可以看到,virtual_core::main_proc指向了coreX_thread()所在的线程,而virtual_core::suspend和virtual_core::resume的目标对象皆为virtual_core::main_proc。通过最后在test中触发中断信号和恢复中断,我们可以模拟中断信号的触发过程,而在C一侧的代码中,读者可以看到有关的函数定义和最终的仿真结果:



输出结果:



在上面的C测试代码中,我们首先安装了中断,继而在触发了中断信号之后,主程序在执行过程中跳入了中断服务程序irq_service,而在其中断结束之后(中断也应当恢复),也转回了主程序。从上面这个简单的例码中,读者可以看到通过SV和C之间的DPI方法互相调用、以及SV的线程控制方式,我们可以通过虚核来模拟真核的行为。


尽管在实际过程中,对于上述的几种真核的行为,我们需要考虑的因素和代码量远远多于上面的演示代码,但读者们可以通过这些简单的示例代码理解为何虚核可以做出同真核一样的行为。至于上电掉电,除了我们需要考虑上电和掉电时不同的边界信号状态(固定值)以外,也需要模拟一些特殊的power信号来表示不同的状态(动态值)。由于不同公司对于上电和掉电的状态定义实现有各自的差别,我们就不单独列举上电和掉电的实现方法了。


下一节《SystemC与UVM的TLM通信》我们将就上一篇中《跨平台的验证结构考量》一节谈到的,virtual prototying与simulation验证环境的混合仿真应用出发,来给读者们展示SystemC与UVM通过TLM2通信实现混合仿真的方法。


谢谢你对路科验证的关注,也欢迎你分享和转发真正的技术价值,你的支持是我们保持前行的动力。



点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 06:41 , Processed in 0.015352 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部