CoreSight 架構

一、coresight

coresightARM公司提出的,用於對複雜的SOC,實現debugtrace的架構。該架構,包含了多個coresight組件。衆多的coresight組件,構成了一個coresight系統。我們也可以根據coresight架構,實現自己的coresight組件。

每個coresight的組件(component),都要遵循coresight架構的要求。

1典型的一個coresight的環境

以下是一個典型的coresight環境,包含了兩個ARM core,一個DSP,和衆多的coresight組件。這個coresight組件,實現對coreDSPdebugtrace功能。

環境中,總共包括3個通路

·        trace通路:coreDSP內部信息輸出到外部

·        debug通路:對coreDSP實現debug

·        trigger通路:用於corecore之間,coreDSP之間,傳輸trigger信號

1.1trace通路

trace通路,實現對master組件的數據追蹤功能,使用ETM來追蹤。

ETM負責追蹤處理器和DSP的信息,將信息打包,通過ATB總線發送到trace bus上。trace bus上有trace funnelfunnel接收多個ATB總線數據,然後合併成一個ATB總線數據,發送給replicator

replicator接收到ATB數據,根據配置,將ATB數據發送給ETBTPIU

1.2debug的通路

debug通路,用於外部的debugger,對ARM coreDSP進行調試功能。

上圖中,只考慮了JTAGport。其實還有SWport

DAP接收外部端口的JTAG數據,然後轉化成對DAP內部的AP的訪問,然後AP再轉化爲memory-mapped的總線訪問,去訪問soc內部的資源。

上圖中,DAP輸出兩個memory-mapped總線,一個是debug apb總線,連接到debug APB互聯上,用於訪問debug組件的寄存器,一個是system bus,連接到bus matrix,用於訪問soc的內部的資源。

debug APB互聯,連接了有CTIETMHTMITMETBTPIUcoresight組件,因此外部的debugger可以通過JTAG port,對這些coresight組件進行訪問。

bus matrix一般是連接soc的一些外設,如memory,串口等,因此外部的debugger可以通過JTAG port對這些外設設備進行訪問。

1.3trigger通路

trigger通路,用於給指定的組件發送trigger信號,或者接收指定的組件的trigger信號。這個功能由CTICTM來實現。

每個coreDSP都有一個CTI組件相連,CTI可以給處理器(DSP)發送trigger信號,也可以接收處理器(DSP)的trigger信號。

所有的CTICTM相連,因此可以實現多個CTI之間的trigger信號的相互發送與接收。

2coresight組件的種類

2.1control component

triggercoresight組件

·        ECTembedded cross trigger

o    CTIcross trigger interface):接收和發送trigger信號

o    CTMcross trigger matrix):CTI之間的trigger信號傳遞

2.2trace sources

tracecoresight組件:

·        ETMembedded trace macrocells):追蹤指定設備(處理器,DSP)的trace信息,每個設備(處理器,DSP)均有自己的ETM

·        AMBA trace macrocells:追蹤AMBA總線的trace信息。

·        PTMprogram flow trace macrocells):

·        STMsystem trace macrocells):追蹤總線互聯上的trace信息

2.3trace links

trace信息傳遞過程中所需要的中間coresight組件:

·        trace funnel : 將接收的多個ATB總線數據合併成一個ATB總線數據

·        replicator: 將一個ATB總線數據,分發成多個ATB總線數據發送

·        ATB bridge: ATB 橋,用於兩個不同的ATB域之間數據傳輸

2.4trace sinks

最終接收trace信息的coresight組件

·        TPIUtrace port interface units):將ATB數據通過trace port發送給外界

·        ETBembedded trace buffers):存儲ATB數據的buffer

·        TMCtrace memory controller):

每個trace sink可以有一個trace formatter

2.5debug access port

DAP不屬於coresight的組件,但是我們會通過DAP來對coresight的組件進行訪問。

DAP包括以下:

·        APB access port(APB-AP)

·        AHB access port(AHB-AP)

·        AXI access port(AXI-AP)

·        JTAG access port(JTAG-AP)

·        serial wire JTAG debug port(SWJ-DP)

·        JTAG debug port(JTAG-DP)

·        ROM table

DAP主要是由DPAP組件。DP負責接收外部的JTAGSW數據,然後轉化爲對AP的訪問,而對AP的訪問,是可以發起memory-mapped的訪問。因此就可以對內部的資源進行訪問。

如上圖:

DAP包括了三個AP

·        APB-AP對掛接到debug APB總線上的內部調試設備的訪問

·        AHB-AP對掛載在AHB系統總線上的設備的訪問

·        JTAG-APJTAG設備的訪問。這個是兼容以前較早的ARM處理器,如ARM9。這些較早的處理器內部是用JTAG來調試的。但是現在的ARM處理器,已經不用這種方式,統一用memory-mapped方式進行調試。

目前的ARM soc中,一般至少會包括一個DAP。而一個DAP可以包括1-256APaccess port),APDP的控制。只有對AP的訪問,纔可以轉化成memory-mapped總線,對soc的內部資源進行訪問。

DP中有一個SELECT寄存器,該寄存器用來選擇,DPAP的訪問,是針對於哪一個AP進行訪問。

DAP中,是可以有多個AP的,而每次,只能對一個AP進行訪問。因爲需要對AP進行編號,編號的值就在APSEL位域中。因爲這個位域有8位,因此DAP中可以最多有256AP

