前言
通过写博客,可以检查你是否了解设计,这像是一个提问题并自我解读的过程。 如果你提出问题但发现无法解决,则问题就在这里。例程是从某个IP内核开始的最佳方法,它可以用作以后设计的基础。
本文基于K7325tFPGA芯片进行分析的,7 Series Integrate Block for PCI Express核配置,本根据自己的理解分享Xilinx的例子代码和仿真分析,可将例子用于自己的工程项目上,本文章不注重讲解PCIE协议,只是结合PCIE协议,注重分析例子中的代码和仿真,PCIE配置成ROOT端,即FPGA作为主机,对设备端进行操作。
生成PCIE例子工程的步骤
1. 打开IP CORE进行设置
7 Series Integrate Block for PCI Express配置
2.点击该IP核,右键点击 Open IP Example Design,点击OK,即可生成例子工程。
标题
PCIE例子工程例子架构图
一、 PCIE系统架构
1.1 PCIE分层结构
PCIE结构
1.2 TLP包
四种TLP类型。
Memory (内存空间操作)
IO (IO空间操作)
Configuration (配置操作)
Message (信息操作)
四种类型TLP,如果有需要响应,称为Non-Posted TLP,如果没有需要响应,称为Posted TLP。
TLP包类型
1.2.1 TLP结构
TLP数据格式
1.2.2 Header各个字段的含义
Header格式
深色部分为公共部分,不同类型的TLP包格式在Header上对应不同字段。各个字段的含义:
标题
- Fmt:Format,决定头的数据大小,3DW和4DW
- Type:TLP类型。
- R:保留
- TC:传输优先级,数值越大,优先级越高
- Attr:属性,共3bit
- TH:指示何时包含TLP提示,以便让系统了解如何最好地处理这个TLP
- TD:是否接受CRC校验
- EP:如果EP=1,则应该认为伴随该数据的数据无效,事务被允许正常完成。
- AT:地址的种类
- Length:TLP负载的数据长度,单位DW (32bit)
- Last DW BE:
- 1st DW BE:在PCIe 总线以字节为基本单位数据传递,但是 Length 字段以 DW 为最小单位。为此TLP 使用 Last DW BE 和 First DW BE 返两个字段迕行字节使能,使得在一个 TLP中,有效数据以字节为单位。
标题
1.2.3 Memory TLP
标题
3dw与4dw区别在于地址的宽度不同。
Tag:Requester ID、Tag合起来组成Transaction ID,在同一时间段内,PCIe设备发出的每一个Non-Posted数据请求TLP,其Transaction ID必须唯一。也就是Tag必须唯一。
Request ID:该字段字段包含生成TLP报文的PCIe设备的总线号(Bus Number)、设备号(Device Number)和功能号(Function Number)。唯一的找到目标设备,那是因为不同的Endpoint设备空间会映射到Host内存空间的不同位置。
Memoty Write
例子:仿真模型的测试
Memoty仿真
S_axis_tx_tdata:face010f_60000001, 80000000_10000000, 00000000_12345678
可分析为:
{ Fmt ,Type } = 0110_0000;写TLP,4DW带数据
Length = 1dw,
{Requester ID, Tag} = face01
{Last DW BE, 1st DW BE} = 0f
Address [63:0] = 80000000_10000000
data负载= 12345678;
Memory Read
例子:仿真模型的测试
Memory仿真
S_axis_tx_tdata:face050f_20000001, 80000000_10000000,
可分析为:
{ Fmt ,Type } = 0010_0000;读TLP,4DW不带数据
Length = 1dw,
{Requester ID, Tag} = face01
{Last DW BE, 1st DW BE} = 0f
Address [63:0] = 80000000_10000000
无数据负载
1.2.4 Completion TLP
标题
字段含义:
compl Status:完成情况指示。000--成功完成;001--不支持该请求。其余情况可查阅规范。
000b (SC) Successful Completion:表示请求(Request)被正确的处理;
001b (UR) Unsupported Request:表示请求是非法的或者不能被Completer所识别的。在PCIe V1.1以及之后的版本将这作为Advisory Non-Fatal Error;
010b (CRS) Configuration Request Retry Status:Completer暂时不能响应的配置请求,需要Requester稍后再次尝试;
100b (CA) Completer Abort:Completer可以响应该请求,但是却发生了其他的错误,该错误是Uncorrectable Error。
Byte Count:是指还剩下多少字节的数据需要读取。其余字段可自行查阅规范。
例子:仿真模型的测试
标题
S_axis_tx_tdata:01000004_4a000001, 12345678_face0500,
可分析为:
{ Fmt ,Type } = 0100_1010;响应TLP,3DW带数据
响应读TLP,返回要读的数据。
compl Status = 3’b000(正确处理读TLP)
Byte Count = 4
Length = 1dw,
{Requester ID, Tag} = face05
{Last DW BE, 1st DW BE} = 0f
Data = 12345678
1.2.5 Message TLP
用于传输中断,错误,电源管理等信息。Header大小总为4DW
标题
字段含义
标题
例子:仿真模型的测试
标题
S_axis_tx_tdata:10ee0050_74000001, 00000000_00000000, 00000000_00000019
可分析为:
{ Fmt ,Type } = 0111_0100;信息TLP,4DW
Meaasage Code = 50
{Requester ID, Tag} = 10ee
由信息的命令的代码,此信息为电源设备信息。
1.2.6 Configuration TLP
配置TLP,Type 0是endpoint的配置,Type1为switch的配置。
主机软件访问pcie 设备的配置空间,RC会生成Configuration TLP与switch交互,进行配置设备的数据。
标题
字段含义
Ext Reg Number:它们提供DW空间的前四位,用于访问扩展的配置空间。它们与寄存器号结合,创建访问1024 DW(4096字节)空间所需的10位地址。对于pci兼容的配置空间,该字段必须为零。
Register Number:配置DW空间的较低的8位指定了寄存器号。最低的两个位总是零,强制dwl对齐访问。
Bus Number+Device Function Number 决定唯一目标设备。
例子:仿真模型的测试
标题
S_axis_tx_tdata:10ee000f_04000001, 00000000_01000000
可分析为:
{ Fmt ,Type } = 0000_0100;配置读TLP,3DW带数据
Length = 1dw,
{Requester ID, Tag} = 10ee00
{Last DW BE, 1st DW BE} = 0f
Address [31:0] =01000000
Data =00000000
标题
S_axis_tx_tdata:00000004_4a000001, ee101170_10ee0000
可分析为:
{ Fmt ,Type } = 0100_1010;响应配置读TLP,3DW带数据
Length = 1dw,
{Requester ID, Tag} = 10ee00
Data =ee101170(返回配置读数据)
标题
S_axis_tx_tdata:10ee000f_44000001, ffffffff_01000010
可分析为:
{ Fmt ,Type } = 0100_0100;响应配置写TLP,3DW带数据
Length = 1dw,
{Requester ID, Tag} = 10ee00
Data =ffffffff
Address [31:0] = 01000010
2.1 pcie 配置空间和地址
标题
每个pcie设备都有自己的配置空间,主机通过访问这些空间读取设备的信息,pcie配置空间是协议规定好存放的内容有自己的定义。
PCI总线具有32位数据/地址复用总线,所以其存储地址空间为2的32次方=4GB。也就是PCI上的所有设备共同映射到这4GB上,每个PCI设备占用唯一的一段PCI地址,以便于PCI总线统一寻址。每个PCI设备通过PCI寄存器中的基地址寄存器来指定映射的首地址。
标题
2.1.1 BAR(Base Address Register)
Endpoint configuration提供最多6个BAR.Switch提供两个。
标题
主机访问配置空间过程:
CPU不能直接访问配置空间,让RC(Root Complex)去办。若想读取pcie外设的数据,先让RC通过TLP把数据从pcie外设读到主机内存中,后CPU从主机内存读数据。若CPU要往外设写数据,则先把数据写到主机内存中,然后叫RC通过TLP写到PCLe设备。
分配映射空间
对于pcie设备,系统软件如何为其分配映射空间。
标题
pcie上电后BAR的配置过程:
上电时:系统软件首先读取pcie设备的BAR0(见图5-33),得到数据。
标题
后系统软件往BAR0写入全1(见图5-34),如有保持不变,则是厂家固化的。
标题
解读:(图5-34)低12位没变,表明设备空间为4KB,低4位表明是存储空间属性(映射类型),是厂家设置好的然后系统软件根据这些信息,在系统内存空间找到地方来映射着4KB的空间,把分配的空间写入到BAR0.(图5-35)
标题
在pcie拓扑结构中,一条总线下可挂几个设备,而每个设备可以具有对个功能。(见图5-36)
标题
在整个pcie系统中,只要知道BUS No + Device No + Function No,就找到唯一的function寻址基本单元是功能,它的ID由Bus + Device + Fun组成。
一个pcie可以有最多256Bus,每条Bus上最多挂32设备,而每个设备上最多可实现8个function,每个function对应4KB的配置空间。上电时这些配置空间都需要映射到主机内存空间。
系统软件读取configuration空间:
系统软件访问configuration,只需指定相应function对应的内存空间,RC发现这个是configuration映射空间,就会产生相应的configuration Read TLP去获得相应的function 的 configuration。
下期将继续更新pcie例子工程的代码分析。
水平有限,如有错误,请指教不胜感情。如果您有其他看法,欢迎在下方讨论,谢谢!