一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

看看PCIe設(shè)備之間的通信方式

路科驗(yàn)證 ? 來(lái)源:TrustZone ? 2024-03-01 14:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在上一篇中,我們介紹了PCIe設(shè)備的配置空間,及其設(shè)計(jì)的目的,最后我們說(shuō)到了消息路由的設(shè)計(jì)。所以,這一篇我們就繼續(xù)這個(gè)話(huà)題,來(lái)看看PCIe設(shè)備之間的通信方式吧。

1. PCIe協(xié)議棧

PCIe是以包(Packet)為單位傳輸數(shù)據(jù)的。和計(jì)算機(jī)網(wǎng)絡(luò)類(lèi)似,其協(xié)議也是分層的。

其協(xié)議棧主要分為三層:物理層(Physical Layer),數(shù)據(jù)鏈路層(Data Link Layer)和事務(wù)層(Transaction Layer),如下圖所示:

78793f18-d785-11ee-a297-92fbcf53809c.png

2. 事務(wù)層(Transaction Layer)

PCIe的協(xié)議棧最上層叫做事務(wù)層,這一層定義了所有和用戶(hù)相關(guān)的PCIe的操作,所以這也會(huì)時(shí)大家最感興趣的一層。

2.1. 事務(wù)(Transaction)

PCIe的所有操作都被稱(chēng)為一個(gè)事務(wù)(Transaction),這些事務(wù)分為四種類(lèi)型:

內(nèi)存事務(wù)(Memory Transaction)

IO事務(wù)(IO Transaction)

配置事務(wù)(Configuration Transaction)

消息事務(wù)(Message Transaction)

一個(gè)事務(wù)根據(jù)其請(qǐng)求的處理方式又被分為兩種:

Non-Posted:每個(gè)事務(wù)的請(qǐng)求消息發(fā)送出去后,會(huì)需要一個(gè)完成消息(Completion)來(lái)完成事務(wù)。比如,讀內(nèi)存。

Posted:請(qǐng)求發(fā)送后不需要完成消息,屬于Fire and forget。比如,寫(xiě)內(nèi)存和所有的消息事務(wù)(這也是唯二的兩類(lèi)請(qǐng)求)

所以,事務(wù)層的消息有三類(lèi):Non-Posted(NP),Posted(P)和Completion(Cpl)。

2.2. TLP(Transaction Layer Packet)

PCIe的事務(wù)請(qǐng)求和完成消息都是以TLP(Transaction Layer Packet)為單位傳輸?shù)?。其結(jié)構(gòu)如下:

788374ba-d785-11ee-a297-92fbcf53809c.png

TLP Prefix:用來(lái)實(shí)現(xiàn)一些高級(jí)特性,比如精確時(shí)間測(cè)量(Precision Time Measurement),因?yàn)樗皇潜仨毜模晕覀兿忍^(guò)。

TLP Digest:4個(gè)字節(jié),可以存放諸如CRC的校驗(yàn)碼,不過(guò)一般不需要開(kāi)啟,因?yàn)楹竺嬲f(shuō)的數(shù)據(jù)鏈路層已經(jīng)自帶了校驗(yàn)了,這里相當(dāng)于是雙保險(xiǎn)。

TLP Header:這個(gè)是TLP中最重要的部分,我們后面馬上會(huì)詳細(xì)介紹。

TLP Payload:這個(gè)是TLP中的數(shù)據(jù)部分,根據(jù)不同的事務(wù)類(lèi)型,其大小也不同。比如,讀事務(wù)就不需要Payload。另外Payload的大小也是有限制的,它不能超過(guò)Max_Payload_Size,最大為4096字節(jié)。

2.2.1. TLP頭

TLP的頭部根據(jù)處理地址長(zhǎng)度的不同,會(huì)有12字節(jié)(稱(chēng)為3DW)或者16字節(jié)(稱(chēng)為4DW)寬。其前4個(gè)字節(jié)(第一個(gè)DW)是公共的頭部,包含了絕大部分的用于描述該事務(wù)本身的信息和行為的字段,其后的8個(gè)字節(jié)(第二個(gè)和第三個(gè)DW)會(huì)根據(jù)事務(wù)種類(lèi)的不同而產(chǎn)生變化。其前四個(gè)字節(jié)如下:

78963b68-d785-11ee-a297-92fbcf53809c.png

Fmt: TLP頭的格式

Bit 7:如果是1,則Fmt必須是100,表示這個(gè)頭是TLP Prefix

Bit 6:1 = 讀事務(wù)(TLP頭之后沒(méi)有Payload),0 = 寫(xiě)事務(wù)(TLP頭之后有Payload)

Bit 5:1 = 使用32位地址,頭部長(zhǎng)度12字節(jié)(3DW Header),0 = 使用64位地址,頭部長(zhǎng)度16字節(jié)(4DW Header)