DAP的內部結構如下圖:

包括了一個DP,和3AP,依次是AHB-APAPB-APJTAG-AP

DP通過JTAG或者SW管腳,連接外部的debugger,和外部debugger進行通信。

DP接收到外部debugger發送的JTAGSW數據,轉化爲對內部AP的訪問。經過decoder模塊,判斷是對哪一個AP進行訪問,然後將訪問信息發送給對應的APAP接收到DP的訪問後,轉化爲對應的總線訪問,去訪問內部資源。然後將訪問的信息,纔回送給DPDP再通過JTAGSW,將訪問信息返回給外部的debugger


 

二、coresight的寄存器

coresight對於每個coresight組件,規定了一些寄存器,這些寄存器的偏移是固定的,這些寄存器,是必須存在的。但是有的,可以不實現該寄存器功能。

1、寄存器一覽

coresight架構,對於coresight的組件,定義了若干個固定的寄存器。第一個寄存器的偏移從0xf00開始,直到0xffc。以下是寄存器列表

以上的寄存器的地址,在coresight的組件中,是不能當作其他功能使用的。如果該寄存器,在該組件沒有實現,那麼該寄存器地址要保留,讀取要返回0,寫被忽略(read must returnzero, and writes must be ignored),而不能當作其他功能使用。

對於coresight的組件,佔用14k或者整數倍的4k空間的memory空間。而coresight的寄存器,處於組件佔用空間的最後一個4K空間的最後一部分。

以下是一個coresight組件佔用的memory空間。佔用一個4k空間。

寄存器分爲兩部分:

·        device-specific registers:組件自定義寄存器,從0x000-0xeffcoresight組件利用這些寄存器,實現該組件的功能。

·        coresight management registers coresight固定的寄存器,從0xf00-0xfff。這部分寄存器的功能是固定的。

以下是包含了多個coresight組件memory分佈,每個組件,佔用4K空間的整數倍空間。

對於第2個組件,佔用了16k的空間,但是coresight寄存器,是在最後一個空間的最後位置。

而其他3個組件,都只佔用了14K空間。因此coresight寄存器,在這一個空間的最後位置。

2ITCTRLintegration modecontrol register

工作模式寄存器。

對於每個coresight組件,可以工作在兩種模式下:

·        functional mode

·        integration mode

兩種模式的區別,在於對coresight組件的寄存器的訪問,是否會引發寄存器相應的功能。

integration mode是用來topologydetection的。當一個debugger連接到一個soc後,此時debugger是不知道soc內部有哪些coresight組件的。因此就需要通過查詢,來得知soc中有哪些coresight組件的。而查詢,就是通過訪問coresight組件的寄存器來實現的。此時soc還不知道組件是什麼組件,因此也就不知道組件的寄存器是有什麼功能。因此此時是不能隨意對組件的寄存器進行訪問的。

爲了使訪問的過程中,不影響組件的功能,就可以讓組件工作在integration mode下,此時訪問組件的寄存器,不會引發寄存器相應的功能。待debugger查詢完畢後,獲取到soc中各個coresight組件的信息後,再將組件的模式切換爲functional mode

復位後,組件必須工作在functional mode下。因此外部debugger對組件查詢完畢後,可以直接對組件進行復位,這樣所有的組件就恢復到了function mode了。

3CLAIM寄存器

這個寄存器是一個32位的不可見寄存器。只能通過訪問CLAIMCLRCLAIMSET這兩個寄存器,來設置或者獲取該寄存器的值。

該寄存器,可以用來表示該組件的狀態。這個是由實現來定義的,比如可以規定,該寄存器的最低位,表示最近該寄存器被讀取過,第1位,表示最近該寄存器被寫過。

CLAIMCLR寄存器:

CLAIMSET寄存器

4DEVAFFdevice affinityregister

組件關聯功能寄存器。

有時候,組件需要和其他組件,聯合起來工作,這樣,就需要指示該組件是和另外的什麼組件進行關聯,就可以用這寄存器。

比如一個ETM,追蹤一個coretrace信息,那麼這個寄存器,就保存coreMPIDR寄存器信息,這樣debugger就可以通過DEVAFF寄存器,得知這個ETM是關聯的哪一個core

DEVAFF0寄存器:

DEVAFF1寄存器:

5lock 寄存器

對於coresight組件的寄存器,ARM定義瞭如下的一些訪問方式:

可以分爲兩類訪問:

