使用TLM2时出现'b_transport不是simple_initiator_socket成员'错误求助
问题原因与解决方案
错误根源
tlm_utils::simple_initiator_socket 是TLM2提供的封装类socket,它本身并不直接包含b_transport成员方法。b_transport属于tlm::tlm_fw_transport_if接口的成员,simple_initiator_socket只是作为连接载体,需要通过它获取底层的发起端接口才能调用该方法。
修正方案
方案1:在Initiator模块内部实现事务发起逻辑(推荐)
规范的TLM2设计中,发起端的事务逻辑应该封装在Initiator模块内部,通过socket的重载箭头操作符访问底层接口:
SC_MODULE(Initiator) { tlm_utils::simple_initiator_socket<Initiator> initiatorSocket; SC_CTOR(Initiator) { // 用SC_THREAD或SC_METHOD触发事务发起 SC_THREAD(run_transaction); } void run_transaction() { tlm::tlm_generic_payload payload; sc_time delay = SC_ZERO; // 必须先正确配置payload(地址、数据、命令等,示例仅做编译演示) payload.set_address(0x0); payload.set_data_length(4); // ...其他payload配置 // 通过重载的->操作符访问底层接口,调用b_transport initiatorSocket->b_transport(payload, delay); } };
方案2:在TopLevel中直接获取接口调用(仅用于测试场景)
如果一定要在TopLevel中调用,需要通过socket的get_base_interface()方法获取底层发起端接口:
SC_MODULE(TopLevel) { Memory* memory; Initiator* initiator; SC_CTOR(TopLevel) { memory = new Memory("Memory"); initiator = new Initiator("Initiator"); initiator->initiatorSocket.bind(memory->targetSocket); tlm::tlm_generic_payload p; // 配置payload必要参数 p.set_address(0x0); p.set_data_length(4); // 获取底层接口后调用b_transport initiator->initiatorSocket.get_base_interface()->b_transport(p, SC_ZERO); } };
补充说明
- simple_initiator_socket的设计目的是简化发起端socket的使用,隐藏接口细节,因此所有事务方法都需要通过其暴露的接口访问,而非直接调用socket对象的成员。
- 实际使用中务必正确配置
tlm_generic_payload的各项参数(地址、数据长度、传输命令等),否则即使编译通过,仿真也会出现错误。
内容的提问来源于stack exchange,提问作者hades
相关产品推荐
相关产品推荐