Type:事務(wù)類(lèi)型,表示這個(gè)事務(wù)是什么類(lèi)型的事務(wù),比如內(nèi)存事務(wù)、IO事務(wù)、配置事務(wù)、消息事務(wù)等

LN(Lightweight Notification):用于標(biāo)識(shí)當(dāng)前這個(gè)內(nèi)存請(qǐng)求或者完成消息是不是一個(gè)輕量級(jí)通知

TH(TLP Hints):用于表示TPH(TLP Processing Hint)是否啟用和TPH TLP Prefix是否存在

TD(TLP Digest):1 = 有TLP Digest,0 = 沒(méi)有TLP Digest

EP(Error Poisoning):1 = 有錯(cuò)誤,0 = 沒(méi)有錯(cuò)誤

AT(Address Translation):虛擬化相關(guān)的字段,00 = 無(wú)地址轉(zhuǎn)換,01 = 需要地址轉(zhuǎn)換,10 = 地址轉(zhuǎn)換已完成,11 = 保留

Length:Payload的長(zhǎng)度,單位為DW(Double Word),1DW = 4字節(jié)

這里由兩個(gè)字段TC和Attr我們沒(méi)有介紹,因?yàn)樗鼈兪鞘聞?wù)描述符的一部分,我們馬上就會(huì)介紹。

2.2.2. 事務(wù)描述符(Transaction Descriptor)

為了幫助通信的雙方知道對(duì)方的信息和對(duì)消息的處理方式進(jìn)行描述,在TLP的頭中有幾個(gè)公共的字段,合在一起被稱(chēng)為事務(wù)描述符:事務(wù)ID(Requester ID和Tag兩個(gè)字段),消息的屬性(Attr字段),流量分類(lèi)(TC字段)。

雖然TLP頭中第二個(gè)DW開(kāi)始的部分會(huì)隨著請(qǐng)求類(lèi)型的不同而發(fā)生變化,但是這四個(gè)字段幾乎會(huì)在所有的消息中存在(某些情況下Tag會(huì)被忽略),所以這里我們用一個(gè)內(nèi)存請(qǐng)求的消息來(lái)做例子,展示它們?cè)赥LP中的位置:

789e4c22-d785-11ee-a297-92fbcf53809c.png

2.2.2.1. 事務(wù)ID(Transaction ID)

事務(wù)ID由Requester ID和Tag兩個(gè)字段組成,用于標(biāo)識(shí)一個(gè)事務(wù)。其中,

Requester ID:一共16個(gè)bit,用于標(biāo)識(shí)發(fā)起這個(gè)事務(wù)的設(shè)備,是請(qǐng)求發(fā)起者的BDF

Tag:一共10個(gè)bit,每個(gè)發(fā)出的TLP都會(huì)被賦予一個(gè)唯一的標(biāo)簽,幫助PCIe進(jìn)行數(shù)據(jù)傳輸?shù)母櫤凸芾?,比如并行處理,流控或亂序處理。這里注意T8和T9兩個(gè)bits,它們和其他的tag的bits不在一起(綠色高亮),且需要修改10-Bit Tag Requester Enable配置寄存器啟用

2.2.2.2. 消息屬性(Attributes)

消息屬性一共有三個(gè)bits:高兩位 Attr[2:1](Byte 1 - Bit 2,Byte 2 - Bit 5)用于控制消息處理的順序,而最低位 Attr[0](Byte 2 - Bit 4)用于控制Coherency。

78ada05a-d785-11ee-a297-92fbcf53809c.png

2.2.2.2.1. 消息處理順序(Ordering)

Attr[2:1]這兩個(gè)Bits用于控制消息處理的順序,一共有四種情況:

Attr[2] Attr[1] 順序類(lèi)型 說(shuō)明
0 0 強(qiáng)制順序 默認(rèn)值,不允許亂序處理
0 1 Relaxed Ordering 允許接收者在當(dāng)前請(qǐng)求沒(méi)有完成的時(shí)候,同時(shí)處理任何后續(xù)的請(qǐng)求
1 0 ID-based Ordering 允許接收者在當(dāng)前請(qǐng)求沒(méi)有完成的時(shí)候,同時(shí)處理來(lái)自其他設(shè)備的請(qǐng)求
1 1 無(wú)序 相當(dāng)于是Relaxed Ordering和ID-based Ordering的并集,允許接收者在當(dāng)前請(qǐng)求沒(méi)有完成的時(shí)候,同時(shí)處理任何的請(qǐng)求

2.2.2.2.2. No Snoop