·        系統寄存器訪問:通過MSRMRS指令(aarch64),MCR,MRC指令(aarch32

·        external debug接口訪問:DAP訪問,或者是memory-mapped訪問,也就是軟件通過load store訪問

coresight組件寄存器的訪問,是有權限要求的。對於系統寄存器訪問和memory-mapped訪問,ARM定義了software lock這個權限限制。當software lock有效的時候,軟件是不能訪問coresight組件寄存器的。

software lock的目的,是爲了防止軟件意外的修改coresight組件的寄存器,從而修改當前系統狀態,或者獲取一些不該獲取的信息。可以用來防黑客。

software lock提供了兩個寄存器,一個是LAR,一個是LSRLAR是用來設置software lock狀態,而LSR是保存當前的software lock的狀態。

LAR寫入0xc5acce55software lock狀態切換爲unlock software可以正常訪問coresight組件的寄存器,寫入其他值,software lock狀態切換爲locksoftware不可以正常訪問coresight組件的寄存器(實現自定義)。

對於DAP訪問,software lock是沒有用的。因爲要通過DAP訪問,是必須要debugger連接芯片的。

所以coresight組件要能夠區分,當前的訪問是DAP訪問,還是非DAP訪問。

6AUTHSTATUSauthenticationstatus register

debug功能的認證接口。

debug可以分爲non-invasiveinvasivenon-invasive就是self-hosted,而invasive就是external debug

實際中,可以根據不同的應用需求,可能會需要支持debug,但是也可能需要支持debug中的一種,也有可能不需要支持debug功能。因此考慮到這些需求,ARM定義了認證接口。

認證接口總共包括4個。這4個接口是每個ARMcore要實現的。這些接口是debug功能的總開關。

·        DBGEN invasive debug enable

·        SPIDEN: secure invasive debug enable

·        SPNIDEN secure non-invasive debug enable

·        NIDEN: non-invasive debug enable

而這個authenticationstatus寄存器,就是保存了這4個接口信號的狀態。

DBGEN使能的時候,NIDEN被忽略,即NIDEN被認爲是使能。

SPIDEN使能的時候,SPNIDEN被忽略,即SPNIDEN被認爲是使能。

7DEVARCHdevicearchitecture register

這個寄存器,標識了coresight組件的架構信息。

這裏主要關心ARCHID這個位域。

8DEVID deviceconfiguration register

這個寄存器的功能,由實現進行定義,總共包括3個寄存器,DEVIDDEVID1DEVID2,每個寄存器32位,只讀。

DEVID寄存器:

 

 

 

 

 

DEVID1寄存器:

DEVID2寄存器:

9DEVTYPEdevice typeidentifier register

組件的具體類型信息。依靠MAJOR位域和SUB位域來表示。

以下是組合情況:

可以看出,arm對組件分成了7大類:

·        miscellaneous: 雜散類,

·        trace sink: 最終接收trace信息的組件,包括有TPIU,ETBrouter

·        trace linktrace信息傳遞過程中需要的中間組件,包括有router, filter,FIFO

·        trace source: 產生trace信息的master

·        debug controldebug的控制器

·        debug logic具有debug功能的master

·        performance monitor性能的檢測器檢測的master

10PIDR0-PIDR7peripheralidentification registers

外設識別寄存器。

這裏面,我們關心的是SIZE,和Part number。因爲其他的值在一個soc中,所有的組件的值是固定的。

·        SIZE:表示這個組件,佔用4k空間的塊數。如果只佔用一個塊,那麼值是0,如果佔用兩個塊,值是1。佔用的塊數爲 2^SIZE

以下是SIZE對應的組件佔用的大小。以及需要訪問這個組件需要的地址寬度。

·        part number:組件的唯一編號。soc中有多個coresight的組件,爲了較好方便的管理這些組件,給每個組件分配了唯一的編號。這個編號就保存在part number中。

對於JEP106,這個是JEDEC標準,可以查閱以下網站;

www.jedec.org

11CIDR0-CIDR3componentidentification registers

這四個寄存器,每個寄存器只有最低8位有效。這四個寄存器的組合,用來標識組件的類型。

對於ARM的組件,CIDR寄存器的有些位是固定的。比如對於CIDR0CIDR1[3:0]CIDR2CIDR3,是有固定值的。

CIDR1寄存器中有一個CLASS位域,用來表示組件屬於哪一個類。ARM對自己的組件,也劃分了若個的類。

這裏,我們關心如下的class

·        0x1 rom table

·        0x9 coresight組件。

·        0xf: corelink組件

讀取組件的CIDR寄存器,即可知道這個組件是屬於哪一類。

對於rom table固定爲 0xb105_100d

對於coresight組件,固定爲 0xb105_900d

對於corelink組件,固定爲 0xb105_f00d


 

三、APBATB總線

APBATB總線,是coresight中常用的2個總線。

對於coresight組件的訪問,使用debug APB總線進行訪問。而對於trace數據的傳輸,使用ATB總線進行傳輸。

1. APB總線

以下是信號列表。

clamp value,是指當一個組件是power down或者是disabled,輸出的固定值。

APB訪問,數據最多是32bit,也就是coresight組件的寄存器的位寬最多是32bit的。

對於PADDRDBG[31],地址的最高位,表示當前的訪問是internal access,還是external access

·        internal access,是指處理器執行指令的訪問,比如load/store去訪問,或者是外部debugger通過memory map的訪問。

·        external access,是指外部的訪問,比如debuggerexternal accessinternal access有更高的權限。

如下圖,兩個處理器,均有自己的coresight組件。每個組件的地址是不一樣的。對於外部的debugger而言,使用地址0x8000_0000和地址0x0000_0000都是訪問的同一個coresight組件的寄存器,要不就是處理器A的組件A,要不就是處理器B的組件A

但是如果debugger使用地址0x0000_0000訪問,是internal access,此時受限於software lock的影響。而使用地址0x8000_0000訪問,是external access,不受限於software lock

2. ATB總線

ATB總線用來coresight組件之間傳遞trace信息用。包括兩部分:

·        masterATB總線上產生trace信息的接口。

·        slaveATB總線上接收trace信息的接口。

ATB總線以AT作爲信號的前綴。

如以下:HTMxTM是產生trace信息的master,通過ATB總線,發送給funnelfunnel將收到的兩路ATB數據合併成一路ATB數據發送給replicatorreplicator再將接收的一路ATB數據,重複以兩路ATB數據分別發送給ETBTPIUTPIU通過trace port發送到外部。

trace信息,通過ATB總線進行傳輸。

·        ETB embedded trace buffer片內存儲trace數據的大容量設備。

·        xTMtrace macrocells從連接的處理器中,追蹤數據,產生trace信息輸出。

包括兩個:

o    ETM: embeddedtrace macrocell,可以產生指令trace信息,也可以產生數據trace信息

o    PTMprogram flow macrocell,產生指令trace信息

·        HTM advanced high-performance bus tracemacrocell連接到AHB互聯總線上,產生總線的trace信息

·        TPIU trace port interface unit。接收ATB trace數據,傳輸到trace port上,將trace信息輸出到片外。

·        trace replicator: 將一個ATB數據發送給獨立的兩個ATB slave

·        trace funnel將多個trace源信息,合併成一個trace數據輸出。

2.1 全局信號

時鐘和復位信號。復位信號低電平有效。數據在時鐘的上升沿採樣。

2.2 flow control

數據信號。

masterslave之間的通信,通過ATVALIDATREADY作爲握手信號。

masterATVALID拉高,表示master傳輸的數據有效。slaveATREADY信號拉高,表示slave準備好接收master的數據。如果master發送數據,發現slaveATREADY沒有拉高,那麼就要將數據重新發送一遍。

時序圖如下:

T1master發送數據AATVALID拉高。但是master檢測到ATREADY沒有拉高。

T2master檢測到上一次數據傳輸,ATREADY沒有拉高,因此需要將數據A重新發送。此時ATREADY1,表示此時數據發送成功。因此下一次可以發送新的數據。

T3master發送數據BATREADY1,表示此時數據發送成功。下一拍可以發送新的數據。

T4masterATVALID拉低,表示沒有數據發送。

如果slavemaster發送數據的時刻,不能及時接收master發送的數據(ATREADY不能在master發送數據時刻拉高),那麼在slave端,建議實現internal buffer,接收master發送的數據。然後再處理。這樣的話,當buffer沒有滿的話,ATREADY信號就可以一直爲高,master就不用一直重新發數據。

對於ATBYTES[m:0] ATDATA[n:0]

    m= log2(n+1) – 4

對於ATID

trace的數據要伴隨着ATID進行發送的。因爲產生trace的組件有很多,因此需要一個ID來識別這些組件,ID就保存在ATID中發送。

ATID是一個7位的值。0x000x70-0x7fcoresight中規定的保留值,在soc實現中,coresight trace組件不應該使用這些ID

在一個soc中,對於每個trace組件,ID必須是唯一的。對於ID,有兩種選擇:

·        fixed ID:在soc設計的時候,就將ID值給固定了。

·        programmed ID trace組件的ID可以通過外部的debugger進行更改,但是debugger要保證,組件的ID必須是唯一的。

ATIDATDATA,在同一時刻被slave所接收。

2.3 flusing

一般,trace數據都是從trace source發送到trace sink。但是在某些情況下,trace sink需要主動要求trace source發送數據,此時就會用到flusingsink發送flush信號給sourcesource將內部所有的trace數據全部發送出去,發送完畢後,迴應sink flushcomplete信號。

flush使用以下兩個信號來作爲握手信號。

如下圖:trace source追蹤處理器的數據,通過trace generation,發送到下一級的buffer中,然後buffer將數據發送給FIFO中進行暫存。FIFO中一旦有數據,FIFO就負責將數據通過output發送給trace funnel

因此對於一個trace組件,中間是會存在多級的buffer對數據進行緩存的。

假設此時系統要power down,而sourceFIFO中還有trace信息,那這些trace信息,就要在power down之前,發送出去。此時funnel就可以向source發送flush信息,也就是將AFVALID信號拉高,trace source接收到該信號,就將自己FIFO中的所有剩餘trace信息,全部發送給funnel,發送完畢後,將AFREADY信號拉高,表示數據發送完畢。此時,就可以將系統給power down

時序圖:

T1時刻,AFVALID爲高,表示要求master進行flush操作。

T2開始,就進行masterFIFOtrace數據排空操作。

T2-T6master將自己內部的FIFO數據發送出去。在T6時刻,masterAFREADY信號拉高,表示master將數據發送外部,也就是flush完成。


 

四、channel interaface

channelinterface是用來使不同coresight組件之間傳遞event使用。使用兩個組件來實現:

·        CTM: cross trigger matrix接收CTIchannel信號,然後廣播給其他CTI

·        CTIcross trigger interface接收trigger信號,發送trigger信號,接收channel信號,發送channel信號

channelinterface的典型應用。

每個coresight組件和對應的CTI相連,那這個CTI就可以採集組件的trigger信號,或者發送trigger信號給組件。

CTI將接收的trigger信號,發送到channelinterface上,或者從channel interface上接收trigger信號,發送給和自己相連的coresight組件。

所有的CTIchannel interfaceCTM相連,這樣各個CTI就可以通過CTM,相互傳輸trigger信號。

1. channelinterface信號

channelinterface上傳遞的信號,使用握手機制進行信號的傳遞。不同CTI運行的時鐘是不一樣的,因此需要握手機制,來保證不同CTI之間能夠相互傳遞event

信號總共有以下4個,direction是相對CTI而言的。

clamp value,是指設備power down或者disableoutput上的固定值。

以下是時序圖:

兩種連接方式,異步的和同步的。

同步與異步接口之間的轉換。

2. CTI

CTIinput triggeroutput triggerARM對這些trigger均有定義:

以下是output trigger

trigger0連接CPUdebug request請求,當這個信號有效,表示使連接的CPU進入debug state

trigger1連接CPUrestart request請求,當這個信號有效,可以使連接的PE退出debug state

trigger2連接中斷控制器,CTI interrupt當這個信號有效,會發出CTIIRQ信號,給中斷控制器發送中斷。

以下是input trigger

trigger0: 連接CPUcross-halt trigger,當這個信號有效,表示連接的PE進入debug state

以下是CTI的內部結構:

CTI左邊連接CPU,有2個通道,一個是接收CPU發送的input trigger,一個是發送給CPUoutput trigger

CTI右邊連接CTM,用於發送output channel,以及接收input channel

CTI接口信號共有4種:

·        Input triggers: trigger event inputs fromthe processor to the CTItrigger信號從PE發出給CTI

·        Output triggers: trigger event outputs fromthe CTI to the processortrigger信號從CTI發出給PE

·        Input channels: channel event inputs fromthe CTM(cross-trigger matrix) to CTIchannel信號從CTM發出給CTI

·        Output channels:channel event outputs from CTI to CTMchannel信號從CTI發出給CTM

input trigger& output channel mapping:根據CTIINEN信號,將input trigger,連接到指定的output channel上。

input channel& output trigger mapping根據CTIOUTEN信號,將input channel,連接到指定的output trigger上。

對於每一個output trigger,有單獨的寄存器和其對應,如CTIOUTEN0,就和output trigger0對應,控制該寄存器,就可以將指定的input channel連接到output trigger0上,這樣指定的input channel上的trigger就可以傳遞到output trigger0上。

寄存器有32位,表示可以從32input channel中選擇一個(armv8的輸出trigger最多32個)。如果寄存器的值爲0x1,就表示將output trigger0連接到input channel0,如果寄存器的值爲0x4,就表示output trigger0連接到channel2

對於CTI,可以接收三種輸入信號,一個是coretrigger inputs,一個是CTMinput channel,另一個就是外部debugger通過APB訪問的寄存器從而產生的trigger信號。

總共有3個來源:

·        CTI內部邏輯的CTIAPP,外部可以通過APB總線訪問

·        外部的CTM

·        CPU發送的input trigger

2.1 對於CIT內部邏輯的CTIAPP

這部分提供了若干個寄存器,外部通過APB總線可以訪問這些寄存器,從而控制發生,取消trigger信號。

外部的debugger可以控制這些寄存器,從而使對應的internal outputchannel有效,然後控制CTIOUTEN[],就可以使internal outputchannel的數據輸出到指定的output trigger上。

以下是trigger走向圖。

armv8定義了3個寄存器,CTIAPPSETCTIAPPCLEARCTIAPPPULSE

·        CTIAPPSET:指定的internal channel上產生channel event

·        CTIAPPCLEAR:指定的internal channel上取消channel event

·        CTIAPPPULSE:指定的internal channel上產生只持續一個週期的channel event

CTIINTACK。這個寄存器,是用來控制將output trigger上的信號給無效掉的。比如,當前output trigger0有效的,表示debug request,那麼如果要將這個debug request給無效掉的話,那麼就可以往這個寄存器寫0x1,就無效掉了。

寄存器的每一位對應相應的output trigger

·        CTIINTACK[0] 對應 output trigger0

·        CTIINTACK[1] 對應 output trigger1

·        CTIINTACK[2] 對應 output trigger2

·        。。。

·        CTIINTACK[31] 對應 output trigger31

 

因爲ARMv8規定了,output trigger的最大數目是32,因此也就用一個32位的寄存器就可以表示所有了。

2.2 外部的CTM

core0發出的input trigger信號,通過output channel,然後通過CTM到達其他所有coreoutput trigger信號上的。

core0發出input trigger信號,然後通過input trigger mux(通過CTINEN[]選擇),到相應的internal inputchannel上,如果後面的AND與門打開,也就是CTIGATE信號有效,那麼channel上的trigger信號就會通過output channel interface傳輸到CTM

CTMtrigger,發送給其他core(這裏是core1)的CTI外部input channel上,如果其他coreAND與門打開,也就是CTIGATE信號有效,就會傳遞到CTIinternal input channel上,通過output triggermux(通過CTIOUTEN[]選擇),通過output trigger,發送給core1

以上就是CTI的不同core之間的trigger信號傳遞的機制。通過該機制,可以使一個core給另外的coretrigger信號,從而可以控制使其他core進入debug state,退出debug state等。

2.3 CPU發送的input trigger

接收CPUinput trigger,通過內部的output channel,發送給內部的input channel上,然後在發送到output trigger上。


 

五、 rom table

在一個soc中,有多個coresight組件,但是軟件怎麼去識別這些coresight組件,去獲取這些coresight組件的信息了?這個時候,就需要靠coresight組件中,一個重要的組件,這個組件就是rom table

ARM規定,在一個soc中,必須要實現至少1rom table,該rom table,保存了soc中各個coresight組件的信息,包括組件格式以及組件的基地址。

rom table只會佔用一個4K空間大小,也就是PIDR4寄存器的SIZE0

1.entry寄存器

對於rom table,從0x000-0xefc,是entry寄存器。每個entry保存了一個coresight組件的信息。

[31:12]coresight組件,基於ROM table基地址的偏移地址。例如ROM table的基地址爲0x2000_0000,而[31:12]1那麼這個coresight組件的基地址就是0x2000_1000

[8:4][2]是用來說明該coresight組件所處的power domain。因爲一個soc中,有多個power domain,而每個組件可能會處於不同的power domain中。就依靠這兩個位域說明。

[1],表示coresight的寄存器的數據有效是8bit,還是32bit

[0],表示這個entry代表的組件是否有有效的。

 

一個rom table中,最多有960entry,也就是一個rom table中,可以最多保存960coresight組件的信息,但是在一個entry中,可以指向下一個rom table,這樣,就擴展了保存coresight組件信息的個數。

如果rom tableentry沒有用完,那最後一個有效的entry後的下一個entryentry值爲全0

rom table的基地址,保存在DAPAPbase addr寄存器中,這樣debugger通過訪問DAPAP,就可以獲取到rom table的基地址,然後在訪問rom table,從而獲取到整個soc中所有的coresight組件的信息。

rom tableentry指向,可以理解是一個鏈表,但是鏈表中,不能有環。如以下的entry指向是錯誤的。

如果一個coresight組件,佔用的空間,超過了4K,但coresight有規定,coresight的寄存器,要實現在最後一個4K的最後1K位置,因此rom table中的該coresight組件的基地址,爲最後一個4K空間的基地址。

2.例子

例如如下的coresight系統,共4個組件,假設第一個組件是rom table。假設rom table的基地址是0x8000_0000

那麼:

組件

基地址

佔用4K空間個數

rom table

0x8000_0000

1

組件1

0x8000_1000

1

組件2

0x8000_2000

4

組件3

0x8000_6000

1

rom table的基地址,存在DAPAPbase addr寄存器中,外部通過訪問DAP的這個寄存器,獲取到rom table的基地址,然後就可以訪問rom table各個entry 寄存器的值。

組件1,組件2,組件3的基地址信息,存放在rom tableentry0entry1entry2中。

對於組件1entry0[31:12]1,表示組件1的基地址是0x8000_1000,外部根據這個地址,就可以訪問這個組件的coresight寄存器,從而獲取到這個組件的信息。

對於組件2,因爲這個組件,佔用了44K空間大小,rom table中存放佔用最後14K空間的基地址,因此entry0[31:12]5,表示組件1的基地址是0x8000_5000,外部根據這個地址,就可以訪問這個組件的coresight寄存器,從而獲取到這個組件的信息。通過讀取PIDR4寄存器的SIZE信息,獲取到該組件佔用44K空間,從而反推,可以得到該組件的基地址是0x8000_2000

對於組件3entry0[31:12]6,表示組件1的基地址是0x8000_6000,外部根據這個地址,就可以訪問這個組件的coresight寄存器,從而獲取到這個組件的信息。

這樣,外部就通過rom table,就可以獲取到soc中,所有coresight組件的基地址。有了基地址,就可以對其進行訪問。


 

六、 power requestor

power requestor屬於coresight組件。這個組件用來控制系統的power domain,最多可以控制32個。

如果沒有power requestor,通過DAP,只能對整個coresight系統進行上下電操作,但是有了power requestor,可以對某些關心的組件,進行上下電操作,實現power的精細操作。

以下是power requestor的框圖,通過apb總線訪問該組件,該組件通過cpwrupreq信號,向系統power發送請求,通過cpwrupack獲取到系統power的狀態。

以下是power requestor的寄存器。

除了CDBGPWRUPREQCDBGPWRUPACK兩個寄存器是requestor的自定義寄存器,其他有用的均是coresight規定的寄存器。

1.   CDBGPWRUPREQ

控制對於指定的power domain的請求是否有效。

對於要對power domain1,請求上電,就將bit11即可。要對power domain1,請求下電,就將bit10即可。

2. CDBGPWRUPACK

只讀的寄存器,保存power domain的狀態。每一bit表示一個power domain

如這個寄存器值爲0x3,表示domain0domain1是上電的。

3. DEVID

這個寄存器的低6bit,保存了系統中有多少個power domain


 

七、coresight的兩大功能

coresight具有兩大功能,一個是debug,一個是trace

1debug

debugger通過DAP,來實現debug功能。

1.1、單coredebug系統:

一個DAP,加上一個APAPBIC。外部對DP訪問,DAPDP訪問,轉化爲AP訪問,AP通過APBIC,生成AP總線,通過bridge,對ARM core中的debug資源,或者掛接在debug APB上的coresight組件,進行訪問。

1.2、多coredebug系統:

一個DAPDAP內實現了多個AP,這些AP實現jtagmemory-mapped方式訪問debug資源。

外部對DP訪問,DAPDP訪問,轉化爲APB AP或者JATG AP訪問,如果是jtag訪問,直接通過JTAG AP,以jtag方式,對連接到該jtag上的處理器進行訪問。

如果是APB訪問,通過APX mux,判斷對處理器訪問呢,還是掛接在debug APB總線上的coresight組件進行訪問,如果對處理器訪問,經過APB bridge對處理器進行訪問。如果對掛接在debug APB總線上的coresight組件進行訪問,那麼就直接進行訪問。

下圖是debug組件,在coregisht系統中的位置。

2trace

2.1core的簡單trace系統

下圖是單core的簡單trace系統,只有一個trace源。

只有一個trace源(ETM),因此中間都不需要trace link組件,trace源直接將trace信息輸出給trace sinkTPIU)。因爲只有一個trace源,因此也不需要trace formatters

