tag 标签: 配置空间

相关博文
  • 热度 4
    2019-8-8 12:46
    5222 次阅读|
    0 个评论
    学习PCI配置空间(TSK_TX_TYPE0_CONFIGURATION_READ)
    PCI总线定义了两类配置请求,一个是Type00h配置请求,另一个是Type 01h配置请求。 其中HOST主桥或者PCI桥使用Type 00h配置请求,访问与HOST主桥或者PCI桥直接相连的PCI Agent设备或者PCI桥;而使用Type 01h配置请求,需要至少穿越一个PCI桥,访问没有与其直接相连的PCI Agent设备或者PCI桥。在PCI总线中,只有PCI桥能够接收Type 01h配置请求。Type 01h配置请求不能直接发向最终的PCI Agent设备,而只能由PCI桥将其转换为Type 01h继续发向其他PCI桥,或者转换为Type 00h配置请求发向PCI Agent设备。 我们在看ursapp_tx代码的时候,发现有很多地方用的Type0配置读和写这两个子程序,后面会给出详细代码。对于配置空间里的基本配置空间需要详细了解。在PG54的45页有详细的说明,下图就是截取于PG054: 注意上图中BAR0到BAR5的地址,分别是从h'10、h'14、h'18、h'1C、h'20、h'24.。下面给出Type0配置读子程序详细代码,注意代码中trn_td的位宽是128bit,在64bit模式中,需要两次赋值,每次64bit,总共128bit。 /************************************************************ Task : TSK_TX_TYPE0_CONFIGURATION_READ Inputs : Tag, PCI/PCI-Express Reg Address, First BypeEn Outputs : Transaction Tx Interface Signaling Description : Generates a Type 0 Configuration Read TLP *************************************************************/ task TSK_TX_TYPE0_CONFIGURATION_READ; input tag_; input reg_addr_; input first_dw_be_; begin if (trn_lnk_up_n) begin $display(" : Trn interface is MIA", $realtime); $finish(1); end TSK_TX_SYNCHRONIZE(0, 0, 0); trn_td <= #(Tcq) { 1'b0,//对应TLP头中第一个字节的R 2'b00,//对应TLP头中的FMT,这里是7系器件,通用定义R和FMT合并在一处 5'b00100,//对应TLP头中的Type 1'b0,//对应TLP头第二个字节里的R 3'b000,//对应TLP头中的TC 4'b0000,//对应TLP头中的R+Attr2+R+TH 1'b0,//对应TLP头中的TD 1'b0,//对应TLP头中的EP 2'b00,//对应TLP头中的Attr 2'b00,//对应TLP头中的AT 10'b0000000001, // 32,对应TLP头中的Length COMPLETER_ID_CFG, tag_, 4'b0000, first_dw_be_, // 64 COMPLETER_ID_CFG, 4'b0000, reg_addr_ , 2'b00, 32'b0 }; trn_tsof_n <= #(Tcq) 0; trn_teof_n <= #(Tcq) 0; trn_trem_n <= #(Tcq) 2'b01; trn_tsrc_rdy_n <= #(Tcq) 0 ; TSK_TX_SYNCHRONIZE(1, 1, 1); trn_tsof_n <= #(Tcq) 1; trn_teof_n <= #(Tcq) 1; trn_trem_n <= #(Tcq) 2'b00; trn_tsrc_rdy_n <= #(Tcq) 1; end endtask // TSK_TX_TYPE0_CONFIGURATION_READ 为了更好地理解上述代码,我们还需要了解一个概念,即 TLP(Transaction Layer Packet) 。 当处理器或者其他PCIe设备访问PCIe设备时,所传送的数据报文首先通过事务层被封装为一个或者多个TLP,之后才能通过PCIe总线的各个层次发送出去。 一个完整的TLP由1个或者多个TLP Prefix(由协议引入,FPGA开发可以不关注)、TLP头、Data Payload(数据有效负载)和TLP Digest组成。TLP头是TLP最重要的标志,不同的TLP其头的定义并不相同。TLP头包含了当前TLP的总线事务类型、路由信息等一系列信息。在一个TLP中,Data Payload的长度可变,最小为0,最大为1024DW。 TLPDigest是一个可选项,一个TLP是否需要TLP Digest由TLP头决定。DataPayload也是一个可选项,有些TLP并不需要DataPayload,如存储器读请求、配置和I/O写完成TLP并不需要Data Payload。 TLP头由3个或者4个双字(DW)组成。其中第一个双字中保存通用TLP头,其他字段与通用TLP头的Type字段相关。一个通用TLP头由Fmt、Type、TC、Length等字段组成,如下图(截取PG054第46页,这是典型32位地址存储器写请求TLP格式)所示。需要注意的是,上述代码的格式和下图的不太一样,除了第一个DW外,其它2个或3个DW都与具体的Type类型有关。 如果存储器读写TLP支持64位地址模式时,TLP头的长度为4DW,否则为3DW。而完成报文的TLP头不含有地址信息,使用的TLP头长度为3DW。 FMT=“00” 表示 TLP大小为3个双字,不带数据。 “01” 表示 TLP大小为4个双字,不带数据。 “10” 表示 TLP大小为3个双字,带数据。 “11” 表示 TLP大小为4个双字,带数据。 FMT和Type详细解码如下: 下面介绍Length字段的意义,如此对应TLP基本就有个大概认识了: 在存储器读请求TLP中并不包含Data Payload,在该报文中,Length字段表示需要从目标设备数据区域读取的数据长度;而在存储器写TLP中,Length字段表示当前报文的DataPayload长度。Length字段的最小单位为DW。当该字段为n时,表示需要获得的数据长度或者当前报文的数据长度为n个DW,其中0代表0x3FF。值得注意的是,当n等于0时,表示数据长度为1024个DW。 上述代码中Length字段是1,读取某个BAR空间状态信息,将返回一个DW的信息。在TSK_BAR_SCAN子函数里,使用Type0配置读,扫描各个BAR并将扫描得到的信息存储在全局变量中,以备后续使用。 关于PCIe的基础知识,这里有篇文章,介绍的非常好:https://blog.csdn.net/cllovexyh/article/details/79828833
  • 热度 16
    2013-12-1 19:10
    6643 次阅读|
    2 个评论
    概述          当一个板卡出入到一个PCI、PCI-X或者PCI-E总线的时候,通过自动向配置空间读出和写入来完成总线的配置。在altera wiki上看到一篇关于pcie配置空间的文章,由于自己对于pcie是新手,想办法把自己的理解尽量写出来,有错误之处在所难免。 表头和性能寄存器集( Header Capability Register Sets )     When a capability register set is enabled it is tied together by a linked list starting with an 8-bit pointer at address 34h in the configuration space header. Each capability structure set also has a unique Capability ID To find the next capability pointer we look at the base address of the capability register set and add an offset of 01h When you reach a capability structure with an ID of 10h then you have reached the PCI Express Capability Structure When you reach a capability structure with Next Capability Pointer of 00h then you have reached the end of the linked list 。 实例演示寄存器配置空间          1、首先查看地址34h,从这个地址空间中得到一个8-bit目标数据,即下一个capability寄存器设置,如图1所示,该目标数据为50h。 图1:          2、根据图1所示,我们跳到地址50h,如图2所示,从该地址查到一个capability ID为05h(即MSI Capability Structure)。接着我们察看下一个capability指针,即51h,我看到该地址存放的数据是78h,那么我们跳到该指针处。   图2 3、我们跳到指针78h处,如图3所示,在该指针处,我们得到一个Capability ID为01h(即Power Management Capability Structure)。接着我们在79h处察看下一个capability指针,并找到其地址为80h,跳到80h处。 图3          4、我们跳到80h处,如图4所示,在该地址处我们得到一个Capability ID值为10h(即PCI Express Capability Structure)。我们看到地址81h处的指针值为00h,表示已经到了连接表的末尾了。   图4   参考 http://www.alterawiki.com/wiki/PCI_Configuration_Space
相关资源
  • 所需E币: 4
    时间: 2019-12-26 01:07
    大小: 106.23KB
    上传者: givh79_163.com
    查看PC本机安装的各PCI设备配置空间的小工具,支持Win98NT2K……
  • 所需E币: 3
    时间: 2019-12-25 15:54
    大小: 1.23MB
    上传者: 2iot
    PCI总线规范,纯中文的,肯定很多人需要!"#$%&'()*+,-./0123456789:.:*;>?(@AB789CDEF7GHIJKL$%MNOILPBQRSTU>?VWXY789ZQ=[\]34^Q:.:_78XY`;abcde*$%Lfcg+hiDjklmtLuv)cgwxyz@{|}~/23\`*789Ls,=/Q!""#!""ZQ$[/"$\'(78¤[;$%$%§Q%&¨$%$%§Q%!¨'[]°#±]#}5$%$%,$%'()T*36T+,((()S*Q)-,,.)*TS*/0(1,.)*mFQsQF?s]c×!t?*§F")/*]FQF"àFá[]dF.c;QFem×è)¤é*eê1-)rì*í_)=ò'[]óè3.¤÷÷[ù3úìLER[ü]g023%4]¤Q2F$%eò);e/]QtBERü5024,0640……