NoSnoop(Attr[0])使用來(lái)控制緩存一致性的。默認(rèn)的情況下(值為0),PCIe會(huì)對(duì)請(qǐng)求進(jìn)行緩存一致性的處理,比如一個(gè)內(nèi)存的讀請(qǐng)求,它會(huì)保證先去讀Cache,如果沒(méi)有讀到再去讀主內(nèi)存。但是如果這個(gè)值為1,PCIe就會(huì)直接跳過(guò)Cache,去操作主內(nèi)存。這樣就有可能導(dǎo)致一致性的問(wèn)題,因?yàn)橛锌赡蹸ache中的內(nèi)容還沒(méi)有被寫(xiě)入主內(nèi)存中,這樣就讀到了錯(cuò)誤的值。

但是,這并不代表這個(gè)flag沒(méi)有用,如果我們非常確定我們不需要考慮緩存,那么我們可以啟用這個(gè)flag,直接去操作主內(nèi)存,從而提高性能。

當(dāng)然,也正因?yàn)橛幸恢滦缘膯?wèn)題,所以這個(gè)功能被很多事務(wù)禁止使用了:比如配置事務(wù)、IO事務(wù)、大部分的消息事務(wù)和MSI(跳過(guò)緩存發(fā)起中斷會(huì)導(dǎo)致DMA等功能出錯(cuò),讀到臟數(shù)據(jù))等。

2.2.2.3. 流量分類(lèi)(Traffic Class)

Traffic Class總共有3個(gè)bit,用于把所有的事務(wù)分成8個(gè)不同的類(lèi)別,用于流控。

基于TC的流控是通過(guò)和VC(Virtual Channel)合作來(lái)實(shí)現(xiàn)的:

PCIe中的所有物理鏈路(Link)都可以創(chuàng)建多個(gè)VC(Virtual Channel),而每個(gè)VC都獨(dú)立工作,并有著流量控制機(jī)制。

一個(gè)或者多個(gè)TC可以被映射到一個(gè)VC上,這樣就可以通過(guò)操作TLP的TC來(lái)控制TLP走的VC了。

VC通過(guò)信用機(jī)制來(lái)控制發(fā)包速度,每個(gè)VC都有著自己的Credit Pool,如果一個(gè)VC的Credit不為0,那么它就可以發(fā)送TLP,并且消耗特定的Credit。每個(gè)VC的Credit也會(huì)在特定的時(shí)候補(bǔ)充,保證通信不會(huì)中斷。

TC的默認(rèn)值是0,也是所有設(shè)備必須實(shí)現(xiàn)的。它被Hardcoded到了VC0上,所以如果沒(méi)有設(shè)置TC,那么所有的TLP都會(huì)走VC0。

最后,如果兩個(gè)包有了不同的VC,或者不同的TC,那么它們之間將沒(méi)有順序的保證。

這里我們主要了解TC到VC的映射就好,關(guān)于VC的具體機(jī)制,我們會(huì)在后面數(shù)據(jù)鏈路層介紹。以下是一個(gè)TC和VC相互合作的配置的例子。通過(guò)這種方法,我們就可以對(duì)PCIe進(jìn)行流量控制啦!

78bdb0f8-d785-11ee-a297-92fbcf53809c.png

2.3. TLP事務(wù)路由

有了事務(wù)ID,我們可以很容易的了解當(dāng)前事務(wù)的源是誰(shuí),然而為了能讓通信雙方通信,我們還需要知道事務(wù)的目的地是哪里,這樣我們才能把事務(wù)發(fā)送到正確的地方。

在PCIe中,不同類(lèi)型的事務(wù)中會(huì)使用不同的字段和方法來(lái)指定目的地,但是總結(jié)起來(lái)只有兩種:

通過(guò)具體的地址來(lái)指定目的地:這種路由方式叫做基于地址的路由(Address-Based Routing)。這種方式主要用于內(nèi)存事務(wù)(Memory Transaction)和IO事務(wù)(IO Transaction),通過(guò)需要訪(fǎng)問(wèn)的地址,我們就可以通過(guò)我們上一篇中介紹的路由機(jī)制來(lái)進(jìn)行路由了。

79198c84-d785-11ee-a297-92fbcf53809c.png

通過(guò)BDF來(lái)指定目的地:這種路由方式叫做基于ID的路由(ID Based Routing)。這種方式主要用于非內(nèi)存訪(fǎng)問(wèn)型的事務(wù),比如:配置事務(wù)(Configuration Transaction),消息事務(wù)(Message Transaction)和事務(wù)完成的消息通知(Completion)。

79361b88-d785-11ee-a297-92fbcf53809c.png

另外,我們上一篇還提到了一種特殊的ID分配方式ARI(Alternative Routing ID),它的唯一區(qū)別就是把Device Number的5個(gè)Bit給了Function Number,用以支持更多的Function,如下:

7941b3c6-d785-11ee-a297-92fbcf53809c.png