2.2core的高級trace系統

下圖是單core的高級trace系統,擁有用個trace源。

有多個trace源(ETMSTM),因此中間需要trace link組件(funnel),funnel合併trace信息,發送給replicatorsreplicators再分發給trace sinkTPIU,ETB)。因爲有trace link組件,因此trace sink需要trace formatters,將trace數據格式化,得到真正的數據。

2.3core的高級trace系統

有多個core,每個core有自己的trace組件。因此會包含很多trace功能的coresight組件。

3、多cluster的完整coresight系統

下圖是一個多cluster的完整的coresight系統。

系統中有兩個cluster

·        system1,以processor作爲主設備。這個系統中包括了coresight的多個組件,debug組件,trace組件,trigger組件。

·        system2,以DSP作爲主設備。這個系統中包括了coresight的多個組件,debug組件,trace組件,trigger組件。

兩個子系統通過interconnect連接到一起,實現相互間的通信以及訪問外部外設。同時兩個子系統的CTM和外部的CTM連接到一起,實現兩個子系統之間的event的相互傳輸。

整個系統中,包括一個DAPDAP中有一個DPSWJ-DPjtagsw協議轉化),和兩個APAHB-AP(產生AHB總線), APB-AP(產生APB總線)。

AHB-AP產生的AHB總線,直接連接到系統中的interconnect上,就可以訪問連接到interconnect的外部外設(如memory)。

