事务报文初始化(配置空间)

张开发
2026/4/20 19:27:49 15 分钟阅读

分享文章

事务报文初始化(配置空间)
事务报文通过C接口函数send_txn发送出去所有事务报文都是pcie_express_cpp_tr类对象注意以前说的是pcie_express_cpp_trans。PCIe设备可访问的资源包括了配置空间寄存器内存空间MMIO寄存器IO空间寄存器。我们注意到这是其他PCIe设备通过PCIe总线发起的PCIe TLP事务可以访问到PCIe设备的寄存器。自身配置寄存器的事务站在PCIe设备应用层来看也需要发起对PCIe设备内部自身的配置空间寄存器。代码如下//发送一个写事务将配置空间的Verdor_ID寄存器写为0x1234 pci_express_cpp_tr wrtr1; wrtr1.type CFG_WR_SELF; wrtr1.addr 0x00; (wrtr1.data).push_back(0x1234); __RootComplex-send_txn(wrtr1); //发送一个读事务读出配置空间的Verdor_ID寄存器数值 pci_express_cpp_tr rdtr1; rdtr1.type CFG_RD_SELF; rdtr1.addr 0x00; __RootComplex-send_txn(rdtr1);根据上述代码自身配置寄存器读写事务并不是PCIe TLP事务该事务仅仅访问BFM中的配置寄存器BFM并不会将该事务转发到PCIe信号总线上。addr偏移量就是配置空间头部寄存器偏移量配置空间头部寄存器参见PCI规范另外上述代码并没有实现完整的读过程而仅仅是发送一个读事务读回来的数据要通过调用回调函数来获取相应的响应报文。需要注意地址按照32位进行编码例如如果要访问自身配置寄存器BAR0偏移量并不是0x10而是0x04。配置事务如果希望通过BFM向PCIe信号总线上发送配置事务此时访问的就不是自己配置空间寄存器而是其他PCIe设备配置空间寄存器就需要参考如下代码//发送一个配置寄存器写事务 pci_express_cpp_tr cfgtr1; cfgtr1.addr 0x000010; cfgtr1.type CFG_WR_0; (cfgtr1.data).push_back(0xfffc0000); cfgtr1.length 1; __RootComplex-send_txn(cfgtr1); //发送一个配置寄存器读事务 int tag; pci_express_cpp_tr cfgtr2; cfgtr2.addr 0x000010; cfgtr2.type CFG_RD_0; cfgtr2.length 1; __RootComplex-send_txn(cfgtr2); tag cfgtr2.tag; //发送读事务后可能要保留tag配置读写事务的地址为配置地址空间地址上述代码0x000010为第一个PCI槽位的BAR0寄存器地址这个地址是按照总线号设备号功能号寄存器偏移量来编码的。非Post类型事务的tag用于跟踪非Post事务并通过回调函数获得相应的响应报文。也就是说非Post响应报文的tag和非Post事务的tag保持一致。

更多文章