[systemc][tlm2.0]父模块与子模块的实现

一、windows下环境配置

尝试1:

visual studio 配置systemc环境:systemC学习笔记3 vs开发环境搭建 - 知乎 (zhihu.com)

(32 封私信 / 80 条消息) 流浪码农 - 知乎 (zhihu.com)

之前配置总是不通过,不知道是不是因为systemc版本的问题,2.3.3上述文章中说新版本systemc不支持很多

尝试2:

报错很多,使用systemc2.3.0(3条消息) Windows Visual Studio 2017 下搭建SystemC环境_能吃能睡不能学的博客-CSDN博客

打开时提示必须要对2.3.0版本中的文件进行更改以适应visual studio 更改后systemc2.3.0编译不通过,×

尝试3:

最终成功使用systemc:使用systemc2.3.3,使用example中的文件,at_mixed_targets,打开文件时提示升级。。以适应visual studio,按默认配置进行,按照下述过程进行配置,其中<一劳永逸>中无目标Microsoft.Cpp.Win32.user文件,按照每次重新配置的方法,经过编译,获得目标输出(3条消息) Windows Visual Studio 2017 下搭建SystemC环境_能吃能睡不能学的博客-CSDN博客

二、建立父模块与子模块框架

1、 使用simple_与tlm_initiator_socket

其中tlm_initiator_socket没有回调函数,需要显示继承tlm::tlm_bw_transport_if<>, tlm::tlm_fw_transport_if<>,显示继承后,需要定义纯虚函数

其中initiator部分:

target部分:

top绑定

其中需要注意:(1)simple_initiator/target_socket的绑定方式为init_socket(tar_socket);tlm_initiator/target_socket的绑定方式为init_socket.bind(tar_socket);当两者混合使用,与tlm_initiator/target_socket相关的均采用.bind方式;(2)绑定前后关系均为from(to)

 上述是tlm_initiator/target_socket的实现,来源于《IEEE Standard for Standard SystemC® Language Reference Manual》,simple_initiator/target_socket的实现较简单,见模型建立流程部分总结笔记

各种debug

(1) 但是在实现过程中遇见,“不允许使用抽象类类型”,报错

根据(3条消息) c++ 错误提示:不能使用抽象类对象_后青春了的博客-CSDN博客

检查纯虚函数是否填写完整 ,发现原来是拼写返回值TLM_COMPLETE时的拼写错误

(2) 编译后,提示错误: LNK2019    无法解析的外部符号 "public: enum tlm::tlm_sync_enum __thiscall bmod_target1::targetNBTransport(class tlm::tlm_generic_payload &,class tlm::tlm_phase &,class sc_core::sc_time &)" (?targetNBTransport@bmod_target1@@QAE?AW4tlm_sync_enum@tlm@@AAVtlm_generic_payload@3@AAVtlm_phase@3@AAVsc_time@sc_core@@@Z),函数 "public: __thiscall bmod_target1::bmod_target1(class sc_core::sc_module_name)" (??0bmod_target1@@QAE@Vsc_module_name@sc_core@@@Z) 中引用了该符号    parent-child   \parent-child\sc_main.obj    1    

发现原来是simple_target_socket注册的回调函数未定义

(3)继续编译,又报错:0x7C598E66 (vcruntime140d.dll)处(位于 parent-child.exe 中)引发的异常: 0xC0000005: 读取位置 0xFFA1F7B0 时发生访问冲突。

查找,可能是堆栈使用存在问题 

(3条消息) 读取/写入位置发生访问冲突_gkzscs的博客-CSDN博客_发生访问冲突

测试是否是子模块new之后未释放

总是在sc_start 和sc_thread处报错,转到linux下eclipse试试

linux下报错 有关simple_target_socket

发现是忘记在头文件中加入:#define SC_INCLUDE_DYNAMIC_PROCESS

需要在所有.h文件中加上,并且需要在 include systemc.h头文件之前,不能在cpp文件中使用该语句

原因是在systemc库升级到2.1时,官方文件说是为了头文件引用的正确性,还是不清楚确切的原因是什么:

困扰我三天的问题,错误就出在这里,以前也遇见过,但是又忘了,所以说,总结流程步骤,核对流程步骤的重要性

有时会报一些错误,已经在.h中引用过的头文件,还需要在引用过该.h文件的.cpp中再引用一次,不知道问题是什么

debug 一下,验证成功,在windows里同样测试一下,还是不行,不知道怎么弄了,暂时放弃windows下的debug

2、使用multi_passthrough_initiator/target_socket

官方给出的例子如下:

 

 

 

3、使用tlm_initiator/target_socket

systemc2.3.3库中的 at_mixed_targets等例子都是采用这种方式连接父模块与子模块

三、总结

目前在网上查找实现父模块与子模块端口绑定的方式有这三种方法,经过测试实现了第一种方法,第二和第三种方法有待验证,但本身我对multi_passthrough_initiator/target_socket了解和使用不多,可以继续开发。

另外,附上过程中所见到的套接字属性

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值