APB-AP產生的APB總線,連接到兩個子系統的debug apb上,實現對子系統的coresight組件的寄存器訪問。如ETM,CTI,HTMfunnel等。同時APB總線還連接到了系統的debug apb上,實現對系統的coresight組件的寄存器訪問。如funnelETBTPIUCTI等。

兩個子系統的trace信息,通過各自的funnel輸出到系統的funnel上,funnel對兩個子系統的trace信息進行合併,然後輸出給replicatorreplicator將接收的trace信息,廣播給ETBTPIUTPIU在通過trace port將信息輸出到外部。


 

八、coresight soc-400

因爲coresight屬於ARM制定的標準,因此ARM針對coresight,設計出來soc-400套件。設計人員可以利用這個套件,快速的生成coresight系統,並且生成相應的case,對coresight系統進行驗證。

coresightsoc-400系統框圖:

這個套件中,可以利用AMBA-designer來自動生成coresight的組件,只需要更改一些配置信息即可自動生成。

1DAP組件

DAP的一般結構:

SWJ-DP和外部的swjtag通信,然後和DAPBUS通信。實現對各個AP的訪問。然後各個AP再對片內內部資源進行訪問。

SWJ-DP包括兩個DP,一個是SW-DP,一個是JTAG-DPSW-DP負責和外部的sw通信,JTAG-DP負責與外部的jtag通信。