2.4. TLP小結(jié)

好了,到此我們已經(jīng)把最核心的TLP的公用字段都介紹完畢了,包括TLP主題格式,事務(wù)如何分類(lèi),如何路由,如何進(jìn)行流控等等。這里,為了再來(lái)整體的來(lái)看一下事務(wù)層的處理,我們可以參照Intel Cyclone 10的總體框圖,如下:

7949338a-d785-11ee-a297-92fbcf53809c.png

當(dāng)然在TLP的頭中,我們?nèi)匀挥泻芏嘧侄螞](méi)有涉足,這些字段都和具體的事務(wù)類(lèi)型相關(guān),所以我們?cè)谶@一篇中就不會(huì)過(guò)多的深入了。畢竟,我們這一篇主要是想聚焦在PCIe的通信協(xié)議本身上,來(lái)展示PCIe是如何進(jìn)行通信的,關(guān)于每個(gè)具體的事務(wù)及其格式,我們會(huì)放在后面單獨(dú)的說(shuō)。

3. 數(shù)據(jù)鏈路層(Transaction Layer)

當(dāng)事務(wù)層將事務(wù)消息準(zhǔn)備好之后,就會(huì)向下傳遞給數(shù)據(jù)鏈路層(Data Link Layer)。對(duì)于我們發(fā)送的事務(wù)消息來(lái)說(shuō),數(shù)據(jù)鏈路層主要負(fù)責(zé)一件事情:保證事務(wù)消息能正確的傳輸?shù)侥康牡亍?/p>

數(shù)據(jù)鏈路層傳輸?shù)陌饕▋煞N,一種用于傳輸TLP事務(wù)消息,一種用于傳輸數(shù)據(jù)鏈路層的控制消息,比如功能(Feature)控制,流量控制,電源管理等等。這兩種類(lèi)型的包通過(guò)物理層的Token來(lái)進(jìn)行區(qū)分:STP(Start of TLP)表示TLP消息,SDP(Start of DLLP)表示控制消息(DLLP,Data Link Layer Packet)。我們這里一個(gè)一個(gè)來(lái)看。

795569e8-d785-11ee-a297-92fbcf53809c.png

3.1. TLP事務(wù)消息的傳輸

3.1.1. 數(shù)據(jù)包格式和數(shù)據(jù)發(fā)送

為了達(dá)到這個(gè)目的,數(shù)據(jù)鏈路層會(huì)對(duì)數(shù)據(jù)包再進(jìn)行一層封裝:

在包的前方添加一個(gè)序列號(hào)(Sequence Number),占用2個(gè)字節(jié),用于保證包發(fā)送的順序。這個(gè)序列號(hào)是每個(gè)Link獨(dú)立的,只有上下游兩端保存的序列號(hào)(NEXT_RCV_SEQ)一致,才會(huì)被對(duì)端接收。在包的后方添加一個(gè)CRC校驗(yàn)碼,叫做LCRC(Link CRC),占用4個(gè)字節(jié),用于保證包中數(shù)據(jù)的正確性。注意,計(jì)算CRC的時(shí)候,剛剛添加的序列號(hào)也會(huì)被納入計(jì)算范圍中。

796131e2-d785-11ee-a297-92fbcf53809c.png

封裝完成后,為了保證成功的發(fā)送,數(shù)據(jù)鏈路層會(huì)先將包保存在Retry Buffer中,再轉(zhuǎn)交給物理層(Physical Layer)進(jìn)行發(fā)送。在每條消息發(fā)送完畢之后,發(fā)送方會(huì)等待接收方發(fā)送ACK消息,如果接收到的返回消息是失敗消息,比如Seq錯(cuò)誤,CRC校驗(yàn)錯(cuò)誤,或者任何物理層的錯(cuò)誤,發(fā)送方就會(huì)把Retry Buffer中的消息拿出來(lái)重新發(fā)送。[1](3.6 Data Integrity Mechansisms) 。

3.1.2. 數(shù)據(jù)接收

對(duì)于數(shù)據(jù)的接收方,操作流程則相反。接收方會(huì)檢查接收到的數(shù)據(jù)包的序列號(hào)和CRC是否正確,如果不正確,就會(huì)發(fā)送一個(gè)Nak消息,要求發(fā)送方進(jìn)行重傳。如果正確,就會(huì)回發(fā)一個(gè)Ack消息,表示接收成功,而此時(shí)發(fā)送方在收到了ACK消息后也可以將其從Retry Buffer中移除。這樣,數(shù)據(jù)鏈路層就保證了TLP的正確傳輸。[1](3.6 Data Integrity Mechansisms) 。

更加具體的數(shù)據(jù)接收處理流程如下:

797acdaa-d785-11ee-a297-92fbcf53809c.png