下圖是DAP的內部結構,包含一個DP5AP

DAP將外部接口數據(externalinterface format),也就是SW協議數據或者JTAG協議數據,轉化爲內部的接口數據(internal interface),也就是AP訪問數據。

1.1 SWJ-DP

jtagsw總線協議,轉化爲dap總線。

接收jtagsw數據,如果是對DP訪問,直接在內部對DP的寄存器進行訪問。如果是對AP的訪問,轉化爲dap總線,對後級所接的AP進行訪問。

組件,還提供了兩個power域的上電請求(system powerdebug power),以及debug域的復位請求。

對於兩個power域的信號,每個信號都是1bit信號。

信號

作用

cdbgpwrupreq

DAP向power控制器發送的debug power域的上電請求以及時鐘使能信號

cdbgpwrupack

power控制器向DAP迴應的debug power域的上電請求以及時鐘使能響應信號

csyspwrupreq

DAP向power控制器發送的system power域的上電請求以及時鐘使能信號

csyspwrupack

power控制器向DAP迴應的system power域的上電請求以及時鐘使能響應信號

debugger通過控制這些信號,來實現對debug power域和system power域的上電以及時鐘使能請求操作。而控制這些信號,是通過寫DACRTL/STAT寄存器來實現。

該寄存器的31-28bit