3.2. 控制消息:DLLP(Data Link Layer Packet)

除了傳輸TLP數(shù)據(jù)包之外,數(shù)據(jù)鏈路層還需要很多專(zhuān)門(mén)用于控制的數(shù)據(jù)包,比如上面提到的Ack和Nak,這些數(shù)據(jù)包叫做DLLP(Data Link Layer Packet)。其格式如下:

799c394a-d785-11ee-a297-92fbcf53809c.png

DLLP中DLLP Type用來(lái)指定包的類(lèi)型,而最后16位的CRC用來(lái)做校驗(yàn),其主要分為以下幾種類(lèi)型:

名稱(chēng) Type 描述 說(shuō)明
Ack 00000000b 用于確認(rèn)接收到的TLP數(shù)據(jù)包 默認(rèn)值,不允許亂序處理
Nak 00010000 用于拒絕接收到的TLP數(shù)據(jù)包 允許接收者在當(dāng)前請(qǐng)求沒(méi)有完成的時(shí)候,同時(shí)處理任何后續(xù)的請(qǐng)求
-

(Type較多,后面來(lái)說(shuō)) 用于流量控制,P/NP/Cpl表示流控類(lèi)型 允許接收者在當(dāng)前請(qǐng)求沒(méi)有完成的時(shí)候,同時(shí)處理來(lái)自其他設(shè)備的請(qǐng)求
MRInitFC1/MRInitFC2/MRUpdateFC <0111/1111/1011>0xxxb 用于流量控制,P/NP/Cpl表示流控類(lèi)型 相當(dāng)于是Relaxed Ordering和ID-based Ordering的并集,允許接收者在當(dāng)前請(qǐng)求沒(méi)有完成的時(shí)候,同時(shí)處理任何的請(qǐng)求
PM_* 00100xxxb 用于電源管理,告知對(duì)端當(dāng)前的電源狀態(tài)
NOP 00110001b 用于保持鏈路活躍,防止鏈路被關(guān)閉
Data_Link_Feature 00000010b 用于告知對(duì)端當(dāng)前鏈路的特性,如支持Scaled Flow Control
Vendor-specific 00110000b 用于支持廠(chǎng)商自定義的DLLP,實(shí)現(xiàn)廠(chǎng)商特有功能

3.2.1. Ack/Nak

我們?cè)赥LP事務(wù)消息傳輸?shù)睦锞吞岬竭^(guò)Ack和Nak消息,它們可以說(shuō)是DLLP中最常用的消息了。功能顧名思義,Ack表示接收成功,Nak表示接收失敗,需要重傳。這兩個(gè)包的格式如下:

79ae55d0-d785-11ee-a297-92fbcf53809c.png

其中,AckNak_Seq_Num表示當(dāng)前已經(jīng)收到的最新的消息序號(hào),所以和TCP類(lèi)似,PCIe的Ack和Nak可以進(jìn)行批量操作:無(wú)論是Ack還是Nak,當(dāng)發(fā)送方收到這個(gè)消息之后,就可以將Retry Buffer中比這個(gè)序號(hào)老的消息全部移除了,所以Ack/Nak時(shí)只需要將最新的序號(hào)帶上即可。Ack/Nak的差別在于:如果是Nak,那么發(fā)送方在移除之后,需要對(duì)Retry Buffer中這個(gè)序號(hào)之后的消息全部進(jìn)行重傳。

最后,DDLP的重傳是由次數(shù)限制的,默認(rèn)閾值是4次。如果超過(guò)四次,就出觸發(fā)物理層開(kāi)始重建(retrain)鏈路。如果依然失敗,就會(huì)將該鏈路關(guān)閉。

3.2.2. VC(Virtual Channel)與流量控制

在說(shuō)TLP的時(shí)候,我們提到了PCIe的流量控制是通過(guò)將TC(Traffic Class)映射到VC(Virtual Channel),并且利用VC的信用機(jī)制來(lái)實(shí)現(xiàn)的。這里我們就一起來(lái)看看這個(gè)信用機(jī)制吧!

數(shù)據(jù)鏈路層中的信用額度管理有兩個(gè)重要的特點(diǎn):

不同處理方式是的TLP消息有著單獨(dú)的信用額度管理:Posted(P),Non-Posted(NP)和Completion(Cpl)。這三種消息的信用額度是獨(dú)立的,互不影響。

每個(gè)VC都有著自己的獨(dú)立的信用額度管理,而不是Link。也就是說(shuō),如果一個(gè)Link上有多個(gè)VC,那么每個(gè)VC都需要單獨(dú)的初始化和更新。參與流量控制的消息有很多,主要有三類(lèi),每一類(lèi)有三個(gè)變種(N/NP/Cpl),我們的流量控制也主要分三步,其細(xì)節(jié)和統(tǒng)一的消息格式如下:

InitFC1-P/NP/Cpl:接收端設(shè)備使用此消息向發(fā)送端發(fā)起初始化流量控制的流程,并初始化信用額度,這是第一步。這個(gè)消息有接收端發(fā)起的原因是因?yàn)?,不同的接收端能力不同,所以?yīng)該由接收端根據(jù)自己的能力,比如緩存的大小,來(lái)決定信用額度的大小。

InitFC2-P/NP/Cpl:用于發(fā)送端向接收端確認(rèn)InitFC1的消息,這是第二步。這個(gè)消息中會(huì)帶有從第一步接收到的信用信息,但是它會(huì)被接收端忽略,并沒(méi)有什么用。另外,這個(gè)消息發(fā)送之后,發(fā)送端將不會(huì)再理會(huì)任何后續(xù)的InitFC1消息了。

UpdateFC-P/NP/Cpl:用于在信用額度初始化完成之后,接收端向發(fā)送端對(duì)信用額度進(jìn)行更新。

79bacbe4-d785-11ee-a297-92fbcf53809c.png

這個(gè)消息中各個(gè)字段含義如下:

Type:消息ID,映射如下:

Type Id
InitFC1-P 0100b
InitFC1-NP 0101b
InitFC1-Cpl 0110b
InitFC2-P 1100b
InitFC2-NP 1101b
InitFC2-Cpl 1110b
UpdateFC-P 1000b
UpdateFC-NP 1001b
UpdateFC-Cpl 1010b

VC ID(v[2:0]):Virtual Channel的Id,Id一共有3位,代表8個(gè)VC。

HdrFC:TLP頭部的Credit數(shù)量。在發(fā)送時(shí),一個(gè)TLP頭對(duì)應(yīng)著一個(gè)Header Credit,不論該TLP的大小如何。

DataFC:TLP數(shù)據(jù)部分的Credit數(shù)量。一個(gè) DW(Double Word,雙字,即4字節(jié))對(duì)應(yīng)著一個(gè)Data Credit。

舉個(gè)例子,我們假設(shè)有一個(gè)64位地址的內(nèi)存的寫(xiě)請(qǐng)求,數(shù)據(jù)長(zhǎng)度為128字節(jié),那么我們會(huì)需要發(fā)送一個(gè)4 DW的TLP頭,加上128字節(jié)的Payload,和一個(gè)1 DW可選的TLP Digest,所以我們一共最多消耗1個(gè)Header Credit,和 (128 + 4) / 4 = 33個(gè)Data Credit。

然后,為了保證發(fā)送方正常的消息發(fā)送,當(dāng)接收方處理完部分消息后(或者一些特殊情況后),就會(huì)根據(jù)其當(dāng)前緩存的大小,向發(fā)送方發(fā)送UpdateFC消息,告訴發(fā)送方,接收方的信用額度還剩下多少。另外,除了這種情況,接收方還會(huì)定時(shí)的向發(fā)送方上報(bào)自己的信用額度(最長(zhǎng)間隔30us),這么做的原因是為了避免意外情況,如CRC校驗(yàn)出錯(cuò),導(dǎo)致信用額度上報(bào)丟失,從而導(dǎo)致發(fā)送方停止發(fā)送消息的問(wèn)題。

最后,數(shù)據(jù)鏈路層還支持Scaled Flow Control,即信用額度的數(shù)量可以是2的冪次方,這樣就可以管理更大的信用額度了:

79ceb3e8-d785-11ee-a297-92fbcf53809c.png

為了幫助理解,我們舉一個(gè)例子:

注意:如果查看原始的包,在計(jì)算時(shí)需要注意,HdrFC和DataFC都沒(méi)有對(duì)其到字節(jié)上,所以記得做好位運(yùn)算。

首先,PCIe的Endpoint會(huì)向Switch發(fā)送如下三條消息來(lái)進(jìn)行流控初始化:

79d9e290-d785-11ee-a297-92fbcf53809c.png

當(dāng)Switch收到這個(gè)消息后,也會(huì)向Endpoint發(fā)送三條類(lèi)似的消息,進(jìn)行反向的初始化。因?yàn)榱鞒填?lèi)似,從這里開(kāi)始,之后Switch向Endpoint發(fā)送的反向流程我們就忽略了。

Switch收到了InitFC1 DLLP后,會(huì)使用InitFC2 DLLP進(jìn)行確認(rèn):79ec455c-d785-11ee-a297-92fbcf53809c.png

到此,等兩邊InitFC2的消息交換完畢之后,初始化就完成了!

3.3. 數(shù)據(jù)鏈路層小結(jié)

最后為了幫助理解,我們?cè)賮?lái)看一下數(shù)據(jù)鏈路層的整體架構(gòu):