在實際中,可能power域是斷電,或者時鐘是關掉的。此時debugger要對這個power域中的組件進行訪問,就需要將該power域給開啓以及將時鐘給開啓。此時就需要這些信號。

兩個power域的請求信號是獨立的,因爲兩個power域都是獨立的,互不干擾。

REQ信號變高後,表示要power uppower控制器應該將ACK信號拉高,表示響應該請求。而REQ信號變低後,表示要power downpower控制器應該將ACK信號拉低。

對於debugger,可以訪問該寄存器,讀取ACK的值,即可知道該power域是否有上電。

reset也是一樣的。DAP可以請求復位debug域的寄存器。也是通過CTRL/STAT寄存器來控制。

時序如下:會驅動PRESETDBGn信號爲低,從而實現debug復位。

1.2 DAPBUS互聯

連接DP和後續的所有AP。組件會根據DPselect寄存器,決定是對哪一個AP進行訪問,從而生成對該AP訪問的總線。

對於地址dapcaddrs[15:2]

·        dapcaddrs[15:8]:是select寄存器的最高8位的值,也就是AP的選擇

·        dapcaddrs[7:2]訪問AP寄存器的地址

1.3 AXI-AP

AXImaster,訪問該AP,可以發起AXI訪問。輸入DAP總線,輸出AXI總線。

1.4 APB-AP

APBmaster,訪問該AP,可以發起APB訪問。輸入DAP總線,輸出APB總線。

2APB互聯組件

APB互聯組件,連接了衆多的coresight組件,外部可以通過APB互聯,實現對連接到APB互聯上的coresight組件的訪問。

以下是APB互聯組件框圖:

APB互聯組件包括以下的一些互聯組件。

2.1 rom table

每個APB互聯組件,至少連接一個rom table組件,並且該組件的地址爲0x0000_0000,這樣外部通過rom table,在能知道連接到該APB互聯組件上的所有coresight組件信息。

2.2 APB異步橋

coresight組件,和APB互聯的時鐘,可能是異步的,因此需要一個異步橋,進行轉換。

2.3 APB同步橋

coresight組件,和APB互聯的時鐘,可能是同步,但是不是同頻,因此需要一個同步橋,進行轉換。

3ATB互聯組件

ATB互聯組件包括以下的一些互聯組件

3.1 replicator

replicator用來將上級的master發送的ATB數據,傳輸給下級的兩個ATB slave組件。

結構如下圖所示:

總共有4port

·        ATB slave port:接收上一級的ATB masterATB數據

·        optional APB port:配置replicatorAPB總線端口,外部通過該APB總線設置replicator

·        ATB master port0:輸出給master0ATB總線

·        ATB master port1:輸出給master1ATB總線

3.2 funnel

將多個ATB輸入,合併成一個ATB輸出。

結構如下圖所示:

3port

·        ATB slave port:接收上級的ATB總線,至少有兩組

·        optional APB port:配置funnelAPB總線端口,外部通過該APB總線設置funnel

·        ATB master port:輸出給masterATB總線

3.3 upsizer

將輸入的數據位寬爲SBW+1ATB總線,轉換爲數據爲數據位寬爲MDW+1ATB總線。MDW >= SBW

ATB_DATA_WIDTH_SLAVE:8,16,32,64

ATB_DATA_WIDTH_MASTER:8,16,32,64

3.4 downsizer

將輸入的數據位寬爲SBW+1ATB總線,轉換爲數據爲數據位寬爲MDW+1ATB總線。MDW <= SBW

ATB_DATA_WIDTH_SLAVE:8,16,32,64

ATB_DATA_WIDTH_MASTER:8,16,32,64

3.5 asynchronous bridge

跨時鐘域(異步時鐘)的數據轉換橋。

將時鐘爲clksATB總線,轉換爲時鐘爲clkmATB總線。

3.6 synchronous bridge

跨時鐘域(同步時鐘)的數據轉換橋。

將時鐘爲clksATB總線,轉換爲時鐘爲clknmATB總線。

4timestamp組件

timestamp組件,用來生成時間信息的。

組件,根據SCLK,產生計數值,然後發送給各個coresight組件,這樣各個組件就有了時間信息。

5ECT組件

ECT包括CTICTM

5.1 CTI

CTI用來接收和發送triggerchannel信號用。

·        trigger interface:連接需要發送trigger,接收trigger的組件

·        channel interface:連接CTM,接收CTM發送的channel,以及發送channelCTM

·        APB interface配置CTIAPB總線,外部通過該APB總線,設置CTI

5.2 CTM

CTM,連接各個CTI

6trace sink組件

6.1 TPIU

trace portinterface ,接收trace信息,發送trace信息到片外。

·        debug apb port:配置TPIUAPB接口,外部通過APB總線,設置TPIU

·        ATB slave port接收trace sourcetrace linktrace數據

·        trace port:芯片的輸出管教,輸出信息給外界

·        trigger port連接CTI

內部結構如下圖:

接收ATB發送的trace信息,通過formatter,將數據轉化,得到真正的數據信息,保存在FIFO中。

因爲有2個時鐘域,一個是片內的時鐘域,一個是片外的時鐘域,因此該FIFO是異步FIFO,寫是在atclk時鐘域寫入,讀是在traceclkin時鐘域讀取。讀取之後,通過trace out,將數據以串行方式,從接口發送出去。

APB接口,是TPIU向外部提供了配置TPIU寄存器的APB接口。

6.2 ETB

embedded tracebuffer。存儲trace信息的buffer

內部結構如下:

接收ATB發送的trace信息,通過formatter,將數據轉化,得到真正的數據信息,然後通過trace RAMinterface,將數據,保存到trace RAM中。

APB接口,是ETB向外部提供了配置ETB寄存器的APB接口。

7power requestor

power requestor可以讓外部通過APB總線控制指定power domain的上電和斷電。從而控制指定的coresight組件的power

8、總結

coresight-400,其實就是ARM實現coresight系統的套件,包含了coresight的各個組件,我們利用這個套件,就不再需要自己單獨去設計以及驗證這些coresight組件,直接拿過來,搭建soc環境。並且coresight-400組件,還提供了一些測試case,可以用來驗證搭建的coresight系統,是否正確。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章