79f72468-d785-11ee-a297-92fbcf53809c.png

到這里,數(shù)據(jù)鏈路層上和數(shù)據(jù)傳輸相關(guān)的核心內(nèi)容就都介紹完了!數(shù)據(jù)鏈路層中其實(shí)還有很多其他的內(nèi)容,比如Link的初始化,狀態(tài)機(jī),電源管理,和Vendor-specific DLLP等等,這些內(nèi)容我們這里就不詳細(xì)介紹了,有興趣的讀者可以自行查閱PCIe Spec [1]。

4. 小結(jié)

好了,由于篇幅原因,我們這一篇就先到這里。這一篇中我們介紹了PCIe的協(xié)議棧,并且詳細(xì)的介紹了事務(wù)層(Transaction Layer)和數(shù)據(jù)鏈路層(Data Link Layer)是如何工作的,包括事務(wù)的分類(lèi),各種消息的格式,數(shù)據(jù)鏈路層的作用和封裝,以及PCIe基于TC和VC的流控機(jī)制。

在下一篇中,我們會(huì)繼續(xù)介紹PCIe協(xié)議棧中遺留的部分 —— 物理層(Physical Layer)。



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5435

    瀏覽量

    124589
  • Cache
    +關(guān)注

    關(guān)注

    0

    文章

    130

    瀏覽量

    29088
  • PCIe
    +關(guān)注

    關(guān)注

    16

    文章

    1342

    瀏覽量

    85200
  • CRC校驗(yàn)
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    15608
  • TLP
    TLP
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    16043

原文標(biāo)題:PCIe協(xié)議棧,事務(wù)層和數(shù)據(jù)鏈路層

文章出處:【微信號(hào):Rocker-IC,微信公眾號(hào):路科驗(yàn)證】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    簡(jiǎn)談PCIe的軟件配置方式

    大家好,又到了每日學(xué)習(xí)的時(shí)間了,今天我們來(lái)聊一聊PCIe的軟件配置方式。 關(guān)于PCIe的軟件配置和初始化 PCIe設(shè)計(jì)出來(lái)考慮了和pci兼容問(wèn)題。所以
    的頭像 發(fā)表于 07-29 09:26 ?8155次閱讀
    簡(jiǎn)談<b class='flag-5'>PCIe</b>的軟件配置<b class='flag-5'>方式</b>

    關(guān)于PCIe通信問(wèn)題

    剛接觸PCIe,想用PCIe口與PC通信,EP模式。把板子插到PC上之后,通過(guò)windriver能查看到TI設(shè)備,但是用PCItree不能看到,這樣正常嗎?我運(yùn)行的程序
    發(fā)表于 08-07 08:28

    單片機(jī)和投影儀之間可以通過(guò)網(wǎng)絡(luò)通信方式通信嗎?

    有一個(gè)松下投影儀,控制投影儀的方式有3中,串口232,遙控器紅外控制,用電腦通過(guò)網(wǎng)口通信。我想我問(wèn)一下,可以用單片機(jī)通過(guò)網(wǎng)絡(luò)通信控制投影儀嗎?單片機(jī)通過(guò)w5500芯片引出了一個(gè)網(wǎng)口。對(duì)于網(wǎng)絡(luò)
    發(fā)表于 03-05 10:10

    如何實(shí)現(xiàn)兩個(gè)處理器之間通信

    你好,我打算建立通信以在兩個(gè)處理器之間讀寫(xiě)。一方面是ASIC(MCIMX6)上的四核ARM Cortex A9處理器,另一方面是FPGA(ZC7020)。我在FPGA端沒(méi)有任何PCIe硬端口。因此
    發(fā)表于 04-16 09:04

    PCIe設(shè)備的低功耗狀態(tài)

    PCIe設(shè)備的低功耗狀態(tài)要求系統(tǒng)驅(qū)動(dòng)程序顯式地將設(shè)備置于低功耗狀態(tài),從而PCIe鏈路則可以依次變?yōu)榈凸逆溌窢顟B(tài)。PCIe規(guī)范允許
    發(fā)表于 12-28 06:18

    PCIe物理層實(shí)現(xiàn)了一對(duì)收發(fā)差分對(duì),可以實(shí)現(xiàn)全雙工的通信方式

    如上圖所示,PCIe物理層實(shí)現(xiàn)了一對(duì)收發(fā)差分對(duì),因此可以實(shí)現(xiàn)全雙工的通信方式。需要注意的是,PCIe Spec只是規(guī)定了物理層需要實(shí)現(xiàn)的功能、性能與參數(shù)等,置于如何實(shí)現(xiàn)這些卻并沒(méi)有明確
    的頭像 發(fā)表于 05-31 09:16 ?1.4w次閱讀
    <b class='flag-5'>PCIe</b>物理層實(shí)現(xiàn)了一對(duì)收發(fā)差分對(duì),可以實(shí)現(xiàn)全雙工的<b class='flag-5'>通信</b><b class='flag-5'>方式</b>

    基于FPGA的PCIe設(shè)備如何才能滿(mǎn)足PCIe設(shè)備的啟動(dòng)時(shí)間的要求?

    根據(jù)PCIe的協(xié)議,當(dāng)設(shè)備啟動(dòng)后,PCIe設(shè)備必須滿(mǎn)足啟動(dòng)時(shí)間的要求,即上電后100ms內(nèi),完成PCIe
    發(fā)表于 06-19 10:24 ?8731次閱讀
    基于FPGA的<b class='flag-5'>PCIe</b><b class='flag-5'>設(shè)備</b>如何才能滿(mǎn)足<b class='flag-5'>PCIe</b><b class='flag-5'>設(shè)備</b>的啟動(dòng)時(shí)間的要求?

    簡(jiǎn)談PCIe的軟件配置方式

    ? ? ? ?大家好,又到了每日學(xué)習(xí)的時(shí)間了,今天我們來(lái)聊一聊PCIe的軟件配置方式。? ? ? ?關(guān)于PCIe的軟件配置和初始化? ? ? ?PCIe設(shè)計(jì)出來(lái)考慮了和pci兼容問(wèn)題。
    的頭像 發(fā)表于 07-27 19:16 ?3904次閱讀
    簡(jiǎn)談<b class='flag-5'>PCIe</b>的軟件配置<b class='flag-5'>方式</b>

    PCIe總線(xiàn)的兩種復(fù)位方式

    傳統(tǒng)的復(fù)位方式分為Cold、Warm和Hot Reset。PCIe設(shè)備可以根據(jù)當(dāng)前的設(shè)備的運(yùn)行狀態(tài)選擇合適的復(fù)位方式,
    的頭像 發(fā)表于 12-30 09:37 ?2.4w次閱讀

    PLC與PLC之間通信方式設(shè)置

    PLC與PLC之間通信方式還是比較多的,每種通信方式的設(shè)置是有所不同的,今天和大家聊一下用兩臺(tái)FX2N型號(hào)的PLC通過(guò)RS485
    的頭像 發(fā)表于 11-24 09:58 ?2.3w次閱讀

    聊聊PCIe設(shè)備在系統(tǒng)如何發(fā)現(xiàn)與訪(fǎng)問(wèn)?

    PCIe,走過(guò)近30年時(shí)光。其中Host發(fā)現(xiàn)與查找設(shè)備方式卻一脈沿襲,今天我們先來(lái)聊一聊PCIe設(shè)備在一個(gè)系統(tǒng)中是如何發(fā)現(xiàn)與訪(fǎng)問(wèn)的。
    的頭像 發(fā)表于 12-09 10:04 ?5385次閱讀

    訪(fǎng)問(wèn)PCI/PCIe設(shè)備的流程

    訪(fǎng)問(wèn) PCI/PCIe 設(shè)備的流程 PCI/PCIe 設(shè)備的配置信息 PCI/PCIe 設(shè)備上有
    的頭像 發(fā)表于 07-30 09:44 ?2055次閱讀

    基于FPGA的PCIE通信測(cè)試

    本文介紹一個(gè)FPGA開(kāi)源項(xiàng)目:PCIE通信。該工程圍繞Vivado軟件中提供的PCIE通信IP核XDMA IP建立。Xilinx提供了XDMA的開(kāi)源驅(qū)動(dòng)程序,可在Windows系統(tǒng)或者
    的頭像 發(fā)表于 09-04 16:45 ?4513次閱讀
    基于FPGA的<b class='flag-5'>PCIE</b><b class='flag-5'>通信</b>測(cè)試

    PCIe接口的工作原理 PCIe與PCI的區(qū)別

    PCI Express(PCIe)是一種高速串行計(jì)算機(jī)擴(kuò)展總線(xiàn)標(biāo)準(zhǔn),主要用于計(jì)算機(jī)內(nèi)部硬件設(shè)備之間的連接。以下是PCIe接口的工作原理的簡(jiǎn)要概述: 串行
    的頭像 發(fā)表于 11-06 09:19 ?4216次閱讀

    pcie設(shè)備驅(qū)動(dòng)程序安裝步驟

    PCIe(Peripheral Component Interconnect Express)是一種高速串行計(jì)算機(jī)擴(kuò)展總線(xiàn)標(biāo)準(zhǔn),用于計(jì)算機(jī)內(nèi)部硬件組件之間的連接。安裝PCIe設(shè)備驅(qū)動(dòng)程
    的頭像 發(fā)表于 11-13 10:32 ?3348次閱讀