國立中山大學資訊工程所碩士論文Processor-OpenOCD整合之 ...

128
國中山大學資訊工程所 士論 Department of Computer Science & Engineering National Sun Yat-sen University Master Thesis Processor-OpenOCD整之軟硬體協驗證 Hardware/software co-verification for processor-OpenOCD integration 研究:黃士桐 Shih-Tung Huang 指導教授﹕黃英哲 教授 Prof. Ing-Jer Huang 中華國1028 August 2013 Processor-OpenOCD 101

Transcript of 國立中山大學資訊工程所碩士論文Processor-OpenOCD整合之 ...

國立中山大學資訊工程所

碩士論文

Department of Computer Science & Engineering

National Sun Yat-sen University

Master Thesis

Processor-OpenOCD整合之軟硬體協同驗證

Hardware/software co-verification for processor-OpenOCD integration

研究生:黃士桐 Shih-Tung Huang

指導教授﹕黃英哲 教授

Prof. Ing-Jer Huang

中華民國102年8月 August 2013

資訊工程研究所

碩士論文

Pro

cessor-O

penOC

D 整

合之軟硬體協同驗證

研究生:黃士桐

101學年度

國立中山大學資訊工程所

碩士論文

Department of Computer Science & Engineering

National Sun Yat-sen University

Master Thesis

Processor-OpenOCD整合之軟硬體協同驗證

Hardware/software co-verification for processor-OpenOCD integration

研究生:黃士桐 Shih-Tung Huang

指導教授﹕黃英哲 教授

Prof. Ing-Jer Huang

中華民國102年8月 August 2013

論文聲明書

本論文內容與技術承接自國立中山大學資訊工程學系黃英哲教授指導之嵌

入式系統實驗室,本論文可由指導教授或所指定之第三人,作為研發、推廣、

學校教學教材等使用,或依其需要進行改作、重製、散布、發行或公開展示等

等。本論文作者同意不對指導教授或所指定之第三人行使智慧財產權(包括專利

及著作權)。

(簽章)

論文作者:黃士桐

中華民國 102 年 8 月 19 日

致謝

終於到了這時刻,我要先感謝老師的指導,給我很多的啟發與研究態度,

之後我要感謝我的父母親無條件的支持,使我能無後顧之憂的拼到現在並成功

畢業,在此將這篇論文獻給我的父母。

在實驗室的四年當中也發生許多事情許多曲折,也差點想要放棄,最重要

的是感謝建宏學長與宗正學長的支持,俊宏學長也給予我非常多的幫助,我只

能說,沒有他們我可能就沒辦法畢業了;小胖經常待我出去吃東西、子銘學長

幽默有趣的互動總是讓我哈哈大笑,猴子哥雖然很機掰,但總的來說也是很有

趣的,允 B 哥總是扮演被猴子哥欺負的角色,然後在偷婊猴子哥,靖驊在我最

後畢業時間內總是陪我騎腳踏車,達哥找吃宵夜與吃冰、庭萱找食物的能力也

是讓我大吃一驚,喔,對了,我一定會記得去年 10月 10號,猴子、我、KKL

與庭萱去墾丁遊玩,遽然在早上 10點抽到 10號小杜包子號碼牌,真是非常有

紀念意義的,只可惜號碼牌丟了,許許多多的回憶,族繁不及備載,不管如何

我還是畢業了,也要準備開啟人生的下一階段,最後也祝福達哥之後一定要順

利畢業。

學年度: 101

學期: 2

校院: 國立中山大學

系所: 資訊工程學系

論文名稱(中): Processor-OpenOCD整合之軟硬體協同驗證

論文名稱(英): Hardware/software co-verification for processor-OpenOCD integration

學位類別: 碩士

語文別: 中文

學號: M983040048

頁數: 113

研究生(中)姓: 黃

研究生(中)名: 士桐

研究生(英)姓: Huang

研究生(英)名: Shih-Tung

指導教授(中): 黃英哲

指導教授(英): Ing-Jer Huang

關鍵字(中): 協同驗證

關鍵字(中): GNU除錯器

關鍵字(中): 電路擬真器

關鍵字(中): 整合

關鍵字(英): OpenOCD (Open On-Chip Debugger)

關鍵字(英): GNU Debugger

關鍵字(英): Co-verification

關鍵字(英): JTAG

關鍵字(英): EICE (Embedded In-Circuit Emulator)

中文摘要中文摘要中文摘要中文摘要

現今的 ARM program debug都是需要藉由 ARM 開發的 RVDS [18]

(RealView Development Suite)以及 MULTI-ICE (protocol converter)環境以

控制 ICE 控制 CPU,來達到對程式的偵錯,現在我們有新的選擇,就是

Eclipse、GDB與 OpenOCD (Open On-Chip Debugger)所組合起來的 debug

tool chain,配合 FIDI 公司出品的 protocol converter型號為 ft2232進行程

式的偵錯。

然而對於本身實驗室有開發 ARM7-like 的 CPU,即 SYS32TM,與可

控制 CPU的 ICE 模組,不管是 ARM 本身開發的 RVDS 或者 OpenOCD

都無法可以簡單的看到 debugger與 ICE的互動,造成不管是為了驗證 ICE

或 OpenOCD的正確性都非常的難,為了解決此問題我們思考了,使用

PLI(Program Level Interface)與 RTL simulator溝通再連接 OpenOCD,或使

用 Platform Architect本身的 co-simulation環境連接 OpenOCD,最後決定

採用 Platform Architect環境,並找到 embecosm EAN5裡面的 JTAGSC [3]

當成 protocol converter 放入Platform Architect環境,並藉由 shared memory

機制與 OpenOCD溝通已達到協同驗證的目的。

關鍵字:協同驗證,電路擬真器, GNU 除錯器, 整合, JTAG

Abstract

We usually use RVDS [18] (RealView Development Suite) and MUlTI-ICE

(protocol converter) as ARM program debug environment by controlling ICE

module for controlling CPU. But now we have another choice, ie the debug tool

chain that Eclipse, GDB and OpenOCD (Open On-Chip Debugger)

combination. We achieve program debugging by using a protocol converter

called ft2232 that FIDI Company produced to connect ICE module with JTAG

port.

However, for ARM7-like CPU, ie. SYS32TM, ICE can control the CPU

module that our laboratory develops. No matter the ARM RVDS or OpenOCD

can not observate the interactive of debugger and ICE, it such that the

verification of ICE and debugger is a difficult thing. In order to solve this

problem, we consider PLI (Program Level Interface) to communicate with the

RTL simulator and then connect to OpenOCD, or use the Platform Architect

itself co-simulation environment connected OpenOCD. Finally, we chose

Platform Architect environment and find the JTAGSC [4] as a protocol

converter that come from embecosm EAN5 that can put into the Platform

Architect environment. To achieve the purpose of co-verification, we ued shared

memory mechanism to communication with OpenOCD and Platform Architect

environment that JTAGSC had put into.

Key word: GNU Debugger, OpenOCD (Open On-Chip Debugger) , Co-

verification, JTAG, EICE (Embedded In-Circuit Emulator)

i

Index

Chapter 1 簡介簡介簡介簡介 ......................................................................................... 1

1.1 背景................................................................................................................. 1

1.2 動機................................................................................................................. 2

1.3 提出的解法..................................................................................................... 3

1.4 本研究貢獻..................................................................................................... 4

Chapter 2 相關技術與文獻相關技術與文獻相關技術與文獻相關技術與文獻 ..................................................................... 6

2.1 雛型階段應用程式除錯方法......................................................................... 8

2.1.1 目標監督程式...................................................................................... 8

2.1.2 邏輯分析儀.......................................................................................... 8

2.1.3 電路擬真器(In Circuit Emulator) .................................................. 9

2.2 嵌入式系統應用程式除錯架構................................................................... 10

2.2.1 即時追蹤除錯器................................................................................ 10

2.2.2 嵌入式電路擬真器............................................................................ 11

JTAG 架構 ........................................................................................ 13

嵌入式電路擬真器............................................................................ 15

2.3 用於控制電路擬真器之除錯器................................................................... 17

2.3.1 Open On-Chip Debugger [2] .............................................................. 18

2.3.2 GDB [6] .............................................................................................. 20

2.4 SC-RTL 協同模擬平台 ................................................................................ 21

Chapter 3 SYS32TM-OpenOCD 協同驗證平台協同驗證平台協同驗證平台協同驗證平台 ................................. 22

3.1 協同驗證平台開發動機............................................................................... 22

3.2 協同驗證平台研究方法............................................................................... 25

3.3 OpenOCD與 JTAGSC如何連接 ................................................................. 27

3.3.1 基於共享記憶體技術的溝通機制.................................................... 28

3.3.2 補足 JTAGSC不足之處的修改 ....................................................... 30

3.3.3 OpenOCD新增 JTAGSC驅動程式與初始化流程修改 .................. 33

3.3.4 協同驗證平台總觀............................................................................ 39

3.4 協同驗證平台如何重複利用....................................................................... 39

3.4.1 SC-RTL 協同模擬平台內部用到的元件與接線說明 ..................... 40

3.4.2 如何使用協同驗證平台.................................................................. 43

Chapter 4 實驗實驗實驗實驗 ....................................................................................... 47

4.1 SC model (JTAGSC)和 RTL model (SYS32TM+EICE) 可以正常執行協同

ii

模擬...................................................................................................................... 47

4.2 OpenOCD與 SC+RTL model互動驗證 ...................................................... 49

4.3 GDB 需要 EICE幫助的除錯動作 .............................................................. 51

4.4 Semihosting 機制.......................................................................................... 60

4.5 在協同驗證平台執行應用程式除錯範例................................................... 62

4.6 實際範例-以 JPEG編碼程式與 3DG SoC程式為例 ................................ 72

4.6.1 JPEG 編碼程式 ................................................................................. 72

4.6.2 3D graphs SoC 應用程式 .................................................................. 78

Chapter 5 結論與未來發展結論與未來發展結論與未來發展結論與未來發展 ................................................................... 81

Appendix A OpenOCD 架構架構架構架構 ................................................................. 84

A.1 OpenOCD 架構與運作流程........................................................................ 84

A.1.1 OpenOCD內部模組.......................................................................... 84

A.1.2 OpenOCD 初始化與運作流程 ........................................................ 86

A.1.2.1 OpenOCD 初始化流程.................................................................. 86

A.1.2.2 OpenOCD 運作流程...................................................................... 87

A.2 ITRI’s Project – PACDUO(高效能平行架構核心採用 ARM9 以及雙

DSP為發展平台) ............................................................................................. 88

A.2.1 PACDUO [15] .................................................................................... 88

A.2.2 PACDUO除錯效能與使用 GDB控制問題 .................................... 90

A.2.3 尋找 PACDUO 問題所使用的方法 ................................................ 90

A.2.4 PACDUO問題解決與最後結果 ...................................................... 92

Appendix B EICE_control_event/JTAG 轉換器說明轉換器說明轉換器說明轉換器說明 ........................ 95

B.1 JTAGSC 介紹 .............................................................................................. 95

B.2 JTAGSC檔案目錄列表與編成元件可在 SC-RTL協同模擬平台使用 .... 97

B.2.1 JTAGSC 檔案目錄與結構 ............................................................... 97

B2.2 JTAGSC如何可以被當成元件在 SC-RTL協同模擬平台上使用 . 98

B.3 JTAGSC運作流程 ....................................................................................... 99

B.3.1 JtagSC.cpp and JtagSC.h ................................................................. 100

B.3.2 JTAGSC API運作流程 ................................................................... 104

B.3.3 TapStateMachine .............................................................................. 106

Appendix C 藉由協同驗證平台所找到的藉由協同驗證平台所找到的藉由協同驗證平台所找到的藉由協同驗證平台所找到的 OpenOCD與與與與 EICE 錯誤錯誤錯誤錯誤

................................................................................................................. 108 C.1 SYS32TM 無法被停止.............................................................................. 108

C.2 EICE無法控制 SYS32TM寫入記憶體 .................................................... 110

iii

C.3 中斷點觸發之後停止的位址不是設定中斷點得位址 ............................ 112

iv

Figure 圖圖圖圖 2-1 Debugging tool chain classify.......................................................................... 6

圖圖圖圖 2-2 Traditional ICE connection .......................................................................... 10

圖圖圖圖 2-3 Real-Time Trace architecture ....................................................................... 11

圖圖圖圖 2-4 Embedded ICE connection ........................................................................... 12

圖圖圖圖 2-5Board level Boundary Scan architecture ...................................................... 14

圖圖圖圖 2-6 JTAG architecture ......................................................................................... 14

圖圖圖圖 2-7 TAP Finite State Machine ............................................................................. 15

圖圖圖圖 2-8 Embedded ICE component ........................................................................... 16

圖圖圖圖 2-9Breakpoint Detection Unit architecture ....................................................... 17

圖圖圖圖 2-10 OpenOCD retarget idea .............................................................................. 18

圖圖圖圖 2-11 OpenOCD modules ...................................................................................... 19

圖圖圖圖 2-12 Platform Architect ....................................................................................... 21

圖圖圖圖 3-1 Traditional find bugs between debugger and EICE ................................... 22

圖圖圖圖 3-2 ideal of this thesis ........................................................................................... 23

圖圖圖圖 3-3 traditional program debug method .............................................................. 25

圖圖圖圖 3-4 propose co-verification platform .................................................................. 25

圖圖圖圖 3-5 propose framework with PLI and RTL simulator ...................................... 26

圖圖圖圖 3-6 propose framework with JTAGSC and co-simulation platform ............... 27

圖圖圖圖 3-7 shared memory communication working flow............................................ 28

圖圖圖圖 3-8 EICE control event context ........................................................................... 29

圖圖圖圖 3-9 feed back data from hardware ..................................................................... 30

圖圖圖圖 3-10 RUNTEST API working flow ..................................................................... 31

圖圖圖圖 3-11 the architecture of Co-verification platform ............................................. 31

圖圖圖圖 3-12 the arch. working flow after modification ................................................. 32

圖圖圖圖 3-13 the algorithm of JTAGSC communication with OpenOCD by shared

memory .............................................................................................................. 33 圖圖圖圖 3-14 OpenOCD initial flow and working flow ................................................... 34

圖圖圖圖 3-15 scan data structure in OpenOCD ............................................................... 35

圖圖圖圖 3-16 JTAG cmd structure in OpenOCD ............................................................ 35

圖圖圖圖 3-17 scan data to EICE control event algorithm ............................................... 36

圖圖圖圖 3-18 feed back data to scan data algorithm ....................................................... 37

圖圖圖圖 3-19 how to add interface driver......................................................................... 37

圖圖圖圖 3-20 the final framework of co-verification environment ................................ 39

圖圖圖圖 3-21 the component and connection in Platform Architect .............................. 40

圖圖圖圖 3-22 the architect compile argument setting flow ............................................. 44

v

圖圖圖圖 3-23 the architect simulation flow ...................................................................... 45

圖圖圖圖 3-24 OpenOCD connect to JTAGSC successfully ............................................. 45

圖圖圖圖 3-25 location of shm address ............................................................................... 46

圖圖圖圖 4-1 final frame work with GDB .......................................................................... 47

圖圖圖圖 4-2 the basic emulation connection graph ......................................................... 61

圖圖圖圖 4-3 the example program will be debugged by GDB on co-verification

platform ............................................................................................................. 63 圖圖圖圖 4-4 the OpenOCD configuration file context ..................................................... 64

圖圖圖圖 4-5 GDB debug quick sort and binary search (#1) ........................................... 66

圖圖圖圖 4-6 GDB debug quick sort and binary search (#2) ........................................... 67

圖圖圖圖 4-7 GDB debug quick sort and binary search (#3) ........................................... 68

圖圖圖圖 4-8 GDB debug quick sort and binary search (#4) ........................................... 69

圖圖圖圖 4-9 OpenOCD infomation for executing quicksort with binary search .......... 71

圖圖圖圖 4-10 Full Example environment ......................................................................... 72

圖圖圖圖 4-11 tool chain usage flow .................................................................................... 73

圖圖圖圖 4-12 GDB control flow #1 of JPEG encoder ...................................................... 75

圖圖圖圖 4-13 GDB control flow #2 of JPEG encoder ...................................................... 76

圖圖圖圖 4-14 GDB control flow #3 of JPEG encoder ...................................................... 77

圖圖圖圖 4-15 JPEG encoder result of after GDB controlling ......................................... 78

圖圖圖圖 4-16 the flow of SYS32TM driving GPU to draw a picture ............................. 78

圖圖圖圖 4-17 GDB control flow of 3D graphs SoC .......................................................... 79

圖圖圖圖 4-18 3D graphs SoC result of after GDB controlling ........................................ 80

圖圖圖圖 A-1 OpenOCD framework and operation flow graph...................................... 86

圖圖圖圖 A-2 OpenOCD initial flow ................................................................................... 87

圖圖圖圖 A-3 PACDUO architecture .................................................................................. 89

圖圖圖圖 A-4 PACDUO view ............................................................................................... 89

圖圖圖圖 A-5 the different between OpenOCD and USB_driver .................................... 91

圖圖圖圖 B-1 JTAGSC reset code example ........................................................................ 95

圖圖圖圖 B-2 JTAGSC IRScan code example ................................................................... 96

圖圖圖圖 B-3 JTAGSC DRScan code example .................................................................. 96

圖圖圖圖 B-4 JTAGSC file relation .................................................................................... 98

圖圖圖圖 B-5 file list need to be compiled .......................................................................... 99

圖圖圖圖 B-6 input and output port of JtagSC ............................................................... 100

圖圖圖圖 B-7 initail part of JtagSC .................................................................................. 100

vi

圖圖圖圖 B-8 JTAGSC operation flow ............................................................................. 102

圖圖圖圖 B-9 working flow chart JTAGSC operation flow ............................................ 103

圖圖圖圖 B-10 example of JTAG EICE control event ..................................................... 104

圖圖圖圖 B-11 flow chart of IR or DR working flow ...................................................... 105

圖圖圖圖 B-12 TAP FSM decision table ........................................................................... 106

圖圖圖圖 B-13 TMS decision table .................................................................................... 107

圖圖圖圖 C-1 EICE architecture ....................................................................................... 108

圖圖圖圖 C-2 scan chain2 connection with BDU before modification ........................... 109

圖圖圖圖 C-3 scan chain2 connection with BDU after modification ............................. 110

圖圖圖圖 C-4 EICE control event activities form OpenOCD ........................................ 111

圖圖圖圖 C-5 the cpu control signals path in EICE ........................................................ 113

vii

Table

表表表表 3-1 time spending compared between traditional and proposed verification 23

表表表表 3-2 signal number and trace length comparing ................................................ 24

表表表表 3-3OpenOCD JTAGSC driver ............................................................................ 38

表表表表 3-4 the environment component description ..................................................... 41

表表表表 3-5 JTACSC component description .................................................................. 42

表表表表 3-6 the RTL component description ................................................................... 43

表表表表 3-7the architect compile argument setting value .............................................. 44

表表表表 4-1 JTAGSC IR API experiment result .............................................................. 48

表表表表 4-2 JTAGSC DR API experiment result ............................................................ 49

表表表表 4-3 JTAGSC RUNTEST API experiment result ............................................... 49

表表表表 4-4 GDB debugging activities with OpenOCD and RTL EICE ....................... 56

表表表表 4-5GDB debugging activities with OpenOCD and RTL EICE result ............. 60

表表表表 4-6 common semihosting type table.................................................................... 62

表表表表 A-1 Target Handle function list .......................................................................... 92

表表表表 A-2 testing result .................................................................................................. 93

表表表表 A-3 ft2232d Load speed from YAGARTO ......................................................... 94

1

Chapter 1 簡介簡介簡介簡介

本章將會介紹有關此論文之研究主題的背景、研究的動機、研究的方法以及

論文的主要貢獻,並且在本章的最後會對整篇論文的組織架構進行逐一地探討,

藉此讓我們在正式進行研究主題的討論前,先有初步的具體概念。

1.1 背景背景背景背景

近年來隨著製程不斷的進步, IC 設計也朝著 SoC (System On a Chip)的方

向設計,而在製程進入深次微米的時代,我們可以將許多不同的硬體電路整合

到同一個系統單晶片中,所以在系統單晶片中的電路會越來越複雜。因此要針

對這樣一個龐大且複雜電路進行除錯且驗証,對於系統設計者是一個非常大的

挑戰。而在 Embedded system核心,微處理器(microprocessor)或數位訊號處理

器(DSP)是系統最為重要且複雜的電路,所以針對微處理器的除錯與驗証是最耗

費時與精力的一個環節。

而 Embedded In-Circuit Emulator (EICE) 的觀念建立在日趨複雜的晶片設計

上,透過 Embedded ICE電路可以針對複雜嵌入式微處理器來進行除錯,而

Embedded ICE的除了硬體除錯機制之外,也需要搭配軟體應用,所以針對這項

問題 ARM 公司所推出 RealView debugger tools和 Multi-ICE protocol

converter,可以提供設計者在軟體端可以監控微處理器的內部狀態,然而

RealView debugger tools與 Multi-ICE protocol converter都不是 Open Source,對

於要研發配合不同 CPU的 EICE模組軟體端方面就成了問題。

針對微處理器的驗證與除錯,目前我們有下列幾種主要的方法:

1. 電路模擬器電路模擬器電路模擬器電路模擬器(Simulator)

電路模擬器是一個最為簡單、迅速用來初步驗證我們微處理器設計的作

法。通常我們在定義好電路的規格之後,在實際設計完成硬體電路之前,

我們會先撰寫好一個使用高階程式語言所描述的電路模擬器來做初期的

功能驗證。等到硬體都實作完成之後我們可以拿模擬器以及實際的硬體

電路進行功能的比對,用來確保我們在硬體設計上與原先訂出的規格是

一致的[20]。

2. 電路擬真器電路擬真器電路擬真器電路擬真器(In Circuit Emulator)

電路擬真器是一個用來取代並且模擬電路中微處理器行為的硬體電路,

搭配上軟體的支援通常可以提供除錯者設定中斷點(Breakpoint)、單步執

行(single step)、觀察內部暫存器狀態等除錯的功能。使用電路擬真器可

2

以非常完整的針對微處理器進行除錯,是一般微處理器系統最為普遍的

除錯方式[14]。

3. 即時追蹤除錯器即時追蹤除錯器即時追蹤除錯器即時追蹤除錯器(Real-Time Trace)

及時追蹤除錯器是一種嵌入於微處理器系統當中,不需要停止除錯之目

標微處理器而可以達到除錯效果的硬體電路。使用及時追蹤除錯器來對

於微處理器除錯的最大優點在於因為不需要將微處理器的時脈停止下來,

因此可以追蹤出更真實的微處理器際執行狀態[21]。

1.2 動機動機動機動機

在一個大型複雜的數位電路開發的過程中,最耗時是在於 IP 的功能驗証及

除錯,所以這將會影響到整個晶片的開發時程。所以設計工程師必須在能夠有快

速且有效率的對於自行開發的晶片進行驗証及除錯,來達到 time to market。

而嵌入式微處理器是整個 SoC 晶片中最複雜的電路。嵌入式電路擬真器

(EICE)是目前微處理器最常見的也是最普遍使用的除錯技術。因為 ICE 本身可

以提供良好的除錯與測試機制,像是:單步 (Single Step) 除錯、中斷點

(Breakpoint) 的設定與偵測、內部資源的監督與修改。使用 ICE 的主要優點是可

以提供良好的系統控制能力,而且只要使用四個訊號線的 JTAG Port 以主從模

式的靜態除錯 (Static Debug) 方式即可控制整個除錯系統。所謂的靜態除錯指的

是要將微處理器的資訊 (如:暫存器的狀態)傳出前,必須先終止微處理器的時脈,

然後透過慢速的 JTAG 串列介面來傳遞測試樣本 (Test Patterns)。

而一般在使用嵌入式電路擬真器必須配合 PC端的軟體除錯工具來進行除錯,

在目前的微處理器系統中之嵌入式電路擬真器的設計都是符合PC端的軟體除錯

工具也就是 debugger,所以當我們對於在不同的微處理器上所自行開發的嵌入式

電路擬真器,在設計實作上都會被限制在 debugger上,所以當 debugger升級或

是改變就會造成自行開發的嵌入式電路擬真器功能無法使用。因為是商用軟體套

件,無法針對軟體部分進行修改,所以就必須要修改嵌入式電路擬真器的硬體模

組,來符合新的 debugger規範。所以這就表示,硬體的設計都被限制在軟體的規

範。

3

RVDS Multi_ICE CPU+EICE

FT2232

USB JTAG

GDB+OpenOCD CPU+EICEJTAGUSB

debugger

Can not modify

Can modify

Adapter

Cost NT$100k

Cost NT$2k

Commercial

Open source

FPGA

GDB+OpenOCD JTAGSC CPU+EICE

Co-simulation platform (Platform Architect )

processor/OpenOCD Co-verification platform

SHM JTAG

Can not observe signal

Can observe signal

RTL simulationSystemC

圖 1-1 comparison of commercial and open source debugger

所以為了不要將硬體的設計被限制在軟體,我們軟體將會採用 open source

software稱作 Open On-Chip Debugger[2](以下簡稱 OpenOCD)來取代 commercial

debug tool,使得硬體不用被軟體所局限住,除此之外每當硬體因應效能調升而硬

體架構有所變動時,也不需要擔心無法符合 commercial debug tool,只要修改

OpenOCD來符合硬體架構就好,如此一來,就可以減少與減免為了與 commercial

debug tool相容而導致硬體架構開發的時間與妥協。

而為了達到提高驗証嚴謹度和有效率的除錯,則是藉由 Platform Architect co-

simulation的應用,可以直接將 host端 OpenOCD的 EICE control event透過 shared

memory方式,連接到 Platform Architect中的 RTL level的硬體直接驗証,減少在

FPGA合成驗証時間。

針對以上議題,本篇論文的目的主要是針對軟體的部分深入討論,配合軟硬

體協同設計理念,以及 debug tool chain debugger採用 OpenOCD,這樣可以掌握

軟體和硬體的開發環境,希望可以探討出對於 Embedded ICE的開發並應用

Platform Architect co-simulation環境,達到有效率的除錯及加強驗証的嚴謹度,

而且掌握軟體也可以達到不修改 Embedded ICE硬體,可以容易且快速應用在不

同的嵌入式電路擬真器。

1.3 提出的解法提出的解法提出的解法提出的解法

關於這項研究,我們將會細分為下列數個步驟逐一實現我們的研究工作。

1. 系統分析系統分析系統分析系統分析(System analysis)

4

針對我們的研究,主要分成硬體和軟體二個部分來探討:

在硬體方面,在不同的微處理器的硬體架構,所支援嵌入式電路擬真器

(Embedded In-Circuit Emulator)設計上也有所異同。一般來說,針對不同

微處理器所使用的嵌入式電路擬真器在硬體的設計上會有許多的不同

之處。舉例來說,微處理器的掃瞄串列 (Scan Chain)的實做方式就可以

分為內部掃瞄串列 (Internal Scan Chain)以及包覆式掃瞄串列 (Boundary

Scan Chain)兩種,而在不同的硬體架構下,所設計出來的嵌入式電路擬

真器在控制上就要給予不同的除錯資訊。所以,我們必須歸納出不同微

處理器所設計出來的嵌入式電路擬真器之間所具有共通的部分以及不

同的部分,以及那些不同的設計會影響除錯軟體的可重複使用性。針對

不同的嵌入式電路擬真器,來找出設計異同處的特性,可以幫助我們在

軟體端的開發。

在軟體方面,使用 OpenOCD,主要可以掌握軟體端的 source code,可

以針對不同的嵌入式電路擬真器,由軟體端來設計符合的溝通介面及連

接機制,不用再重新改寫 Embedded ICE硬體架構。

2. 實作及驗證實作及驗證實作及驗證實作及驗證(Implementation and Verification)

將己經評估且分析完成的軟硬體架構進行實作。

(1) 使用 open source debugger tool (OpenOCD):

掌軟體端的技術,修改軟體端的 debugger來符合硬體需求

(2) 使用不同的 JTAG protocol converter(例如:parallel port 或 USB

interface):

我們可以不用關心 JTAG protocol converter支援 parallel port或 USB

interface,因為掌握了軟體端,所以我們可以修改軟體來支援所使用

的 protocol converter。

(3) 硬體和軟體的 co-verification platform或是新的驗証方法:

我們可以透過使用 Platform Architect co-simulation 環境,可以使嵌

入式電路擬真器在 RTL level 與 debugger直接進行驗證,可以節省

FPGA在合成驗証的時間。

1.4 本研究貢獻本研究貢獻本研究貢獻本研究貢獻

此篇論文的主要貢獻在於將理想化作實際的研究探討並加以實現。在目前的

嵌入式微處理器的除錯是藉由嵌入式電路擬真器(Embedded In-Circuit Emulator)

配合商業軟體套件來進行除錯及驗証。因此,只要是自行設計開發的 EICE或是

商業軟體套件停產或是升級時,EICE 硬體就必須重新修正來符合最新的商業軟

5

體套件,由於升級新的套件也會造成 COST提高。

所以針對此問題,本篇論文是要運用目前最普遍的 IEEE 1149.1測試除錯通

訊埠做為基礎架構,將商業軟體套件改成開源碼的 OpenOCD,來達到 cost down

的目的,而且應用 OpenOCD可以掌握軟體端的資訊,而且配合 Platform Architect

co-simulation環境,對於自行開發的硬體架構,可以 RTL level直接進行驗證,

可以節省 FPGA 在合成驗証的時間,可以達到快速除錯及提高驗証嚴謹度的目

的。

6

Chapter 2 相關技術與文獻相關技術與文獻相關技術與文獻相關技術與文獻

微處理器的除錯在電腦系統中一直是一個相當重要的議題,一個好的除錯環

境可以幫助軟體開發者迅速的找出程式設計上的錯誤,進而降低了軟體開發的困

難度。由於除錯的重要性,對於不同時期、不同架構的微處理器皆發展出不同的

除錯方式,所以近十幾年來有相當多的研究在探討有關微處理器的除錯方法。而

在除錯軟體方面,由於除錯架構的快速變遷,從早期使用純軟體的方式進行除錯,

中期使用 In-Circuit Emulator將所有微處理器的訊號拉出來控制與觀察到目前進

入到系統單晶片時代後大家所致力於的嵌入式除錯電路,對於除錯軟體端而言是

一個相當大的改變。除錯硬體對於微處理器的除錯能力一再地提升,除錯的軟體

提供的除錯功能上亦有所不同。在本章我們將會針對過去幾年來,國內外學者在

微處理器之除錯的硬體以及軟體上所做的研究進行整理。

我們先介紹一般除錯工具軟體在分類上有什麼不同的區別,以及硬體在整體

工具鍊上扮演哪種角色,另外我們還會分析目前常見除錯軟體所提供的一些除錯

功能並且在最後蒐集目前市面上的一些個人電腦端的除錯軟體,對其做一些簡單

的介紹。 SoC application code debugging tool

CPU is simulator (ISS)

ARMulator MIPS simulator

CPU do not execute OS

Real time trace[9]

BDMEICE[1]

Debug sof tware(OpenOCD[2])

USB/JTAG protoc ol

converter [7]

CPU with EICE

USB

JT

AG

FPGA

HOST

Adapter (H/W)

program

GDBR SP on TCPIP

...

CPU execute OS

GDB[6] not remote type

GDB remote type

GDB remote

H/W

Linux kernel

GDB APP

Tartget

program

...

H/W

RTOS kernel

GDBServer APP

Tartget

program

... HOST

GDBRSP on TCP/TP

Debug software(OpenOCD[2])

JTAG protocol

converter[4]

CPU with EICE

SHM JTAG

RTL

HOST

Adapter (SC)

program

GDBRSP on T CPIP

Systemc RTL co-simulation platform

圖 2-1 Debugging tool chain classify

在進入除錯工具軟體與硬體討論之前,先對除錯工具軟體骨架與類別作大概

介紹與分類,如圖 2-1 Debugging tool chain classify所示,基本上如果要對

Application program除錯,可以依”SoC發展階段”來作除錯工具的分類,分為三

階段分別為模擬階段、雛型階段、成熟階段,所以分類與說明如下:

� 模擬階段:CPU is simulator,還未有硬體雛型出來之前,通常使用 CPU

7

模擬器來除錯 Application program,觀察重點在於 program與 CPU執行

流程是否是符合預想,主要採用 ISS (Instruction Set Simulator)為模擬方

式,program編譯成執行檔之後,透過 ISS在不同的 CPU上執行,以了

解 program流程與 CPU執行流程,缺點是速度慢,以及無法真實的模

擬 SoC實際狀況,頂多像 multiprocessor frontends [13]將 simulator架構

成可模擬 multi-core情況的 simulator,屬於初步想法驗證階段。

� 雛型階段:CPU do not execute OS,經過模擬階段驗證完想法,雛型階

段會先將 CPU與暫時的週邊實環境作出來,通常這階段由於週邊環境

還未確定,所以不會有 OS,驗證該 CPU與暫時的週邊環境通常會使用

RTL 模擬驗證,當 RTL 驗證完後會燒入 FPGA進行接近 gate level實體

驗證,然而由於沒有 OS的幫助,FPGA相當於封閉的環境,所以 CPU

沒有 OS的幫助的話要作 program 除錯有下列方式:

� Real Time Tracer or ROM monitor:不外乎原理就是當 program在

CPU 執行的時候抓取預先定義的特徵值已達到除錯的目的,在

program執行期間不需要 HOST 提供額外的幫助,屬於是 off-line

trace,缺點也是顯而易見的,就是追蹤長度不會太長。

� EICE:可以使用 JTAG訊號透過 EICE控制 CPU,使 FPGA不再是

一個封閉環境,以便可以控制 CPU達到對週邊開發與除錯,由於

控制 EICE的 JTAG序列太過複雜,基本上會使用軟體來輔助使用

者控制,該軟體稱為 debugger,常見的有 RVDS[18]、HJTAG[3]、

OpenOCD[2],而該軟體我們採用 OpenOCD,採用的原因是 Open

source所以方便修改、可使用不同的 Adapter不會被侷限高成本的

Adapter,在此採用的 Adapter是 FTDI 公司出產的 ft2232d晶片,

再者可以支援GDB送出的RSP命令,相當於GDB server輔助GDB

以 JTAG方式控制 CPU達成 on-line program除錯的目的,本論文

就是以這架構再行更進一步的探討,以下 GDB 與 OpenOCD被歸

類成 debug tool chain software部份,而 Adapter與 EICE和 CPU則

歸類在 debug tool chain hardware部份。

� 成熟階段:CPU execute OS,雛型階段完成後,所有的週邊除錯與開發

均完成,由於開發過程中週邊環境一定會越來越複雜,所以成熟階段通

常也會開發 OS 來輔助管理週邊硬體,在 CPU 有 OS 的幫助下執行

program除錯,可以依照 Target資源多或寡在進一步的分類:

� Target資源多:可以或得較多的 CPU時間執行 GDB 除錯 program

的動作,那麼就可以直接開啟 GDB除錯 program。

� Target資源少:有些硬體支援比較少,或者 OS 像 Real Time OS

(RTOS)有嚴格的限制使得被分配到的 CPU時間很難滿足 GDB 運

行,所以就必須要有 HOST幫助,將大部分 GDB內部較為複雜的

工作(例如管理程式碼與程式碼位址的對映)交由資源較多的

8

HOST端完成,而 Target則運行負擔較小的 GDB server,GDB server

主要目的就是接收與執行 GDB來的除錯命令,至於較複雜的反組

譯和程式碼對映交由 HOST GDB端執行。

綜合以上所述,只要雛型階段完成對週邊的開發與除錯,那麼在開發 OS也

會順利許多,雛型階段對週邊的開發與除錯成敗對成熟階段的 OS開發有很大的

影響,本論文主軸在於雛型階段使用 EICE為探討,主要發現的想法是 EICE與

debug software驗證這部份可以進一步的改良,以下描述雛型階段硬體方法的除

錯介紹,之後進入到除錯軟體的輔助介紹與分類。

2.1 雛型階段應用程式除錯方法雛型階段應用程式除錯方法雛型階段應用程式除錯方法雛型階段應用程式除錯方法

在本節中,我們將會介紹三種雛型階段較為常見的除錯機制,並且會在後面

的章節當中針對各種不同的除錯機制進行分析比較[4][9]。

2.1.1 目標監督程式目標監督程式目標監督程式目標監督程式

使用目標監督程式(Rom Monitor)在微處理器系統中進行除錯也是一種

相當常見的除錯作法。目標監督程式的作法是將監督程式嵌入到微處理器

系統內可以存取的記憶體空間當中,並且透過串列連線與個人電腦上的除

錯程式通訊。我們可藉由此程式幫助程式開發者讀寫記憶體及暫存器,並且

可藉由此程式將我們所設定中斷點位置的指令替換成 Interrupt 指令或是單

純的 Function Call,當執行到此被替換的指令時便會將使用權交給 ROM

Monitor程式。

整體來說,使用目標監督程式可以提供強大的除錯能力,因為研發人員

可於終端系統工作時查詢目標元件的狀態,但另一方面,這種方法卻須佔用

目標系統的使用者資源來提供串列連線和命令界面。除此之外,儲存於

ROM 記憶體的程式碼也無法以這種方法進行除錯,因為監督程式必須修改

程式記憶體以取得執行控制。由於監督程式通常是目標系統上的中斷驅動

型軟體程序,所以使用者並無法在中斷服務常式內設定中斷點;在複雜的嵌

入式系統中,中斷常式可能是整個程式的重要部份,因此無法在中斷常式內

除錯就成為很嚴重的缺點。

2.1.2 邏輯分析儀邏輯分析儀邏輯分析儀邏輯分析儀

在傳統上,當我們一旦將微處理器實際下線做成晶片之後,我們便很難

直接對此微處理器進行除錯。然而,這時候我們可以使用邏輯分析儀將晶片

9

外部腳位的訊號擷取出來觀察。

在早期的設計與除錯環境中,由於軟體設計人員通常都不太熟悉硬體

工具,所以他們通常會盡量避免使用這些工具來幫助程式進行除錯。軟體設

計人員在通常會在個人電腦或工作站上用 C++、VB 及高階的程式語言編寫

程式原始碼,並希望使用這些平台完成整個設計、除錯和評估過程。但由於

現在系統日趨複雜,相互之間影響也越來越大,這種狀況正在漸漸改變。

一般來說,邏輯分析儀由於性能的不同價錢也有天壤之別。而影響邏輯

分析儀性能的因素包含了取樣頻率(Sample Rate)、通道數目(Channel)、記憶

體大小、觸發功能(Trigger)等等。取樣頻率對於邏輯分析儀來說就是一個重

要選擇因素,對於微處理器的除錯而言,由於微處理器的執行時脈同常較

高,因此我們需要邏輯分析儀提供足夠的取樣頻率來對微處理器進行除錯。

若是無法提供足夠的取樣頻率的話,我們將無法從多個匯流排得到的結果

將他們正確聯結起來,當有問題出現時我們也會難以分辨出原因和結果之

間的關係。雖然從技術上說,得到的波形和儲存的內容是即時追蹤結果,但

是如果它不夠精確的話,對硬體和作業系統的故障判斷沒有多大幫助。

使用邏輯分析儀來進行除錯的時候,除了取樣頻率的問題以外,數據採

樣必須既要夠寬、夠深(能儲存大量儲擷取所得到的數據)。針對微處理器除

錯的時候我們通常需要觀察微處理器存取記憶體的狀況,因此我們需要一

個較寬的通道來擷取這些訊號。另外由於微處理器所執行程式經常需要跑

大量的時脈週期,因此針對微處理器來除錯我們需要一些較為高階的邏輯

分析儀帶有擴展記憶體的組合式邏輯分析儀來滿足除錯的需求。

由於儲存的記憶體容量通常相當有限,我們通常無法完整的擷取出欲

除錯程式的波形,因此邏輯分析儀通常會提供一些觸發功能,使用者可以設

定一些觸發的條件。在一般的狀況下,邏輯分析儀只是在監視擷取出來的訊

號,一旦遇到觸發的條件之後,邏輯分析儀才會開始記錄波形。一般來說觸

發的條件可以分為單階觸發、雙階觸發跟多階觸發等等,其中,我們還可以

使用預先觸發、延遲觸發、多次觸發等等進階的觸發條件。若是邏輯分析儀

可以提供複雜的觸發條件,配合上有經驗的程式設計師來進行除錯的話,程

式設計師可以很迅速的找出程式錯誤,達到有效率的除錯。

2.1.3 電路擬真器電路擬真器電路擬真器電路擬真器((((In Circuit Emulator ))))

近年來,對於微處理器的測試及除錯,許多的學者及業界都提出了許多

作法。其中,對於一個微處理器電路在首度生產製造出來的晶片進行測試及

10

除錯時,我們最常見的除錯機制就是使用電路擬真器(In-Circuit Emulator; ICE)。

傳統上,電路擬真器是做成一個外接的黑盒子,當我們要進行除錯的時候,

我們將系統中的微處理器抽換掉,而改由電路擬真器直接控制。我們通常會

使用個人電腦透過 printer port或是 COM port連接到這個外接的除錯器,然

後透過這個外接的除錯器來進行除錯的工作。其架構如圖 2-2所示。

由於我們必須要觀察微處理器的內部行為來幫助我們進行除錯,所以傳

統上電路擬真器必須要將微處理器中除錯所需要的腳位拉到外接的電路擬真

器黑盒子中進行偵測、除錯。然後再將除錯的資訊(例如中斷點的發生、某

個內部暫存器的值)透過 printer port或是 COM port傳送到個人電腦或工作

站,以便開發人員進行除錯的工作。

ICE BoxM icroprocessor Co re

圖 2-2 Traditional ICE connection

2.2 嵌入式系統應用程式除錯架構嵌入式系統應用程式除錯架構嵌入式系統應用程式除錯架構嵌入式系統應用程式除錯架構

2.2.1 即時追蹤除錯器即時追蹤除錯器即時追蹤除錯器即時追蹤除錯器

即時追蹤除錯器(Embedded Real-Time Trace Circuit)這樣的概念最早

是由 Motorola 以及其他幾家電子大廠所領導的 IEEE-ISTO Nexus 5001

Forum所提出[10],在 1999年時制訂出有關動態除錯 (Dynamic Debug) 的

相關標準。所謂動態除錯指的就是我們的除錯電路有能力在不停止微處理

器的時脈之下,依然可以提供系統開發者對於系統晶片的良好觀察能力。雖

然這個標準在 1999年的時候就已經被制訂出來,但是其中動態的除錯在實

際應用上仍然面臨了許多相當艱難的設計挑戰。其中一個最主要的問題是

在於如何不去破壞晶片原本的結構與狀態並且在不去降低處理器的運算速

度的條件下,仍然可以將微處理器執行程式時的相關資訊完整即時地擷取

出來。

11

與傳統的邏輯分析儀(Logic Analyzer)相比,即時追蹤除錯器與傳統邏

輯分析儀在訊號的追蹤能力上可說是各有所長。一個功能強大的邏輯分析

儀雖然可以對高速的邏輯訊號做即時性的捕捉,但是他只能針對晶片外部

的訊號腳位進行捕捉,對於嵌入在系統晶片內部的微處理器,由於非常多的

訊號並不會直接接到外部的晶片腳位上,因此我們無法針對內部匯流排的

訊號存取 (例如:微處理器與記憶體整合在同一個晶片上)。此時,唯有透

過嵌入式的即時追蹤除錯器的處理,才有辦法將系統單晶片內部匯流排的

訊號完整的擷取出來給系統除錯者。換言之,若系統開發者想要針對一個系

統單晶片中內部的微處理器模組進行即時的除錯,則一個嵌入式的即時追

蹤除錯器可以提供這樣的除錯能力

一般來說即時追蹤除錯器可以使用硬體或是軟體來設計。使用硬體來

設計追蹤除錯器的主要考量因素在於它的即時性。舉例來說,我們若想要對

所設計中斷常式 (Interrupt Service Routing; ISR) 進行除錯,必須考量到中

斷本身只會發生在系統單晶片中(Chip Level),若使用軟體模擬的方式去設

計追蹤除錯器,不僅會影響中斷常式設計的正確性 (如:所設計的中斷常式

的執行時間要小於某段時間,但是軟體的追蹤方法會造成執行時間的延遲),

系統本身也有可能無法有效的模擬中斷的發生(如:電話線路的插撥)。所以

使用硬體的設計方式來進行追蹤除錯器的開發是在於希望能在不影響處理

器行為之下,忠實地將程式跑過的位址資訊予以記錄。一個即時除錯追蹤器

的架構如圖 2-3 Real-Time Trace architecture所示

On Chip DebugWindows PC

Debugger Software

Debugger Box Trace Block Processor Core and IP Logic

Parallel Interface

Internal Bus

JTAG

圖 2-3 Real-Time Trace architecture

2.2.2 嵌入式電路擬真嵌入式電路擬真嵌入式電路擬真嵌入式電路擬真器器器器

在前面我們曾經提過傳統的電路擬真器可以提供微處理器系統相當完

12

整的除錯功能,但是由於目前積體電路的製程越來越先進,系統單晶片已成

為下一代晶片發展的趨勢,將來微處理器系統將會包含在單一個系統晶片

當中,對於系統單晶片中的的嵌入式微處理器,我們想要利用傳統的電路擬

真器來進行除錯上將會遇到一個很大的問題。

傳統上我們將微處理器放置在電路板上,因此我們可以針對除錯的需

求將需要的腳位拉到晶片外部來觀察。一旦我們將微處理器嵌入到系統單

晶片之中,由於微處理器的接腳只會有少部分連接到晶片的外面,因此傳統

的電路擬真器也無法對嵌入在系統單晶片中的微處理器進行除錯。針對這

樣的問題,現在普遍的作法是將電路擬真器直接嵌入至系統單晶片中。在

此,我們稱之為「嵌入式電路擬真器」,其基本架構如圖 2-4 Embedded ICE

connection所示[1]。在圖中,我們可以看到微處理器被嵌入至一個系統單晶

片之中,只有少數的腳位連接到晶片的外部。此時,針對這樣的微處理器,

我們在電路中加入了 TAP Controller以及 Embedded ICE的電路並且使用

JTAG來控制嵌入式電路擬真器進行除錯。

針對這樣嵌入於系統單晶片之電路擬真器,我們依然必須透過一個特

定的傳輸介面與嵌入式電路擬真器進行控制,包括將測試的指令送至嵌入

式電路擬真器中以及將測試的資料送至嵌入式微處理器執行。目前的作法

都是重複使用 IEEE 1149.1 Test Access Port and Boundary Scan Architecture的

電路,使用串列輸入的方式將測試、除錯的資料送到系統單晶片當中[11]。

SoC

Processor Core

IP Core

IP Core

IP Core

IP Core

IP Core

Embedded ICE

TAP Controller

JTAG 圖 2-4 Embedded ICE connection

13

一般來說,電路擬真器本身可以提供良好的除錯與測試機制,像是:單

步執行 (Single Step) 除錯、中斷點 (Breakpoint) 的設定與偵測、內部資源

的監督與修改...等等。此外,由於嵌入式電路擬真器重複使用了 JTAG接腳,

因此其最主要優點即在於測試者只需使用四條線的 JTAG Port (TCK, TMS

TDI, TDO)就可以提供相當良好的系統控制能力(IEEE 1149.1的規格中本

身提供五條訊號線,但一般只需要用到四條即可),而且以主從模式的靜態

除錯 (Static Debug) 方式控制整個除錯系統。所謂的靜態除錯指的是在我們

要將微處理器的資訊 (如:暫存器的狀態)傳出前,我們必須先將微處理器

的時脈停止下來,然後透過慢速的 JTAG 串列介面來傳遞測試樣本 (Test

Patterns)。

� JTAG 架構架構架構架構

IEEE Std. 1149.1 Boundary Scan Architecture(或稱之為 JTAG)是由

Joint European Test Action Group於 1985年所發表。隔年,此組織將北美

的研究團隊納入其中,正式改名為 Joint Test Action Group [12]。

JTAG最主要的目的是要制訂一個標準化的測試連接埠以及邊界掃瞄

(Boundary Scan)的架構。透過 IEEE 1149.1 Boundary Scan Architecture的實

現,我們針對一個電路板要進行測試的話,我們只需要多規劃出五根 JTAG

所需要用的腳位,透過電路板上的 TAP controller控制、傳送 testbench。

其概念如圖 2-5Board level Boundary Scan architecture所示。我們使用 JTAG

對電路板做測試時,首先要將電路板上的邏輯電路的接腳使用邊界掃瞄包

起來,然後再將各個掃瞄串列(Scan chain)以串接的方式串起來。接下來,

我們就可以透過這一條串列的通道將測試資料由 serial data in傳送至待測

的邏輯電路之中。而另外,我們可以藉由 serial data out輸出腳位觀察待測

邏輯電路的執行結果。

14

Logic circuit Logic circuit

Logic circuitLogic circuit

Serial data in

Serial data out

圖 2-5Board level Boundary Scan architecture

傳統上,JTAG的電路架構如圖 2-6 JTAG architecture所示。除錯者將

要除錯的指令或是資料透過 TDI 傳送至電路中。而要決定目前是送的是

除錯的指令或是除錯的資料則是由 TMS 所控制的有限狀態機的狀態來決

定。

TAPController

InstructionRegister

Decode Logic

Internal Logic

Data Register 1

Bypass Register

TCK

TMS

TDI

MUX TDO

Data Register 2

圖 2-6 JTAG architecture

圖 2-7 TAP Finite State Machine即為一個標準 IEEE 1149.1所定義的

TAP 有限狀態機,狀態機中各種狀態的轉移皆由 TMS 所輸入的訊號所決

定。當我們的電路重置時,此有限狀態機會處於 Test-Logic-Reset的狀態。

15

而此有限狀態機有一個非常良好的設計,就是不管目前的有限狀態機是處

於什麼樣的狀態,只要除錯者對 TMS 連續輸入五個以上的邏輯 1 時,此

有限狀態機就回到 Test-Logic-Reset的狀態,相當於輸入一個 TRST的訊

號。藉由這樣的設計,我們便可以依據我們的需求考慮省去 TRST的腳位。

當此 TAP 有限狀態機進入到在圖中靠左邊的那一排狀態時代表目前除錯

者從 TDI 輸入的是除錯的資料,而當進入到在右邊的那一排狀態時則是

表示目前除錯者從 TDI 所輸入的是除錯的指令。

Select-DR-Scan

Capture-DR

Shift-DR

Exit1-DR

Pause-DR

Exit2-DR

Update-DR

Select-ER-Scan

Capture-IR

Shift-IR

Exit1-IR

Pause-IR

Exit2-IR

Update-IR

Run-Test/Idle

Test-Logic-Reset

1

1

1

1

1

1

1

1

1

1

1

1

1 1

1

0

0

0

0

0

0

0

0

11

00

0 0

00

0 0

圖 2-7 TAP Finite State Machine

由於 IEEE Std. 1149.1的架構相當的簡單,並且在設計上面不會對電

路造成太大的負擔,不管是面積上、速度上亦或是耗電上。因此目前大部

分的測試及除錯的機制都是採用 JTAG 作為測試及除錯資料的基礎傳輸

介面。

� 嵌入式電路擬真器嵌入式電路擬真器嵌入式電路擬真器嵌入式電路擬真器

在嵌入式電路擬真器中,我們可以把其中負責控制、偵測微處理器狀

態的電路稱之為嵌入式電路擬真除錯電路,這個電路主要包含了中斷偵測

16

單元(Breakpoint Detection Unit)、微處理器介面(Processor Interface)、識別

暫存器(ID Register)、測試資料輸出選擇器(TDO selector)以及一條特殊結

構的掃瞄串列。如圖 2-8 Embedded ICE component所示

圖 2-8 Embedded ICE component

� 微處理器界面微處理器界面微處理器界面微處理器界面

微處理器介面最主要是用來與微處理器溝通的橋樑。由於每一種微

處理器所定義用來除錯的訊號以及其時序皆有所不同,因此嵌入式電路

擬真器當遇到觸發事件時(如遇到中斷點)要通知微處理器時,我們必

須透過這樣的一個電路做訊號與時序轉換的動作。

以 ARM 的例子來說,當 Embedded ICE遇到中斷點的時候,

Embedded ICE會透過此介面發出一個中斷訊號通知微處理器遇到中斷

點事件,然後再等待微處理器處理完除錯的前置處理之後回應的訊號,

表示微處理器已經可以進入除錯的狀態了。最後,此介面會將狀態調整

至除錯狀態,並且通知 Embedded ICE更新狀態暫存器,讓使用者能夠

透過狀態暫存器知道微處理器已經準備好進行除錯了。

� 中斷偵測單元中斷偵測單元中斷偵測單元中斷偵測單元

中斷偵測單元是嵌入式電路擬真器最為重要的一個部分,負責偵測

17

偉處理器的執行狀態是否與除錯者所設定的中斷條件相符合。若是偵測

到相符合的資訊,則此中斷偵測單元就會發出中斷訊號給微處理器,通

知微處理器將控制權交給嵌入式電路擬真器。圖 2-9Breakpoint Detection

Unit architecture是一個中斷偵測單元的基本架構圖,在圖中最左邊的區

塊是一個掃瞄串列。除錯者透過 TDI 將測試的資訊送入這個測試串中,

等到 TAP 有限狀態機進到 Update-DR的狀態時,除錯者的除錯資訊將

會被送進中斷偵測單元。在此掃瞄串的低位元部分存放的是要送入的暫

存器位址,而高位元部分存放的是要送入暫存器的除錯資訊。圖中的右

下方大的區塊是一個暫存器的集合,主要是存放除錯者要對微處理器進

行除錯的資訊。當微處理器在執行的時候,中斷偵測單元會去監視處理

器的位址匯流排以及資料匯流排並且將這些資訊與內部的暫存器所儲

存的資訊作比對。一旦比對到與除錯者除錯資訊相符合的資料,中斷偵

測單元就會發出中斷訊號。此時,微處理器會進入到除錯模式,由除錯

者經由嵌入式電路擬真器控制微處理器的運作。

Breakpoint Detection Unit

Configuration data

R/WB

reakpoin

t register IDB

reakpoint reg

ister info

rmation

TD

O

Breakpoint ID Decoder

Va

lue 1

Mask 1 ...

Microprocessor core

address

data

control

Breakpoint matched

Update

TD

I

Brea

kpoint co

nfiguration

registe

r

To M/I interface

Comparator

圖 2-9Breakpoint Detection Unit architecture

2.3 用於控制電路擬真器之除錯器用於控制電路擬真器之除錯器用於控制電路擬真器之除錯器用於控制電路擬真器之除錯器

上述已對傳統除錯的硬體架構有大概了解,在此節中,我們將介紹一般除錯

18

工具軟體,另外我們還會分析目前常見除錯工具軟體所提供的一些除錯功能並且

在最後蒐集目前市面上的一些個人電腦端的除錯軟體,對其做一些簡單的介紹。

2.3.1 Open On-Chip Debugger [2]

OpenOCD是一個 open source software,它是用 emulator來做 debug tool

chain的軟體端,相當於 ARM 公司出品的 RVDS [18] (RealView Development

Suite)或者或者另外一套商業化除錯軟體 HJTAG[3],但是都不是 OpenSource,

OpenOCD可以接受來自 GDB經由 RSP (Remote Serial Protocol)方式連接與使用

telnet方式來連接。

OpenOCD本身也支援相當多的 protocol converter,例如 FTDI 公司出產的

ft2232D與 ft2232H,和別家公司的 USBprog 、USB – Prest、Versaloon-Link、

ARM-JTAG-EW、Buspirate等等…。

OpenOCD本身的特色是可以藉由撰寫 configuration file來 retarget到不同的

processor如圖 2-1所示,而不用因為要支援別的 processor而重新編譯

OpenOCD,OpenOCD本身支援的 processor種類有 ARM 720t、ARM 7tdmi、

ARM 920t、ARM 926ejs、ARM 9tdmi、ARM 11、Cortex等等…。

圖 2-10 OpenOCD retarget idea

OpenOCD模組如圖 2-11 所示,可以分為六個模組,分別是 Daemon、

OpenOCD GDB server、OpenOCD CLI server、Target、Flash和 JTAG。

19

圖 2-11 OpenOCD modules

� 各模組說明如下:

A. Daemon:由於 OpenOCD對外與 GDB或者 telnet 溝通的管道皆

是藉由 TCP/IP網路協定方式來溝通,所以在 OpenOCD六個模組中必

定會有一個模組負責監聽網路的傳輸,把屬於 OpenOCD的封包抓進來

OpenOCD處理,而這個模組就是 Daemon 模組,其意義就是常駐於

PC作業系統中監聽屬於 OpenOCD的網路封包,OpenOCD通常開啟

telnet TCP/IP port是 4444,GDB TCP/IP port是 3333,TCP/IP port的選

擇可以透過修改 OpenOCD configure file來達成。

B. OpenOCD GDB server:當使用者藉由 GDB 方式來操控 OpenOCD

時,GDB與 OpenOCD溝通方式是採用 RSP協定來溝通,所以在

OpenOCD裡面一定要有一個模組來解譯從 GDB來的 RSP命令以及組

織 RSP回傳的命令給 GDB;所以 Daemon模組傳來的封包資料組合成

一個完整的命令之後,判斷是屬於 RSP協定,就會將該 RSP命令傳給

OpenOCD GDB server來做解析。

C. OpenOCD CLI server:同理當使用者使用 telnet方式來操控

OpenOCD時,也需要一個模組來解譯 telnet協定,所以當 Daemon模

組傳來的封包資料組合成一個完整的命令之後,判斷是屬於 telnet協

20

定,就會將該 telnet命令傳給 OpenOCD CLI server來做解析。

D. Target:此模組可以說是 OpenOCD裡面最重要的模組,因為針對

對不同的 processor會有不同的 JTAG訊號的設定與取方式,其因是

ICE scan-chain組態不一樣,例如 IR 的長度與 command會不一樣或者

DR 長度也會不一樣,以至於如何針對連接不同 processor,還可以提供

正確的組態來存取,是一個重要的課題,所以 Target模組提供不同且

豐富 processor組態來支援不同的 processor,OpenOCD會依照

OpenOCD configure file內容來決定使用哪個 processor組態,其組態內

容可以細分為兩大類:

1. Target Handle function:處理針對從 GDB來的不同 debug

event對應到相對應的處理函式,主要針對不同的 processor提供

不一樣的 JTAG存取次序。

2. Target HW information:針對不同 processor提供不一樣的

scan-chain組態,例如提供某 processor IR長度與命令或 DR 的長

度等…。

E. JTAG:當組態都設定好之後,真正需要與外部 processor溝通之

時就需要 JTAG模組,主要掌管如何使用 protocolconverter的 API 來達

到跟外部 processor溝通的目的。

2.3.2 GDB [6]

GDB是 GNU 計畫所發展的一套標準的除錯器[6],它支援了多種程式

語言的除錯功能,諸如 C, C++, Fortran, Java等 GDB都在能支援除錯的功

能。在支援的程式語言中,其中支援最完整的就是 C 與 C++,至於其他語

言的支援目前來說也正在持續在改進中。我們可以這麼說,只要是 GCC [5]

編譯器所支援的程式語言,其除錯的部分或多或少都可以使用GDB來完成。

GDB與一般常見的編譯器以及除錯器的運作方式一樣,當我們要使用

GDB 來進行程式除錯之前,我們必須下特別的參數給編譯器,對於 GCC

編譯器而言,此參數便是「-g」。此時,編譯器在編譯程式時會加入一些除

錯的資訊,如此編譯完成的程式在 GDB 下除錯時,GDB 才能從中解析出

每個程式位址所代表的變數名稱,以及它們在程式的原始碼中的位置,以方

便我們的除錯工作。

由此可見,一個支援原始碼層次的除錯工作並不是只需要除錯器的配

21

合的,事實上要完成這樣的除錯工作還必須編譯器與除錯器互相配合才行。

如果編譯器的編譯結果內含了不適當的除錯資訊,則除錯器仍然無法對該

程式進行除錯的工作。這也是為什麼 GDB對於其他語言如 Fortran 等的支

援仍不足的原因,除了 GDB本身要改進,編譯器那邊也需要配合改進才行。

除此之外,編譯器在編譯程式時,其產生目的碼的方式也直接影響了程式能

否在除錯器中除錯,例如對於 Chill 與 Modula-2 而言,GDB 目前只能接

受來自 GCC 家族編譯器所編出來的程式碼,至於其他的編譯器則還沒有

辦法。

2.4 SC-RTL 協同模擬平台協同模擬平台協同模擬平台協同模擬平台

Platform Architect由 synopsis公司發行,主要目的用來分析與模擬硬體架構

效率,是以 systemc方式模擬,內部提供許多元件給使用者架構硬體環境,例如

小至時脈產生器、reset產生器、反向器,大至 AHB BUS、ARM7、ARM9 等大

型元件。

此平台除了純粹以 systemc方式模擬外,亦可加入 RTL code與 systemc協同

模擬,此功能在本論文相當重要,主要用來虛擬化 CPU+EICE端。

圖 2-12 Platform Architect

22

Chapter 3 SYS32TM-OpenOCD 協同驗證平台協同驗證平台協同驗證平台協同驗證平台

此章介紹有關協同驗證平台的動機、研究方法、架構和原理,即為什麼需要

協同驗證平台、如何實做出來、協同驗證平台的架構與原理最後,會詳細介紹如

何使用協同驗證平台。

3.1 協同驗證平台開發動機協同驗證平台開發動機協同驗證平台開發動機協同驗證平台開發動機

EICE

CPUJTAGJTAG

pattern we thought

1.RTL simulation for EICE verification

EICE

CPUJTAGdebugger

2.In FPGA,we control EICE by debugger

Spend RTL Synthetize time

By readdebuggermessage

3.Try to find bug

OK not OK

4.Add monitor to RTL design

Msg is not

enough

EICE

CPU

monitor

1.Spend RTL Re- synthetize Time2.witch signal real want3.break original Design4.monitor length is limited

Maybe find root problem

圖 3-1 Traditional find bugs between debugger and EICE

由於實驗是有自主開發的 CPU,當研發到雛型階段需要 debugger與 EICE輔

助開發週邊,但是 debugger與 EICE本身開發驗證也是個問題,傳統上 debugger

與 EICE本身開發驗證分 4個步驟:

� 1.會先在 RTL 模擬階段模擬預想的 JTAG pattern,直到模擬結果正

確之後。

� 2.花費一段合成時間後,EICE與 CPU燒入到 FPGA內與 debugger

相接,以控制 EICE模組,但是通常時候都會發生無法控制的型況。

� 3.為了解決,由於 FPGA內部訊號無法觀察,首先會去查看 debugger

message去猜想 bug在何處。

� 4.有時候只有 debugger message是不夠的,會希望能看到 FPGA內

部訊號,所以只好插入 monitor模組,但是插入模組有以下缺點:

� 花費重新合成時間。

� 只能猜想可能發生問題的訊號,但這訊號不一定是造成問題所

在。

� 加入 monitor模組會破壞原先硬體設計,造成新問題。

23

� monitor追蹤長度有限。

執行完 4 這動作,得到可能造成問題的 pattern,在回到 1 把新 parrten模擬

後,重複執行 1~4,這顯得非常的花費時間。

EICE

CPUJTAGdebugger

1.RTL simulation for EICE verification

圖 3-2 ideal of this thesis

所以本論文的主要想法是在 RTL 模擬階段就可以連接 debugger,一同執行

模擬使之得到以下好處:

� 節省合成時間。

� 不會破壞原本設計去加入 monitor。

� 不用擔心 monitor追蹤長度。

� 不用思考要抓取哪些訊號給 monitor。

預計省到多少時間,可以依照下列分析:

Time Traditional verification Proposed

verification

Synthesize time 30 mins

(CPU+EICE+BUS+mem)

none

Time of Monitor adding 1 hr. none

Simulation time < 2 mins 20 mins

Iteration for finding root bug 2~5 times 1 times

Total cost 3~7.5 hr. 20 mins

表 3-1 time spending compared between traditional and proposed verification

上表主要第一項是合成時間,傳統方法指的是需要將欲驗證的硬體合成並

燒入 FPGA進行驗證,而提出的方法是 debugger可以直接與 RTL simulator相

接,所以傳統方法需要合成時間,大約合成一次需要 30分鐘的時間,而本論文

提出的方法不需要成時間,第二項是加入 monitor發費的時間,由於傳統方法

要抓取 FPGA內部訊號,必須在待驗證的硬體內部加入 monitor,所以需要去思

考要觀測哪些訊號,決定之後還要去更改硬體內部設計加入 monitor,這過程大

約要花費 1小時,而本論文提出的方法是使用 RTL simulator所以不用擔心要抓

取哪些訊號,直接將所有訊號擷取出來成波形檔就可以了,所以這部份的時間

花費不需要,第三項是模擬時間,由於傳統方法是使用 FPGA來模擬,所以每

次模擬只花費小於 2分鐘的時間,而提出的方法由於是使用 RTL simulator模

擬,所以每次模擬花費時間大約是 20分鐘左右,第四項是如果要找到 root bug

24

的話,需要第一項到第三項重複執行幾次,傳統方法無法第一次決定哪些訊號

加入 monitor就可以找到 root bug,通常需要 2~5次的重複來決定哪些訊號要

加入才能找到 root bug,而本論文提出的辦法由於是使用 RTL simulator,所以

只需要一次就可以擷取所有訊號,所以不需要重複只需要執行一次。

傳統的方法合成時間最快也要 30分鐘,還僅僅只是最簡單的環境,然後出

了問題還要安插 monitor,安插 monitor包含思考要觀測哪些訊號與安插動作最

起碼也需要 1小時,通常這程序找到一個 bug通常需要執行 2~5次,所以花費

時間大概需要 3~7.5小時;至於本論文所提到的方法優點是不用合成時間與安

插 monitor發費時間,但所需要的模擬時間比傳統驗證方法還長,大約是 20分

鐘,但是也就只花費 20分就可得到原本在 FPGA看不到的訊號,所以解決一個

bug發費時間大概也就 20分鐘左右比傳統驗証方法快上 9~22.5倍。

FPGA執行 RTL simulation移動到使用 RTL simulator執行 RTL simulation,

最主要的的差別是無法觀測到實際硬體訊號的 timing delay,但是本論文主要領

域是專注於前端設計邏輯錯誤的除錯上,而不是後端 timing delay除錯,希望在

前端就可以將所有邏輯錯誤解決。debugger與 EICE無法正常運作絕大多數是

因為設計邏輯上的錯誤,傳統的驗證方法是把前端的邏輯錯誤放置到後端,會

變得難以解決,debugger直接可以連接 RTL simulator是解決大部分問題最好的

時間點。

至於 monitor有多少有訊號可以量測,又可以追蹤多長,做了 monitor (以

chip scope為例) 與本篇論文採用的 RTL simulator (NC-verilog) 追蹤訊號量與長

度分析:(以 chip scope可挑選的最大值為例)

Compared item Chip scope NC-verilog

Signal number 4,096 bits A mount of entire chip signal number

Trace length 131,072 cycles As long as simulation time

表 3-2 signal number and trace length comparing

上表第一項所比較的是追蹤的訊號量,Chip scope最大值只能追蹤 4,096

bits,而 NC-verilog由於是 RTL simulator所以可以追蹤的量就是硬體內所有訊

號,第二項比較的是追蹤長度,Chip scope追蹤長度最大值是 131,072 cycles,

而 NC-verilog追蹤長度是從模擬一開始到結束,

可以看到,原本採用的傳統方法不管是訊號個數或者追蹤長度都是受限

的,而且基於 FPAG的容量有限情況下,也不一定能達到這麼多的訊號個數與

追蹤長度,而本論文所採用的 RTL simulator就沒有此限制。

25

3.2 協同驗證平協同驗證平協同驗證平協同驗證平台研究方法台研究方法台研究方法台研究方法

A.Debuger

B.USB/JTAG protocol

converter

C.RTL

(download in FPGA)USB JTAG

hardwaresoftware

圖 3-3 traditional program debug method

現行的 debug tool chain可以分作 software與 hardware兩側,如圖 3-3,A.

Debugger例如 ARM RVDS 或 GDB+OpenOCD提供 GUI 或 command方式給使

用者使用,hardware端可以分作 B.連接 debugger與 RTL 的 USB/JTAG protocol

converter,例如 ft2232,也就是 adapter,其目的是協助 debugger與 RTL(硬體)

溝通,與 C.目標硬體,必需要有 EICE幫助以解析 JTAG訊號的硬體,例如 ARM

7或者實驗自主開發之 SYS32TM,以上均有 EICE幫助的處理器。

以上的 debug tool chain必須確定 debugger與 EICE是可以正常工作,在研

發 debugger與 EICE 之中必須重複的花費合成時間燒入進 FPGA再與 debugger

相接,非常的花費時間且不容易找出問題所在,所以本論文提出 EICE與 CPU在

RTL simulation階段就可以與 debugger相連接,以減少合成時間,在這樣需求下

也有尋找一篇相關論文 Virtual Development Environment [22],可惜的是他全是採

用商業軟體建構而成,無法觀察 debugger與 EICE互動,不符合需求。

A.Debugger

(OpenOCD)

B.USB/JTAG protocol

converter

C.RTL

(RTL simulator)USB JTAG

hardwaresoftware

圖 3-4 propose co-verification platform

如圖 3-4,在 debug tool chain方面 A. software我們採用 Open source 的

OpenOCD,原因是 OpenOCD可以修改,不採用 HJTAG[3]與 RVDS[18]的原因它

們是商用 debugger,無法針對需求修改,OpenOCD方便以後可以配合不同的 RTL

目標或是使用不同的 USB/JTAG protocol converter控制 RTL,hardware裡面的

C.RTL變成在 RTL simulator上執行就可以,不用合成之後燒錄進 FPGA,達成節

省合成時間,與可以知道 Debugger(OpenOCD)與 RTL 互動情況;在一般情況

下是由 Debugger將 EICE control event(IRScan、DRscan和 RUNTEST)以 pattern

的方式傳給 RTL 執行模擬,所以接下來的問題就是:OpenOCD與 RTL simulator

要如何溝通。

在emulation時OpenOCD是透過實體的USB/JTAG protocol converter (ft2232)

26

與已載入到 FPGA的硬體溝通,所以 OpenOCD要與 RTL simulator溝通的關鍵

在於 2.USB/JTAG protocol converter,我們尋找了兩個可能解法分別如下,希望可

以將 EICE control event傳遞給 RTL simulator:

� PLI (Program Level Interface)

PLI 原先設計目的在於提供比 RTL 較高層次來撰寫 pattern的方法

(C code來撰寫 pattern)撰寫 pattern, PLI pattern撰寫完成後是

一併和待測 RTL 在 RTL simulator 上模擬,所以我們認為 PLI 合適

當為 OpenOCD與 RTL 的溝通橋樑。

1Debug software

(OpenOCD)

2USB/JTAG protocol

converter(PLI)

3RTLJTAG

Hardware (RTL simulator)software

P

P

C

C

圖 3-5 propose framework with PLI and RTL simulator

如上圖,是 protocol converter是採用 PLI 的方式,所以必須撰寫

PLI 程式碼使之可以接收從 OpenOCD來的 EICE control event並將

該 event轉換成 JTAG序列,以及收集從 RTL 來的 JTAG序列將之

轉換成以 16進位的資料型態回傳給 OpenOCD。接收 EICE control

event以及回傳 16進位的資料型態給 OpenOCD的實做方法我們採

用 IPC的 shared memory方式,P表示 producer表示將 EICE control

event或回傳的 16進位的資料傳送給 PLI converter或 OpenOCD;

C 表示 consumer表示從 OpenOCD或 PLI converter接收 EICE

control event或回傳的 16進位資料。

當 PLI 收到 EICE control event後,必須將之轉換成 JTAG序列執

行 RTL 模擬,之後接收 RTL 上 JTAG的回應,轉換成 16進位的資

料回傳給 OpenOCD,所以若採用 PLI 方式當 converter必須完成下

列幾件事:

� 以 PLI 方式實做出 producer與 comsumer功能模組

� 將 EICE control event轉換成 JTAG序列

� 將從 RTL 回來的 JTAG序列轉成 16進位的資料型態表示

� 知道 PLI 如何控制 RTL simulation停止與運作

� embecosm JTAGSC

此 embecosm JTAGSC是參考 embecosm EAN5 [4]而來的,提供

Reset、IRScan和 DRScan API給使用者使用,由 SystemC程式碼

撰寫,由於是由 SystemC組成所以必須在 SC-RTL co-simulation平

台上才能與 RTL 模擬,如下圖所示:

27

1Debugger

(OpenOCD)

2USB/JTAG protocol

converter( JTAGSC)

3RTL

(RTL simulator)JTAG

SC-RTL co-simulation platformsoftware

P

P

C

C

圖 3-6 propose framework with JTAGSC and co-simulation platform

由於 SC-RTL co-simulation平台執行 systemc與 RTL co-simulation,

所以與 RTL simulator溝通的是 JTAGSC,而 OpenOCD溝通的才是

JTAGSC,與 PLI 圖不同的是 OpenOCD溝通的對象是 JTAGSC而

不是 RTL simulator。為了達到 OpenOCD與 JTAGSC溝通,JTAGSC

採用透過 IPC 的 shared memory方式將 OpenOCD的 EICE control

event接收,並呼叫 API 轉成 JTAG序列透過 SC-RTL co-simulation

平台執行 RTL 模擬,之後收集從 RTL 來的訊號(即 TDO 訊號)

轉成 16進位的資料,回傳給 OpenOCD,所以若採用 JTAGSC只需

要達成幾件事:

� 以 SystemC方式實做出 producer與 comsumer功能模組

� 參照現有 API 把缺少的 JTAG功能(RUNTEST)實做出來

綜合以上所述,較若採用 embecosm JTAGSC會比較方便,因為本身已內建

產生 JTAG序列的方法,只要呼叫 Reset、IRScan和 DRScan API就可以將 Reset、

IRScan和 DRScan的資料轉成 JTAG 序列形式執行 RTL 模擬,而 co-simulation

platform又已經解決控制 RTL simulation的停止與運作問題,剩下要做的是只要

將缺少的 JTAG 功能加進 JTAGSC 當成 API 給使用者使用,以及實做 shared

memory的方式與 OpenOCD溝通,所以在此我們選擇 embecosm JTAGSC當成

OpenOCD與 RTL simulator溝通的橋樑。

3.3 OpenOCD與與與與 JTAGSC 如何連接如何連接如何連接如何連接

由於現在 USB/JTAG protocol converter轉換的對象已經不是 USB而是 EICE

control event,所以後續將稱為 EICE_control_event /JTAG protocol converter或者

直接稱呼為 JTAGSC,主要目的是當作 OpenOCD與 RTL simulator溝通界面。

在此章節會介紹若要將OpenOCD連接上JTAGSC透過SC-RTL co-simulation

平台幫助執行 co-verification 的話要如何修改,以下章節分別為基於 shared

memory的溝通方法設計、JTAGSC修改、OpenOCD修改;基於 shared memory

的溝通方法設計:說明 OpenOCD與 JTAGSC溝通需要怎樣的資料以及機制,

JTAGSC修改:說明要修改些什麼才能接收從 OpenOCD來的 EICE control event,

並且將 TDO來的值回傳給 OpenOCD,OpenOCD修改:說明應該修改些什麼才

28

能使 OpenOCD傳送 EICE control event給 JTAGSC並接收 JTAGSC回傳的的 16

進位資料。

3.3.1 基於共享記憶體技術的溝通機制基於共享記憶體技術的溝通機制基於共享記憶體技術的溝通機制基於共享記憶體技術的溝通機制

這一小章說明 OpenOCD與 JTSGSC如何溝通,基本上所採取的方法是基於

shared memory技術,其運作如下圖所示:

OpenOCD shm JTAGSC shm

RTL(RTL simulator)

SC-RTL co-simulation platformSoftware

P1

P2

C1

C2

1. turn 8 bit array into

EICE control event

3.turn debug event into JTAG

sequence

4.collect TDO signal to hex

data

5.pass the hex data by shm

producer

2.recive EICE control event by shm consumer

2.wait for Reply form consumer

6.hex data turn into 8 bit array

passed to OpenOCD

圖 3-7 shared memory communication working flow

圖 3-7可以分作兩邊,software部份主要就是 OpenOCD shm,表示 OpenOCD

採用以 shared memory為基礎的溝通機制,SC-RTL co-simulation平台部份就是

JTAGSC shm也就是 JTAGSC shm也採用以 shared memory為基礎的溝通機制;

SC-RTL co-simulation平台這邊則是 JTAGSC(EICE_control_event /JTAG protocol

converter)以及 RTL,主要執行 JTAGSC與 RTL co-simulation, RTL simulation

執行的 pattern是藉由 JTAGSC以 shared memory的方式從 OpenOCD得來的,達

成將 OpenOCD與 RTL 執行協同驗證目的。主要可以分作六個步驟與兩種不同

的 shared memory的資料,下列會依照這六個步驟逐一說明,並且敘述不同的

shared memory的資料,分別是 EICE control event以及 16進位資料(hex data)。

第一步驟:在 OpenOCD端,先把欲要與 RTL 執行協同驗證的 EICE control

event由 8bit array轉成 16進位的 array,並且將一些資訊,如:是否是 IR Scan、

欲要 Scan的位元數、是怎樣的 JTAG指令等等…,集合在一個 shared memory的

結構體裡面,稱之為 EICE control event的結構體,並藉由 shared memory機制中

producer 傳給 EICE_control_event/JTAG protocol converter,也就是上圖的 P1與

29

C1,P表示 producer,C 表示 consumer,1表示共享 index 同為某值(假設為 t)

的記憶體空間,該記憶體空間放置的就是 EICE control event。

第二步驟:OpenOCD等在資料從 C2回來, JTAGSC藉由 shared memory機

制中 consumer將 EICE control event從 index為 t 的 shared memory讀進來,也就

是 C1。

第三步驟:使用 JTAGSC提供的 API 將 EICE control event轉換成 JTAG序

列執行 RTL 模擬,並且一併將 RTL TDO的值收集起來,並轉換成 16進位的資

料表示,也就是步驟四。。

第五步驟:將轉換完成的 16進位資料以 shared memory機制中 producer傳

給 OpenOCD,也就是 P2,P表示 producer,C 表示 consumer,2表示共享 index

為同為某值(假設為 u)的記憶體空間,該記憶體空間放置的就是 TDO轉換的 16

進位的資料。

第六步驟:當 OpenOCD透過 C2得知已有資料從 JTAGSC回來後,就會執

行此步驟,也就是將 16進位表示的資料轉換成 8bit array給 OpenOCD使用。

接下來講述 EICE control event的組成以及 TDO 經由轉換後以 16進位表示

的資料組成:

圖 3-8 EICE control event context

上圖是 EICE control event的組成,共有五筆資料分別是:

� write_by_you:控制 P1與 C1互斥機制的訊號。

� is_ir:此 debug enent是否是 IR Scan或 DR Scan;為 1表示是 IR Scan、

為 0表示是 DR Scan、為 3表示是 RUNTEST。

� num_bit:紀錄此 EICE control event需要 Scan多少位元。

� scan_type:紀錄此 EICE control event是否需要藉由 JTAGSC回傳從 RTL

回來的 TDO值。

� s_out_data:紀錄此 EICE control event要藉由 JTAGSC 進 RTL TDI 的

值。

30

圖 3-9 feed back data from hardware

上圖是 TDO經由轉換後以 16進位表示的資料組成,以結構體表示,也就是

P2與 C2共享的資料,裡面共有兩筆資料說明如下:

� write_by_you:控制 P2與 C2互斥機制的訊號。

� fb_data:存放著從 RTL 回應的 TDO 值,已經將之整理成 16進位資料

的形式,存放在 fb_data裡面,藉由 JTAGSC以 producer方法回傳給

OpenOCD。

3.3.2 補足補足補足補足 JTAGSC 不足之處的不足之處的不足之處的不足之處的修改修改修改修改

在附錄已經很明確的講解有關於 JTAGSC的檔案結構、運作架構、API 使用

與 API 運作原理;內建的 API 就只有 IR、DR、以及 Reset,若是要支援 OpenOCD

的連接是不夠的,在加上 OpenOCD本身會去控制 TAP FSM state移動到

RunTest/Idle狀態,所以依照目前 JTAGSC運作架構是不敷使用的,也必須做一

些更改,所以此章節會分成三大部份—API 新增、JTAGSC缺點和如何使用 shared

memory方式與 OpenOCD連接。。

� API 新增—RUNTEST

RUNTEST功能主要是先將 TAP FSM state移動到 Run-Test/Idle狀態,TMS

為 0 停留在 Run-Test/Idle數個 cycle,cycle數由 OpenOCD決定,其目的在於讓

CPU多走數個 cycle,執行由 boundary scan chain給 CPU的指令,因為只需要將

TAP FSM state移動到 Run-Test/Idle,在該 state停留數個 cycle,所以 runtest API

主要設定為兩個狀態,—移動到 Run-Test/Idle以及停留在 Run-Test/Idle數個 cycle。

RUNTEST API 運作狀態圖:

31

圖 3-10 RUNTEST API working flow

� JTAGSC缺點:描述 JTAGSC缺點,主要有分架構缺點以及運作架構的

缺點。會先說明架構缺點以及如何修改,之後會說明運作架構的缺點以

及如何修改。

� JTAGSC架構缺點:

JTAGSC在 SC-RTL co-simulation平台上的架構圖以及更新後的架

構圖:

SYS32TM+EICE(RTL)

EICE_control_event/JTAG signal

converter(JTAGSC)(systemC)

Platform Architect(before modify)

Clk_gen

TCKTCK

TMSTDITDOTRST

SYS32TM+EICE(RTL)

EICE_control_event/JTAG signal

converter(JTAGSC)(systemC)

Platform Architect(after modify)

Clk_gen

TCK

TCKTMSTDITDOTRST

圖 3-11 the architecture of Co-verification platform

上圖是 SC-RTL co-simulation平台上建造的架構簡易圖,主要有三

個區塊 JTAGSC、SYS32TM和 clk_gen;SYS32TM是我們實驗室開發

的 ARM7-like CPU,由於有 EICE 幫助可以接收 IEEE1149.1所定義的

TCK、TMS、TDI、TDO、TRST等五根腳位,進而達成控制 CPU的目

的,clk_gen是 clock產生器,是內建在 SC-RTL co-simulation平台裡面

的 library之一主要產生 clock的脈波。

上圖左邊的部份是一開始原先 JTAGSC 的架構,JTAGSC 主要將

clk_gen來的 clock 當成參考用的 TCK,只要在相對應的時間上傳送對

應的 TDI 與 TMS 的值,並且接收 TDO 就可以了,但是缺點是這樣一

來 JTAGSC無法藉由 TCK 控制 EICE的運作,EICE屬於一直在運作的

狀態,如果 JTAGSC暫時沒有 EICE control event需要轉換時會處於等

待狀態,所以輸出的 JTAG訊號是無意義的,但 EICE還繼續運作這樣

就會出錯,所以希望將架構更改成 EICE的 TCK 是由 JTAGSC來控制,

而 clk_gen就相當於 JTAGSC的振盪器,驅動 JTAGSC運作,將每筆的

EICE control event轉成 JTAG序列執行 RTL 模擬,如上圖右邊。

� JTAGSC運作缺點:

由圖 B-8可以看到,JTAGSC的運作是先執行 API決定 TMS與 TDI

後才去設定 current TapAction,接下來就將 TMS 與 TDI 執行一個

週期的 RTL 模擬,最後再判斷該 EICE control event是否結束,所

以這樣就會造成一個錯誤—當舊的 EICE control event結束停留在

32

JTAG的 Update state1後,新的 EICE control event開始執行應該由

Update state開始,但是實際狀況卻是由Update state的下一個Select-

DR-Scan開始。

Execute API process() function

Read next pattern from

FIFO

YES

Current event is finish?

NOFor getting TMS

and TDO of current TCK cycle

Set currentTapAction=

null

API return true

API return false

By ref.

currentTapAction(null:event is finish)

Update stateMachine and

active JTAG signal to RTL

圖 3-12 the arch. working flow after modification

為了解決上述問題,所以將 JTAGSC的運作修改成上述運作流程,

當 API return為 true時,就直接跳回判斷 EICE control event是否結

束,就可以使當 EICE control event結束後使 TAP FSM正確的停留

在 Update state。

� JTAGSC如何使用 shared memory方式與 OpenOCD連接:

在這部份,為了使 JTAGSC可以接收 OpenOCD的 EICE control event,

以及將 RTL TDO 值回傳給 OpenOCD,必須將上面所說的 JTAGSC shm機

制加入;當 JTAGSC 開始運做的時候給給 RTL 的 pattern 是被放置在

JtagSC::driver()裡面,所以在該函式內運行 shm_consume,其目的是要讀取

從 OpenOCD來的 EICE control event,就是圖 3-13第 7行 shm_consume。

1 以 DR Scan來說,就是停留在 Update-DR;IR Scan來說,就是停留在 Update-IR

33

Algorithm communication_with_OpenOCD #handle_EICE_control_eventinput:EICE_control_eventoutput:fb_databegin #get the EICE_control_event through shared memory, #i.e. scan_out_data[],total bit,scan->ir_scan,need_fb_fdata(scan) info call shm_consumer(FLAG1,scan_out_data[],talbit,ir_scan,need_fb_fdata); if ir_scan is 1 do call IR_SCAN_API(scan_out_data[],talbit); else if ir_scan is 0 do call DR_SCAN_API(scan_out_data[],talbit); else if ir_scan is 3 do call RUNTEST_API(talbit); endif

if need_fb_fdata is true do call get_data_from_scan_chain(scan_fb_data[]); #return TDO feed data to OpenOCD through shared memory call shm_producer(FLAG2,scan_fb_data[]); endifend

12345678910111213141516171819202122

圖 3-13 the algorithm of JTAGSC communication with OpenOCD by shared memory

上圖第#5~7行對應到圖 3-7 JTAGSC shm步驟 2,藉由 shared memory方式

從 OpenOCD讀取 EICE control event,第#9~15對應到圖 3-7 JTAGSC shm步驟 3

和 4,負責執行從 OpenOCD來的 EICE control event,並收集 TDO值,第#17~20

對應到圖 3-7 JTAGSC shm步驟 5,負責將 TDO值返回送給 OpenOCD以 shared

memory方式。

由上圖可以看到,#7 行會去讀取記憶體位址特徵為值 t 的位址,紀錄在

FLAG1變數內,該位址內容就是存放 EICE control event,也就是圖 3-4 P1與 C1

共享的位址。

在讀取之後,可以獲得想要 scan進硬體的 scan_out_data、總共 scan多少 bit

的 talbit、判斷是何種 scan的 ir_scan、和判斷是否需要將硬體 scan回來的資料回

傳給 OpenOCD的 need_fb_fdata。

在之後就會依照 ir_scan的值來執行不同的 API,最後再由 need_fb_fdata判

斷是否需要將硬體 scan出來的值回傳給 OpenOCD,若需要回傳其機制也是使用

shared memory的方式將 16進位資料回傳給 OpenOCD,透過寫入特徵值為 u 的

位址,紀錄在 FLAG2 變數內,將資料回傳給 OpenOCD,就是圖 3-7 P2與 C2共

享同一個記憶體位址。

3.3.3 OpenOCD新增新增新增新增 JTAGSC 驅動程式驅動程式驅動程式驅動程式與與與與初始化流程修改初始化流程修改初始化流程修改初始化流程修改

此章節會講到如何修改 OpenOCD使之可以使用 shared memory機制與

JTAGSC溝通以達到 co-verification的功能。

34

在進入修改之前,會先說明 OpenOCD如何使用,詳細範例請參考圖 4-4:

� 用上面的命令來開啟 OpenOCD,開啟 OpenOCD必須給予 cfg

file,cfg file 是用來設定 OpenOCD,主要設定三項:

� A.開啟 OpenOCD RSP的 TCP/IP port提供 GDB連接。

� B.通知 OpenOCD目前使用的 interface也就是 USB/JTAG

converter型號並初始化 converter。

� 使用 interface指定使用的 converter。

� interface ft2232 指定 ft2232為 converter幫助 OpenOCD

與 FPGA溝通。

� interface JTAGSC 指定 JTAGSC為 converter幫助

OpenOCD與 RTL simulator溝通。

� C.通知 OpenOCD目前要連接的 CPU型號(SYS32TM)。

� OpenOCD初始階段會透過 check TAP id code確定設定的

CPU+EICE+型號與目前連接的 CPU+EICE是否一致。

圖 3-14 OpenOCD initial flow and working flow

上圖左方是 OpenOCD初始化流程,以及初始化完成之後 OpenOCD控制流

展示在上圖右方,詳細部份請參照 Appendix A,在 OpenOCD初始化階段,Check

TAP id code會使用 DR scan輸入 50筆的 id code長度(也就是 50*32bit),確保

兩件事,第一:確定目前所連接的 CPU+EICE是否是是使用者設定的 CPU+EICE

型號,第二:確定 EICE DR scan chain是連通的。目前由於 EICE模組 id code是

採用暫存器形式而非 DR scan chain形式,所以先修改成只 DR scan輸入 1筆的

id code 長度來確定連接的 CPU+EICE,也就是說先將第二的功能關掉,使

OpenOCD可以成功完成初始化。

在 JTAG部份負責所有連接 CPU+EICE的 interface,所有的 interface驅動程

式均集合在這。OpenOCD透過 JTAGSC連接 CPU+EICE,所以 JTAGSC的驅動

也要撰寫在 JTAG模組裡,接下來描述的重點有 JTAGSC的驅動撰寫,與如何加

./openocd –f conf.cfg

35

入 JTAG模組使 OpenOCD可以使用 JTAGSC驅動。

JTAGSC驅動撰寫:

在開始 JTAGSC驅動撰寫之前,必須先了解在 OpenOCD裡面 JTAG cmd與

scan data如何定義,才好將 JTAG cmd或 scan data轉為 EICE control event存放

在 shared memory上以驅動 JTAGSC。

圖 3-15 scan data structure in OpenOCD

上圖是 OpenOCD對於 scan data的描寫,定義在 openocd/jtag/commands.h裡

面,結構體成員分別是:

� is_scan:辨別該 scan data是否是 IR 或 DR scan。

� num_fields:紀錄有多少個 fields在這 scan data裡面。

� fields:存放欲 scan進硬體的 data與從硬體 scan回來的 data,本身是陣

列所以要用 scan->fields[i]描述來存取(num_fields >i >= 0),每個 field

分別有三個結構成員 out_value、in_value和 num_bits:

� out_value: 是 陣 列 , 每 個 單 位 大 小 為 8bit , 以 scan-

>fields[i].out_value[j]方式來存取(( num_bits/8+1)>j>= 0),存放欲

scan進硬體的 data。

� in_value:是陣列,每個單位大小為 8bit,以 scan->fields[i].in_value[j]

方式來存取(( num_bits/8+1)>j>= 0),存放從硬體 scan回來的 data。

� num_bits:紀錄該 fields有多少 bit 的資料。

� end_state:紀錄該 scan data完成後 TAP FSM該停留在那一個 state。

接下來說明 OpenOCD對於 JTAG cmd的描寫:

圖 3-16 JTAG cmd structure in OpenOCD

36

上圖是 OpenOCD對於 JTAG cmd的描寫,定義在 openocd/jtag/commands.h

裡面,結構體成員分別是:

� cmd:指標,指向該 cmd內容的結構體,例如如果是 scan應用,則會指

向上述所說的 scan command(即上述所說的 scan data)結構體。

� type:說明現在的 JTAG cmd是 scan command(即上述所說的 scan data),

還是 runtest指令。

� next:指標,連接下一個 JTAG cmd。

當得知 OpenOCD對於 JTAG cmd與 scan data的描寫後,可以依照下面的演

算法將 JTAG cmd或 scan data轉成 EICE control event放置在 shared memory上,

驅動 JTAGSC接收。

Algorithm product_EICE_control_event (cmd, scan)input:struct jtag_command cmd, scan_command scanoutput:scan_command scanbegin #identify the cmd is scan or RUNTEST #if is scan, then get the total scan bit, IR or DR…info to EICE control event #else pass the cycle number and RUNTEST event as EICE control event to # JTAGSC by shared memory if cmd.type is scan do begin count_total_bit(talbit,scan); for i=0 to i<scan.num_fields step i++ do begin if scan->fields[i].out_value is not NULL do call 8bitary_to_64bitary(tmp[i][],scan->fields[i].out_value); else do call 8bitary_to_64bitary(tmp[i][],0x0); endif call 2d64bitary_to_1d64bitary(scan_out_data[],tmp[i][]); end #pass EICE control to JTAGSC by shared memory, #and get the TDO value form JTAGSC if needed shm_producer(FLAG1,scan_out_data[],talbit,scan->ir_scan,need_fb_data(scan)); if need_fb_data(scan) is true do call handel_fb_data(scan); endif end else if cmd.type is runtest do call shm_producer(FLAG1,bit_numberof(runtest),runtest_event); endifend

12345678910111213141516171819202122232425262728293031

圖 3-17 scan data to EICE control event algorithm

上圖#10~22對應到圖 3-7 OpenOCD shm步驟 1,主要目的是將 OpenOCD上

層來的 cmd轉換成 EICE control event並以 shared memory方式傳送給 JTAGSC,

#24~25對應到圖 3-7 OpenOCD shm步驟 2和 6,主要目的等待並讀取從 JTAGSC

返回的 TDO值,並將 TDO值傳送至 OpenOCD上層的 cmd。

37

該演算法首先先判斷該 cmd哪種命令,若是 scan data,則將 scan data總共

需要多少 scan bit計算出來,之後將 scan data要 scan到硬體的資料先轉換成二

維的 64bit 陣列,之後在將該二維 64bit 陣列轉換成一維的 64bit 陣列,也就是

scan_out_data[],之後在透過 shared memory中的producer 機制將 scan_out_data[]、

total_bit、是 IR 或 DR 的資訊與需不需要將硬體傳回來的資料傳回給 OpenOCD

等等這些資訊寫入 EICE control event並放入特徵值為 t 的記憶體位址裡面,t 存

放在變數 FLAG1裡。

若 need_fb_data(scan)為 true時候,表示需要 JTAGSC將從硬體 TDO回來的

16進位資料往 OpenOCD回傳,此時 OpenOCD必須要有機制將 16進位資料轉

換成 scan data的描寫,由於 16進位資料是以 64bits陣列形式存放,所以也就是

將 64bits陣列轉換成二維的 8bits陣列。

若 cmd是 runtest的話就將,這 runtest需要多少 bit 以及將該 cmd是 runtest

的資訊放入 debug_event裡面。

Algorithm handle_fb_data (scan)input:scan_command scanoutput:scan_command scanbegin call shm_consumer(FLAG2, fb_data[]); for i=0 to i<scan.num_fields step i++ do if scan->fields[i].out_value is not NULL do call 64bitary_to_8bitary(scan->fields[i].out_value, fb_data[]);end

123456789

圖 3-18 feed back data to scan data algorithm

以上演算法主要目的等待並讀取從 JTAGSC返回的 TDO 值,並將 TDO 值

傳送至 OpenOCD上層的 cmd。。

可以由上面演算法看出規則,首先先藉由 shared memory中 consumer機制

將特徵值為 u,存放在變數 FLAG2裡面,也就是存放 16進位資料的位址,將裡

面的資料讀進 OpenOCD內,之後在轉換成二維的 8bits陣列。

新增 JTAGSC驅動到 OpenOCD JTAG模組:

Return ERROK

Openocd/src/jtag/JTAGSC.c

Openocd/src/jtag/interfaces.c

圖 3-19 how to add interface driver

38

接下來我們已經有了如何驅動 JTAGSC 演算法,那麼接下來的問題是說如

何加入 OpenOCD成為眾多 interface driver之一:

� 開啟 openocd/src/jtag/interfaces.c將 JTAGSC_interface加入。

� JTAGSC_interface是一個 jtag_interface結構體,提供處理 OpenOCD

JTAG cmd的所有函式,定義在每個驅動程式碼裡面,以此例來講就是

在/openocd/src/jtag/JTAGSC.c裡面。

� JTAGSC_interface說明:

成員 指到的內容 說明

.name “JTAGSC” Interface 命令就是依

照 .name 內容尋找使

用的 driver。

.commands JTAGSC_command_handlers 指定 TCL 命令處理函

.init &JTAGSC_init converter組態設定,由

於 這 是 對 於 實 體

converter設定的內容,

JTAGSC不需要這些,

所 以 基 本 上 直 接

retrun ERROR_OK;

.quit &JTAGSC_quit

.speed &JTAGSC_speed

.speed_div &JTAGSC_speed_div

.khz &JTAGSC_khz

.execute_queue &JTAGSC_execute_queue JTAGSC 的驅動就是

實作在這函式裡面。

表 3-3OpenOCD JTAGSC driver

經由上述的修改後,OpenOCD已經可以使用 JTAGSC為 interface跟 RTL

simulator溝通,用新增的方式加入 JTAGSC driver的好處是:以後要使用不同

的 converter當 interface只要修改 conf.cfg內容 interface描述就可以切換不同

converter不用重新編譯 OpenOCD。

39

3.3.4 協同驗證平台協同驗證平台協同驗證平台協同驗證平台總觀總觀總觀總觀

Debugger(OpenOCD)

EICE_control_event/JTAG protocol

converter( JTAGSC)

EASY_ENV

SC-RTL co-simulation platformSoftware(host)

Product_EICE_control

_event P1

P2

C1

C2

SYS32TM

AHB

ICE

Memory

SYS_clkTCK_clk

TCK

Hanlde_fb_data

圖 3-20 the final framework of co-verification environment

最後的架構圖如上圖所示,左方是運行 degugger一端主要由 OpenOCD以

shared memory方式與 JTAGSC溝通,右方是 SC-RTL co-simulation platform,在

SC-RTL co-simulation平台環境下把實驗室開發的 EASY 環境放入,以達到

SystemC與 RTL co-simulation 功能,EASY 環境下有實驗室自己開發的 ARM7-

like CUP也就是 SYS32TM,SYS32TM外面由 EICE模組所包,EICE模組實現

使用者可以設下 break point、watch point、read/write memory…等等的 debug指

令,EASY環境也內含從 CIC 參考並修改的 AHB 與 memory模組。

另外在 SC-RTL co-simulation平台上也放入修改過的 JTAGSC,將轉換後的

TDI、TDO、TMS、TCK 等訊號接入 EICE模組,另外在 SC-RTL co-simulation平

台裡面使用兩個內建的 clock模組,分別當作系統時脈(SYS_clk)作為整個 EASY

環境的時脈,以及 TCK 時脈(TCK_clk)當作 ICE 模組的時脈,TCK 時脈是系

統時脈的五分之一。

在 JTAGSC則是分別使用 shared memory 機制中的 consumer與 producer 從

OpenOCD接收 EICE control event與傳送從硬體 RTL 回傳的 16進位資料。

在OpenOCD方面則是使用 product_EICE_control_event以 shared memory 機

制中的 producer將 scan data轉換成 EICE control event傳送給 JTAGSC,再藉由

handle_fb_data以 shared memory 機制中的 consumer,接收從 JTAGSC回來的 16

進位資料轉換為 scan data。

3.4 協同驗證平台如何重複利用協同驗證平台如何重複利用協同驗證平台如何重複利用協同驗證平台如何重複利用

上述已描述 OpenOCD與 JTAGSC連接原理與 SC-RTL co-simulation平台內

40

部大概的接線,這章會詳細描述 OpenOCD與 JTAGSC如何操作才能連接,以及

SC-RTL co-simulation平台內部詳細接線與元件描述。

3.4.1 SC-RTL 協同協同協同協同模擬平台內部用到的元件與接線說明模擬平台內部用到的元件與接線說明模擬平台內部用到的元件與接線說明模擬平台內部用到的元件與接線說明

上述部份對 SC-RTL co-simulation平台內部主要元件與接線已有大概的認識,

所以這章描述 SC-RTL co-simulation平台內部用的的所有元件說明與接線,以便

以後方便連接不同的 RTL 模組。

RTL module

SYS_clkinverter

Reset generator

TCK_clk

Always low generator

inverter

Scan_data/JTAGconverter

圖 3-21 the component and connection in Platform Architect

開啟 SC-RTL co-simulation平台(專有名詞稱為 Platform Architect)後開啟

sthuang_new.xml就會得到上面的元件與接線圖,也是 SC-RTL co-simulation平台

內部詳細的架構,下面依照所有元件說明主要分三個部份,第一部份:clock, reset

和 inverter環境元件以及接線說明,第二部份:JTAGSC元件以及接線說明,第

三部份:RTL module元件以及接線說明。

第一部份:clock, reset和 inverter,屬於設定環境訊號的元件,第一欄為元件

的名稱、第二欄是元件功能或目的說明、第三欄是該元件 input port名稱、第四

欄是該 input port的輸入來源、第五欄是該元件的 output port名稱,第六欄是該

output port會接到哪的元件的 input port:

元件名稱 功用說明 input

port 名

輸入來源

(元件名稱

/port 名

稱)

output

port

名稱

輸出目標(元件名

稱/port 名稱)

41

i_C

lock

Gen

erat

o

r

RTL module主要

時脈

- - CLK i_sys32tm/XCLKI

N i_

Res

et

Gen

erat

or

Reset訊號產生元

件 (high active

reset)

- - RST i_inv/in

i_JtagSC/sysReset

i_C

lock

Gen

erat

o

r_1

i_JtagSC驅動時

- - CLK i_JtagSC/tck

i_in

v

輸 出 是 low

active reset訊號

in i_ResetGe

nerator/RS

T

out i_sys32tm/nReset

i_in

v_1

輸 入 是 high

active trst訊號,

輸出是 low active

ntrst訊號

in i_JtagSC/t

rst

out i_sys32tm/ntrst

i_R

eset

Gen

erat

or_1

always low 訊號

的產生元件2

- - RST i_sys32tm/TESTR

EQA

i_sys32tm/TESTR

EQB

i_sys32tm/DBGR

Q

i_sys32tm/GDBB

REAK

i_sys32tm/EXTE

RN

i_R

eset

Ge

nera

tor_

2 always low 訊號

的產生元件 2

- - RST i_inv_2/in

i_in

v_2

輸 入 為 always

low 訊號,輸出為

always high訊號

in i_ResetGe

nerator_2/

RST

out i_sys32tm/DBGE

N

表 3-4 the environment component description

第二部份,i_JtagSC,也就是 EICE_control_event/JTAG converter,OpenOCD

2本來是 high active reset訊號產生元件,但因為沒有設定 reset時間點,所以是一直為 low 訊號

的產生元件

42

與 RTL 溝通的界面。說明 port功能與接線:

Port name Port說明 輸入來源或輸出目標(元

件名稱/port 名稱)

sysReset input port(high active):reset i_JtagSC,

使內部訊號獲得初始值

輸 入 來 源 :

i_ResetGenerator/RST

tck Input port(clock): i_JtagSC運作時脈 輸 入 來 源 :

i_ClockGenerator_1/CLK

tdo Input port(scan data):從 RTL module scan

EICE out data的值

輸 入 來 源 :

i_sys32tm/TDO

tdi Output port(scan data):輸入 RTL module

EICE scan in data的值

輸 出 目 標 :

i_sys32tm/TDI

tms Output port(JTAG FSM): 控 制 RTL

module EICE內部 JTAG FSM移動訊號

輸 出 目 標 :

i_sys32tm/TMS

trst Output port(reset):控制 RTL module

EICE reset訊號,因為是 high active所

以必需經過 i_inv_1轉成 low active訊號

才能接到 RTL module

輸出目標:i_inv_1/in

Tck_out Output port(clock):控制 RTL module

EICE運作時脈

輸 出 目 標 :

i_sys32tm/TCK

表 3-5 JTACSC component description

第三部份,i_sys32tm是 EASY環境,也就是 RTL module,內含 sys32tm(EICE

與 sys32tm CPU), BUS與 memory RTL module。說明 port功能與接線;值得注意

的事情是 RTL module接線的重點在於 input port必須接線,而 output port可以視

情況而接,也就是說 output port接或不接均可,是需求而定,舉例來說 i_JtagSC

需要知道 i_sys32tm output port TDO值,所以 i_sys32tm的 TDO必需接到 i_JtagSC

的 tdo。

Port name Port說明 輸入來源或輸出目標(元

件名稱/port 名稱)

XCLKIN Input port (clock): i_sys32tm運作時

輸 入 來 源 :

i_ClockGenerator/CLK

nReset Input port (low active reset):

i_sys32tm reset訊號

輸入來源:i_inv/out

TESTREQA

TESTREQB

Input port: i_sys32tm TIC訊號,沒

有用到時候必須維持為 low

輸 入 來 源 :

i_ResetGenerator_1/RST

nTRST Input port (low active reset):

i_sys32tmEICE reset訊號

輸入來源:i_inv_1/out

TDI Input port (scan data): i_sys32tmEICE

scan in訊號

輸入來源:i_JtagSC /tdi

43

TMS Input port (JTAG FSM) :

i_sys32tmEICE JTAG FSM移動控制

訊號

輸入來源:i_JtagSC /tms

DBGRQ Input port (trigger): i_sys32tmEICE

cross trigger 訊號,使 EICE立即停止

sys32tm,沒有用到時維持為 low

輸 入 來 源 :

i_ResetGenerator_1/RST

DBGBREAK Input port (trigger): i_sys32tmEICE

cross trigger 訊號,使 EICE 控制

sys32tm完成執行當下 fetch到的指令

後停止,沒有用到時維持為 low

輸 入 來 源 :

i_ResetGenerator_1/RST

DBGEN Input port (enable signal) :

i_sys32tmEICE控制訊號,控制 EICE

是否運作,若要運作則要為 high

輸入來源:i_inv_2/out

TCK Input port (clock):i_sys32tmEICE運

作時脈

輸 入 來 源 : i_JtagSC

/tck_out

EXTERN Input port:多個 CPU情況下前一級的

EICE設定輸入,如若沒有用到預設給

0

輸 入 來 源 :

i_ResetGenerator_1/RST

TDO Output port (scan out data):

i_sys32tmEICEscan out data,要連接到

i_JtagSC,才能知道 scan out的值

輸入來源:i_JtagSC /tdo

表 3-6 the RTL component description

3.4.2 如何使用協同驗證平台如何使用協同驗證平台如何使用協同驗證平台如何使用協同驗證平台

在得知如何接線後,些下來這章重點在於如何使用平台,使用平台主要有三

個步驟,第一:Platform Architect平台架構 export,第二:開啟 scsh使 SC-

RTL co-simulation平台開始執行 co-simulation,第三:開啟 OpenOCD連接

Platform Architect平台。

44

圖 3-22 the architect compile argument setting flow

第一步驟:基本上只要 Platform Architect內部架構出來的元件與接線不變,

此步驟只要作一次就可,此步驟目的是將 Platform Architect內部架構出來的元件

與接線產生可以讓 scsh執行的檔案,以便 scsh可以模擬運作此架構。

首先 Export->Export Design呼叫出 scsh模擬調整視窗,需要調整的參數與

說明如下:

設定欄位 設定參數 設定說明

Export Directory /home/sthuang/ICE_test/export_new_0618 指定產生出檔案

存放的資料夾,

以供 scsh執行

Linker Flags -ljtagsc 由 於 有 用 到

jtagsc元件,所以

必須指定參照

jtagsc的函式庫

HDL Library Map myLib=./hdl_lib Platform

Architect 使 用

systemc 與 RTL

( 使 用 ncsim

simulator ) co-

simulation 固定

設定

HDL simulator ncsim

Verilog Compile

Options

-nowarn DLCLAP -mess -status -logfile

myvlog.log

HDL Elab Options -timescale 1ns/1ps -nowarn DLCLAP -

mess -status -logfile myvlog.log

HDL Run Options -nowarn DLCLAP -mess -status -logfile

myvlog.log

Verilog Timescale ps

表 3-7the architect compile argument setting value

第二步驟:export完成後,就可以開啟 scsh(systemc shell)模擬執行設計的

架構,進入 export的資料夾並開啟 scsh,輸入 source sim.tcl,讓 scsh開始編譯架

構的平台,順利編譯後打入 r (run)開始執行設計的架構模擬,設定完要觀測的

RTL 訊號後,打入 c (continue)執行模擬,此時 shm通道已打開等待 OpenOCD連

45

接,用圖解如下:

圖 3-23 the architect simulation flow

A:開啟 systemc shell。

B:編譯架構的平台。

C:編譯成功畫面。

D:開始執行 SC-RTL co-simulation,設定要觀測的 RTL 訊號後啟動 RTL

simulator。

E:啟動 RTL simulator之後,scsh繼續執行 SC-RTL co-simulation。

F:SC-RTL co-simulation執行中,已開啟 shm通道等待 OpenOCD連接。

第三步驟:架構模擬執行中,之後就可以開啟 OpenOCD以 shm通道連接,

OpenOCD連接成功就會顯示以下畫面,開啟 OpenOCD需要 jtagkey.cfg檔案,

該檔案內容請參考圖 4-4:

圖 3-24 OpenOCD connect to JTAGSC successfully

顯示表示已成功連接 JTAGSC(Platform Architect)並成功執行 DR scan的

46

到 EICE id值。

接下來講述之前提及的記憶體位址特徵為值 t 或 u 的位址要在哪裡修改,記

憶體位址特徵為值 t 是 P1與 C1共享的記憶體位址,而 u 是 P2與 C2共享的記

憶體位址。

ab

圖 3-25 location of shm address

如上圖表示:

� 記憶體位址特徵為值 t 修改,依此例 t =1124:

� P1是位於 shm.c #36行。

� C1是位於 JtagSC.cpp #520行。

� 記憶體位址特徵為值 u 修改,依此例 u =1321:

� P2是位於 JtagSC.cpp #686行。

� C1是位於 shm.c #2241行。

47

Chapter 4 實驗實驗實驗實驗

完成 OpenOCD與 RTL(SYS32TM)透過 JTAGSC

(EICE_control_event/JTAG converter)連接之後,此章節用四部份證明 co-

verification是可以運作的,第一部份呼叫 JTAGSC的 API 證明 JTAGSC是可以

產生正確的 JTAG訊號與 RTL 一起模擬,第二部分 OpenOCD執行 EICE control

event即 IR scan, DR scan和 RUNTEST功能,證明 OpenOCD與 JTAGSC溝通

正常,第三部份說明 GDB(GNU debugger)命令(read/write memory/register

之類的功能,由 EICE control event組合),證明 GDB命令透過 OpenOCD幫助

下是可以使用的;最後,第四部份用兩個例子證明並且說明 GNU compiler,

GDB與 OpenOCD如何使用。

Debug software(OpenOCD)

Scan_data/JTAG protocol converter

( JTAGSC)

EASY_ENV

Platform Architect (co-simulation)Software(host)

Product_EICE_control

_event P1

P2

C1

C2

SYS32TM

AHB

ICE

Memory

SYS_clkTCK_clk

TCK

Hanlde_fb_data

Debug software(GDB)

r/w memr/w reg

break pointWatch point

High level debug cmd

圖 4-1 final frame work with GDB

上圖說明跟圖 3-20 一樣,唯一不同的是現在有 GDB控制。

用圖片解釋:第一部份就是右邊虛線 Platform Architect部份,驗證

JTAGSC API是否可經由 JTAG訊號與 RTL 一起執行模擬,當第一部份可以正

常與 RTL 執行模擬之後,緊接著第二部份則著重在中間虛線部份–IPC驗證,

也就是 OpenOCD與 JTAGSC互動通道,其驗證角度在於當 OpenOCD執行

EICE control event (IR, DR scan與 RUNTEST動作)後 RTL 是否可以正確的

執行模擬,如果可以則表示通道可運作,反之則無,當第二部份驗證完成後,

就可以驗證第三部份,也就是 OpenOCD內部的高階除錯命令,例如讀寫記憶

體、讀寫暫存器、設定中斷點等等…,均是由 EICE control event組合而成,部

份則藉由 GDB以 RSP命令驅動 OpenOCD執行。

4.1 SC model (JTAGSC)和和和和 RTL model (SYS32TM+EICE)

48

可以正常執行協同模擬可以正常執行協同模擬可以正常執行協同模擬可以正常執行協同模擬

此章目的在於證明可以使用 JTAGSC API產生 JTAG訊號與 RTL 執行模

擬,第三章描述的 API 有用處的主要有三項—IR scan, DR scan 以及自行新增的

RUNTEST API,會證明這三個 API 是因為 EICE與 OpenOCD的互動全部都是

由執行這三種 API 組合而成。

� JTAGSC’s IR scan API:

JTAGSC API呼叫:IR scan

JTAGSC’s IR API, scan 0xc 4bit IR instruction.

It mean scan 4 bit scan, and value is 0xc.

IR scan RTL 結果:tap_instruction is change to 0xc

表 4-1 JTAGSC IR API experiment result

� JTAGSC’s DR scan API:

JTAGSC API呼叫:DR scan

JTAGSC’s DR API, scan 0x0 32bit DR for getting id code.

After get the id code then print it. it mean we can get the scan out data through

JTAGSC’s DR API.

DR scan RTL 結果:TDO get the value of 0x1f0f0f0f

49

表 4-2 JTAGSC DR API experiment result

� JTAGSC’s RUNTEST API:驅動 TAP FSM移動到 Run-Test/Idle state

JTAGSC API呼叫:RUNTEST

JTAGSC’s RUNTEST API, the TAP FSM will move to Run-Test/Idle state.

RUNTEST RTL結果:TAP_STATE (TAP FSM)移動到 Run-Test/Idle

d:Update-IR

c:Run-Test/Idle

表 4-3 JTAGSC RUNTEST API experiment result

4.2 OpenOCD與與與與 SC+RTL model互動驗證互動驗證互動驗證互動驗證

此章節會證明 OpenOCD IR,DR scan和 RUNTEST功能是有效的,依序說

明 IRscan,DR scan和 RUNTEST,上一章證明 JTAGSC與 RTL 協同模擬是有用

的,那麼這個實驗主要是從 OpenOCD端執行 IR,DR scan和 RUNTEST功能,

如果可以正確與 RTL 協同模擬,表示 OpenOCD與 JTAGSC的溝通 IPC通道是

有用的:

� IR scan:主要從 OpenOCD執行一筆 IR scan,觀察 RTL 是否有正確的將此

筆 IR 命令寫入。

OpenOCD 命令:irscan s3c4510.cpu 0xc

50

OpenOCD IRscan命令的 RTL 結果:tap_instruction is change to 0xc

� 開啟 OpenOCD後輸入 OpenOCD命令,測試 IR scan功能,從右圖顯

示 IRscan功能確實有正確與 RTL 協同模擬。

� DR scan:在 OpenOCD一開啟就會去使用 DR scan的到硬體 ID code,所以

當 OpenOCD成功啟動就表示 DR scan功能可以正確的與 RTL 協同模擬。

OpenOCD 啟動:自動執行 DR scan取得 id code

DR scan取得 id code的 RTL 結果:

� 當 OpenOCD開啟時候會使用 DR scan得到 id code,所以當 OpenOCD

可以成功開啟,表示可以透過 IPC呼叫 JTAGSC DR API成功取得 id

code。

51

� RUNTEST,從 OpenOCD下命令驅使 JTAG FSM移動到 Run-Test/Idle:

OpenOCD 命令:

runtest 1 RTL 結果:TAP_STATE (TAP FSM)移動到 Run-Test/Idle

� 經由 OpenOCD呼叫 RUNTEST功能,也成功反應在 RTL。

在第一部份已經證明 JTAGSC與 RTL 協同模擬是有作用的,那麼這次直接

從 OpenOCD執行 IR, DR scan和 RUNTEST功能,從上述展示結果來看也是可

以與 RTL 協同模擬,這表示 OpenOCD與 JTAGSC的 IPC溝通機制是可以正常

運作。

4.3 GDB 需要需要需要需要 EICE 幫助的除錯動作幫助的除錯動作幫助的除錯動作幫助的除錯動作

之前只是對單一 EICE control event執行實驗,接下來將 EICE control event

組合作更進一步的實驗,至於要如何組合才有意義,則採用實現高階除錯命令

的組合,例如該組合可以實現控制 EICE 讀寫 SYS32TM 暫存器、讀寫記憶體

之類的高階除錯命令,而該命令可以透過 GDB以 RSP方式觸發 OpenOCD執

行。

接下來描述在 OpenOCD內部的高階除錯命令內容,這些命令會與 RTL 協

同驗證,而驗證出來的 BUG說明與修改紀錄在 Appendix C內,這章節只是描

述與證明高階除錯命令已可正確無誤執行;這些命令都是由 IR,DR與

RUNTEST組合而成,OpenOCD高階除錯命令的執行必須藉由 GDB以 RSP命

令(透過 TCP/IP網路協定)觸發,舉例來說,當 GDB執行讀取記憶體的命令時

就會透過 RSP觸發在 OpenOCD內部一連串的 IR,DR與 RUNTEST組合,而那

些組合就會幫助 GDB 實現讀取記憶體的功能,那一連串的組合就稱作讀取記

憶體高階除錯命令;換句話說當 GDB需要執行高階除錯命令時 GDB只是將需

求往外丟給 OpenOCD,由 OpenOCD來幫 GDB實現高階除錯命令內容。

52

GDB命令主要分為三種:第一種是 GDB組態設定,主要用來控制 GDB內

部組態設定,例如 set remotetimeout命令主要是設定當 GDB用 TCP/IP連接

OpenOCD後,GDB判斷 OpenOCD是否有繼續連接的 time out 極限值,第二

種是 GDB控制設定,主要控制 GDB要對哪個目標作除錯,例如 target remote

localhost:3333命令,就是控制 GDB以 TCP/IP方式對本機端 port為 3333的裝

置為遠端除錯的目標,而那目標就是 OpenOCD,以上這兩種命令基本上都不會

觸發 OpenOCD內部的高階除錯命令,充其量只是當 GDB執行 target remote命

令後,OpenOCD回應可以連接並保持在連接狀態而已,而第三種命令才是會觸

發 OpenOCD內部的高階除錯命令,例如 x/1命令是讀取記憶體,會把討論的重

點放在第三種命令,第三種需要 EICE幫助的命令,只要能全部執行成功,

OpenOCD與 CPU+EICE就驗證完成。

以下會表格由左到右欄位說明依序是第一欄:編號、第二欄:GDB 執行哪

些命令、第三欄:透過 TCP/IP發出哪種 RSP命令、第四欄:觸發到何種內建

在 OpenOCD高等除錯命令、第五欄:高等除錯命令執行哪些 IR,DR與

RUNTEST組合、第六欄:EICE經過這些 JTAG組合後會會被調整成怎樣的組

態:

Gdb 除錯

命令

RSP命

OpenOCD

處理函式

JTAG命令序列

(IR,DR與 RUNTEST組合)

embedded ICE configuration

1

- -

Che

ck

ID

� 32 bits DR:0x0 � ID had been scan out

2

Mon

hal

t

(sto

p C

PU

)

qRcm

d,ha

lt

(hal

t will

be

enco

de to

Hex

form

)

Arm

7_9_

halt

� (1)4 bits IR: scan n cmd

� (2)4 bits DR:0x2

� (3)4 bits IR: intest cmd

� (4)37 bits DR: write BDU

data mask=0xffff_ffff

� (5)37 bits DR: write BDU

address mask=0xffff_ffff

� (6)37 bits DR: scan out

status for checking CPU

stop or not

� The step (1)~(5) will

enable Break signal(output

of BDU) for stopping CPU

immediately

� (6)Update status when is

stoped for OpenOCD

detection

53

3 M

on r

eg #

reg

dat

a_va

l

(writ

e re

g)

qRcm

d, r

eg #

reg

dat

a_va

l

(reg

#re

g da

ta_v

al w

ill b

e en

cod

e to

Hex

form

)

AR

M7_

9_w

rite_

core

_re

g

� (1)4 bits IR: scan n cmd

� (2)4 bits DR:0x1

� (3)4 bits IR: intest cmd

� (4)33bits DR:LDMIA

instruction to CPU

� (5)RUNTEST, let LDMID

move to decode state

� (6)RUNTEST, let LDMID

move to execution state

� (7) 33bits DR: give the

data_val of #reg

� (8) RUNTEST, let data_val

into #reg

� Use scan chain 1 to let

data_val into #reg by using

LDMIA instruction

4

Mon

reg

#re

g

(rea

d re

g)

qRcm

d, r

eg #

reg

(reg

#re

g w

ill b

e en

cod

e to

Hex

form

)

AR

M7_

9_re

ad_c

ore

_reg

� (1)4 bits IR: scan n cmd

� (2)4 bits DR:0x1

� (3)4 bits IR: intest cmd

� (4)33bits DR:STMIA

instruction to CPU

� (5)RUNTEST, let STMID

move to decode state

� (6)RUNTEST, let STMID

move to execution state

� (7) 33bits DR: read the

contest of #reg

� Use scan chain 1 to read

#reg contest by using

STMIA instruction

54

5 S

et *

(int*

)add

ress

=d

ata

(writ

e m

emor

y)

M,a

ddr,

len,

data

AR

M7_

9_w

rite_

mem

ory

� (1)call write reg such that

R0=addr,R1~R15=data

� (2) 33bits DR:NOP

instruction to clean

execution state of CPU

� (3) 33bits DR:NOP

instruction to clean decode

state of CPU

� (4) 33bits DR:STMIA,

STRH or STRB instruction

to CPU depend on len and

bit33 be 1

� (5) 4bits IR: Resume cmd

� (6)RUNTEST, let CPU

access memory through

BUS (enter normal mode)

� Step (1)~(4) set the

address and data to CPU

by EICE for writing

memory

� (5)~(6) CPU enter normal

mode by EICE. After CPU

finish execution

instruction of step (4),

CPU will stop (enter to

debug mode) because of

bit33has been poll up

6

x/1

addr

(rea

d m

emor

y)

m,a

ddr,

len

AR

M7_

9_re

ad_m

emor

y

� (1)call write reg such that

R0=addr

� (2) 33bits DR:NOP

instruction to clean

execution state of CPU

� (3) 33bits DR:NOP

instruction to clean decode

state of CPU

� (4) 33bits DR:LDMIA,

LDRH or LDRB instruction

to CPU depend on len and

bit33 be 1

� (5) 4bits IR:Rsume cmd

� (6)RUNTEST, let CPU

access memory through

BUS (enter normal mode)

� (7)call read reg such that

we get the memory context

� Step (1)~(4) set the

address to CPU by EICE

for read memory

� (5)~(6) CPU enter normal

mode by EICE. After CPU

finish execution of step

(4), CPU will stop (enter

to debug mode) because of

bit33has been poll up

� (7) get the read memory

result by calling read reg

55

7 B

reak

fun_

nam

e

(sof

t bre

ak p

oint

)

Z,0

,add

r,si

ze

AR

M7_

9_ad

d_br

eakp

oin

t

� (1)4 bits IR: scan n cmd

� (2)4 bits DR:0x2

� (3)4 bits IR: intest cmd

� (4)37bits DR: data

value=0xdeee_deee(arm

mode i.e. size ==4), or

0xdeee(thumb mode i.e.

size ==2)

� (5) 37bits DR: data

mask=0xffff_ffff

� (6)call write memory such

that addr=0xdeee_deee(arm

mode), or 0xdeee(thumb

mode)

� (7) 37bits DR:BDU control

mask=0xff

� (8) 37bits DR:BDU control

value=0x100 (enable BDU)

� Setting and enabling BDU

for break point(use watch

0xdeee_deee value way)

8

hbre

ak fu

n_n

ame

(har

d br

eak

poin

t)

Z,1

,add

r,si

ze

AR

M7_

9_ad

d_br

eakp

oin

t

� (1)4 bits IR: scan n cmd

� (2)4 bits DR:0x2

� (3)4 bits IR: intest cmd

� (4)37bits DR: addr

value=addr

� (5) 37bits DR: addr

mask=0xffff_ffff

� (6) 37bits DR: data

mask=0xffff_ffff

� (7) 37bits DR:BDU control

mask=0xff

� (8) 37bits DR:BDU control

value=0x100 (enable BDU)

� Setting and enabling BDU

for break point

56

9 W

atch

va

r_s

(Wai

tch

poin

t)

Z,2

,var

_s_a

ddr,

size

Z,4

,var

_s_a

ddr,

size

Arm

7_9_

add_

wat

chpo

int

� (1)4 bits IR: scan n cmd

� (2)4 bits DR:0x2

� (3)4 bits IR: intest cmd

� (4)37bits DR: addr

value=var_s_addr

� (5) 37bits DR: addr

mask=0xffff_ffff

� (6) 37bits DR:BDU control

mask=0xf7 or 0xf6

� (7) 37bits DR:BDU control

value=0x108 or 0x109

� (1)~(7)Setting and

enabling BDU for watch

point

� (6) If BDU control

mask=0xf7, mean do not

consider read or write var.

0xf6 mean consider that.

� (7) If BDU control

value=0x108 mean enable

BDU and trigger watch

point when read var_s.

0x109 enable BDU and

trigger watch point when

write var_s.

10

Del

ete

(rem

ove

brea

k an

d

wat

ch p

oint

)

z,0,

addr

ess,

size

z,2,

valu

e_va

l,siz

e

Arm

7_9_

rem

ove_

bre

ak

poin

t

Arm

7_9_

rem

ove_

wat

c

hpoi

nt

� (1)4 bits IR: scan n cmd

� (2)4 bits DR:0x2

� (3)4 bits IR: intest cmd

� (4) 37bits DR:BDU control

value=0x0(disable BDU)

� (5)call write memory to

recover soft point

� disable BDU and recover

the memory context that

sot break point changed

11

c

(con

tinue

) c

Arm

7_9

_res

ume � (1) 4bits IR: Resume cmd

� (2)RUNTEST, let CPU

enter to normal mode

� Let CPU enter to normal

mode

12

s

(sin

gle

step

)

s

Arm

7_9_

step

� (1)4 bits IR: scan n cmd

� (2)4 bits DR:0x1

� (3)4 bits IR: intest cmd

� (4)33 bits DR: nop

instructions with bit33 is1

� (5) 33 bits DR: branch

instructions such that

branch to pc=pc-8

� CPU branch to last 2

instructions for beginning

to execution. After execute

the last 2 instructions CPU

will stop because of bit33

is high

表 4-4 GDB debugging activities with OpenOCD and RTL EICE

第一項 chick id:當 OpenOCD開啟透過 apatper連接硬體時候第一件事情

就是會執行 DRscan讀取 id code以確定目前連接的硬體 CPU是否是使用者預想

的,第二項停止 CPU:CPU一開始是屬於持續運作狀態,debugger要透過

EICE控制 CPU就要先將 CPU停止下來,進入 debug mode(即 CPU不依照系

統時脈運作,改由 EICE控制 CPU運作),第三項寫入暫存器:debugger透過

57

EICE更改 CPU內部暫存器的值,第四項讀取暫存器:debugger透過 EICE讀

出 CPU內部暫存器的值,第五項寫入記憶體:debugger透過 EICE控制 CPU寫

入某值在記憶體某位置內,第六項讀取記憶體:debugger透過 EICE控制 CPU

讀取憶體某位置的內容值,第七、八項設定中斷點:debugger透過 EICE設定

中斷點,使 CPU執行應用程式的時候,EICE可以幫助使用者監測是否跑到使

用者設定的中斷點,如果是則 EICE停止 CPU執行,反之則不干擾 CPU,第九

項設定觀測點:debugger對某個變數設定觀測點,只要應用程式執行過程中對

該變數有存取的動作 EICE就會停止 CPU,第十項刪除所有中斷點與觀測點設

置:debugger刪除 EICE內部所有中斷點與觀測點的設置,使 EICE不干擾

CPU執行應用程式,第十一項命令 CPU開始或繼續執行應用程式:當

debugger設置完所有中斷或觀測點之後,透過該命令使 CPU執行應用程式,進

入 normal mode(即 CPU依照系統時脈運作,不再被 EICE控制),第十二項單

步執行:debugger透過 EICE控制 CPU只執行應用程式內部程式碼的一個敘述

或運作。

接下來會依據這 12個 GDB命令在 co-verification platform上面實際運作,

以證明這些命令可以在 OpenOCD幫助下正確執行,下表格為 GDB顯示的結

果:

Gdb 除錯命令 命令說明 GDB view

1

-

當 OpenOCD開啟

後就會去讀取

EICE的 id code

注:此為 OpenOCD視窗

58

2

Mon halt

透過 EICE停止

SYS32TM

(gdb) mon halt

3 Mon reg #reg

data_val

寫入暫存器

A part:write register

B part:read register

4

Mon reg #reg

讀取暫存器內容

5 Set

*(int*)address=data

寫入記憶體

A part:write memory

B part:read memory 6

x/1 addr

讀取記憶體

7

Break fun_name

設定中斷

(軟體中斷)

A part:set software break

point

B part:continue(start program

execution)

C part:meet break point

59

8

hbreak fun_name

設定中斷

(硬體中斷)

A part:set hardware break

point

B part:continue(start program

execution)

C part:meet break point

9

awatch ver_name

設定觀察點在哪

個變數,只要變

數有被讀寫則中

斷執行

A part:set watch point

B part:show source code

C part:continue(start program

execution) and meet watch

point

10

Delete

移除所有 break

point與 watch

point

A part:set watch point

B part:delete all bp and wp

C part:continue(start program

execution)

D part:program finish without

meeting any break point

60

11

c

(continue)

使 application

program開始執行

直到遇到中斷點

或程式結束

GDB view:

A part:continue(start program

execution)

B part :program finish

12

s

(single step)

單步執行:一行

一行的執行

application

program

A part:show source code

B part:single step

表 4-5GDB debugging activities with OpenOCD and RTL EICE result

以上的結果說明這 12個 GDB指令透過 OpenOCD幫助之後,執行都正確

無誤,所以基本上已經可以經由 GDB透過 OpenOCD幫助來偵錯 application

program,接下來用 JPEG encoder與 3D graph為範例來證明 co-verification

platform是有效的,即是證明:經過 co-verification platform驗證的 OpenOCD與

RTL,如果將 RTL 合成燒錄進 FPGA,OpenOCD也是可以正確與 RTL(已燒錄

進 FPGA)運作。

4.4 Semihosting 機制機制機制機制

semihosting機制是由兩種高等除錯命令所組成,是 break point以及

read/write memory。

當在寫在 CPU上執行的應用程式的時候難免會用到 printf 或者 file

operation的功能,因為這些功能會需要透過作業系統存取螢幕的顯示或者硬碟

讀取,一般處理情況程式會啟動 SWI(SoftWare Interrupt),這是通知作業系統

開始幫程式實現 printf 或者 file operation的功能;在 embedded system如果有作

業系統的當然是不成問題,但是當使用 embedded ICE控制 CPU來執行應用程

式通常不會有作業系統來輔助,所以通常會使用 semihosting的技術來達成。

61

Host(x86-PC)

USB_TO_JTAGconverter

Embedded system

SYS32TM

EICE

MEM

USB

圖 4-2 the basic emulation connection graph

semihosting指的是:當 embedded system沒有作業系統的幫助下,透過

host端的幫忙實現需要作業系統幫助的功能,如 printf 或者 file operation;原理

就是當 embedded system需要作業系統的幫助,那麼就由 host端作業系統來輔

助,host執行 GDB與 OpenOCD,且 GDB以連接 OpenOCD。

semihosting詳細步驟:

� Step1:在 GDB命令列打上 mon arm7_9 semihosting enable,功能是命

令 OpenOCD將 semihosting功能啟動,詳細設定就是設 break point在

SWI的中斷向量的位址(0x8)。

� Step2:當 SYS32TM執行 application program遇到 printf 之類需要 host

端輔助顯示 printf 內容的指令時,會把 R0放要處理的 semihosting type

(以 printf 為例就會是 0x5),R1放要處理的參數位址(以 printf 為例

R1指到的 embedded system memory address就是要顯示的字串),又例

如如果是要執行 fopen則 R0 會是 0x1,而 R1所指的位置內容則是

fopen現在要開檔的檔名,讀寫的設定等等,之後再執行 SWI

0x123456這指令,表示現在要執行 semihosting服務。

� Step 3:因為 SYS32TM執行 SWI 0x123456這指令,就會跳要到 0x8

這個位址,所以就會遇到在 Step 1設定的 break point因而停下來,

host端(運行 OpenOCD)會檢查目前的 PC值是否是 SWI的中斷向量

位址,以及進入 SWI的中斷向量位址是否是因為要執行 semihosting

(檢查進入 SWI的中斷向量位址是否是因為 SWI 0x123456這指令)。

� Step 4:host端呼叫 read register把 R0和 R1讀進來,呼叫 read

memory以 R1內容為位址讀取要處理的參數,之後 host端依照

semihosting type與參數作相對映的處理,例如 semihosting type是

fopen就呼叫 host端的 fopen功能,參數來源使用以 R1內容為位址讀

取回來的參數。

� Step 5:處理完成後,host端呼叫 continue讓 embedded system繼續執

行應用程式。

解釋完 semihosting工作原理後,會在詳細說明常用到的代號以及代表的意

62

義:

semihosting type number

will in R0

說明(以下記憶體指的是 embedded system的

記憶體)

SYS_OPEN 0x1 開啟位於 host端檔案服務,檔名與讀寫屬性會

存在 R1指向的記憶體位置。

SYS_CLOSE 0x2 關閉目前在 host端所開的檔案,檔名會存在

R1指向的記憶體位置。

SYS_WRITEC 0x3 寫入一個字元到 host端螢幕上,字元存在 R1

指向的記憶體位置。

SYS_WRITE0 0x4 寫入一連串的字元到螢幕上,一連串的字元存

在 R1指向的記憶體位置。

SYS_WRITE 0x5 寫入字串到

host端已開

啟的檔案。

*(R1+0) 指定在 host某個已開

啟的檔案。

*(R1+4) 欲寫入資料存放的記

憶體位址。

*(R1+8) 寫入的長度,以 byte

為單位。

SYS_READ 0x6 讀取在 host

端已開啟檔

案的內容

*(R1+0) 指定在 host某個已開

啟的檔案。

*(R1+4) 讀取後的資料要放在

記憶體的哪個位址。

*(R1+8) 寫入的長度,以 byte

為單位。

SYS_READC 0x7 從 host端的鍵盤按一字元顯示在 host端螢幕

上。

SYS_HEAPINFO 0x16 從 host端取得 stack point與 heap point的值。

angel_SWIreason_

ReportException

0x18 說明 program目前運作的情況,R1如果是

0x20026表示 program結束。

表 4-6 common semihosting type table

以上表格說明常用的 semihosting type,如果想更仔細了解請參照 ADS

semihosting說明書,或者 OpenOCD原始碼裡面的 Arm_semihosting.c實作內

容。

4.5 在協同驗證平台執行應用程式除錯範例在協同驗證平台執行應用程式除錯範例在協同驗證平台執行應用程式除錯範例在協同驗證平台執行應用程式除錯範例

經過以上的驗證之後證明所有除錯功能階正常運作,接下來使用 GDB對

某一應用程式使用除錯功能來觀察或改變執行順序,此例子是使用協同驗證平

台來對該應用程式執行除錯以及觀察。

63

Step 1 :Give 10

value into a array

Step 2 : Sort that value by using quick sort algorithm

Step 2a :Sort 0 to

j-1

Step 2b :Sort j+1

to 9

Recursive calling

… … … …...

.

.

.

.

.

.

.

.

.

.

.

.

Step 3 : Find a given

value by using binary search

圖 4-3 the example program will be debugged by GDB on co-verification platform

上圖是將要被 GDB除錯或觀察的程式流程圖,主要分成三步驟,第一步

驟:給予 10個數值並儲存在陣列內部,第二步驟:對該陣列內部數值執行排

序,採用的排序法是 quick sort演算法,該演算法採用得想法是 divide and

counter,使用遞迴呼叫實現,第三步驟:從已排序好的陣列內部尋到某數值,

採用的一樣是 divide and counter想法的 binary search演算法,採用迴圈實現。

接下來說明要對該程式作怎樣的觀察與除錯修改:首先會先下中斷點在

main主程式,之後會去觀察到底在陣列內部放了哪階數值,然後下中斷點在

step 2a位置,觀察接下來要排序的是哪幾個陣列成員,使用 step over停止在

step 2b位置,觀察要排序的陣列成員,使用 step over之後使用 read memory讀

取排列之後陣列內部數值結果,之後在 binary search函式下中斷點,修改要尋

找的數值,使之找到別的陣列成員,而不是原本所設想的陣列成員,以下是

GDB操作與說明,在開啟 GDB連接之前要先啟動 co-verification platform執

行,如何啟動請參考 3.4.2 ,OpenOCD使用的 cfg內容如下:

64

圖 4-4 the OpenOCD configuration file context

上圖是開啟 OpenOCD必須的參數檔案(jtagkey.cfg),大致上分為三個部

份:

� A part:命令 OpenOCD開啟兩個 TCP/IP port分別是 4444給 terminal

使用,3333給 GDB連接。

� B part:告知 OpenOCD目前的 adapter是什麼,目前是使用 JTAGSC

作為 adapter,如欲使用 ft2232為 adapter就將#刪掉,將 Interface

JTAGSC加上#,#號表示的是註解:

� Interface JTAGSC:指定 JTAGSC為 adapter,如果是 ft2232就是

指定 ft2232為 adapter。

� Jtag_khz 1000:指定 TCK 頻率為 1MHZ,只有使用 ft2232當

adapter才需要設定。

� ft2232_device_desc "Dual RS232 A":設定 ft2232要用那個 port當

JTAG訊號輸出,只有使用 ft2232當 adapter才需要設定。

� ft2232_layout jtagkey:告知 OpenOCD目前的 ft2232 layout是那種

格式,只有使用 ft2232當 adapter才需要設定

� C part:主要設定 EICE id code以及 CPU型號,詳細內容可參照

65

OpenOCD操作手冊,以下只針對 jtag newtap與 target create說明。

� jtag newtap主要命令 OpenOCD在內部建造出一個 jtag結構體,

主要目的是為了對某個 CPU作控制的時候應該對哪個 tap存取,

參數說明如下:

� $_CHIPNAME cpu:命名欲連接的 EICE名稱,

$_CHIPNAME內容值為 s3c4510。

� -irlen 4:告知 OpenOCD該 EICE IR scan chain長度為 4。

� -ircapture 0x1:告知 OpenOCD如欲驗證 IR scan chain是否導

通的話,要用 0x1當驗證數值。

� -irmask 0xf:告知 OpenOCD如欲驗證 IR scan chain是否導

通,要檢查哪些 bit,此例為全部都要檢查。

� -expected-id $_CPUTAPID:告知 OpenOCD檢查 id code時

候,正確數值是多少,此例$_CPUTAPID為 0x1f0f0f0f。

� target create主要命令 OpenOCD在內部建造出一個 target結構

體,該結構體內部敘述如何存取 scan chain的方法,參數說明如

下:

� $_TARGETNAME arm7tdmi:命令 OpenOCD創造一個 target

結構其內容是 arm7tdmi存取控制方法,而該 target結構體別

名為$_TARGETNAME,及 s3c4510.cpu

� -endian $_ENDIAN:告知 OpenOCD目前 CPU是大值還是小

值,此例為小值。

� -chain-position $_TARGETNAME:告知 OpenOCD arm7tdmi

存取控制方式要套用到哪個 tap,此例是剛剛所創造的 tap其

存取方法採用 arm7tdmi方式。

66

圖 4-5 GDB debug quick sort and binary search (#1)

� A part:開啟 GDB。

� -x ~/gdb_init:當 GDB 開啟後自動執行 gdb_init內部撰寫的命

令,相當於 GDB script,主要內容如下:

� set remotetimeout 99999999:設定 GDB檢查 OpenOCD是否

有回應的時間 timeout值,設定為該值表示不檢查。

� show remotetimeout:展示所設定的 remotetimeout數值。

� target remote localhost:3333:命令 GDB連接 OpenOCD。

� mon halt:命令 CPU停止。

� test2.elf:表示要載入的程式是哪個程式。

� B part:CPU已停止。

� C part:載入應用程式碼。

67

� D part:開啟 semihosting功能,semihosting詳細設定步驟請參考

4.4 。

� E part:設定中斷點,在 main的地方,並使 CPU開始運作執行應用程

式。

� F part:進入 main之後遇到中斷點,CPU停止下來。

圖 4-6 GDB debug quick sort and binary search (#2)

� G part:使用 l(list)展現出應用程式的原始碼,可以看出來未排序前

68

陣列內容:

data[0]=25;data[1]=10;data[2]=25;data[3]=62;data[4]=89;data[5

]=2;data[6]=48;data[7]=39;data[8]=24;data[9]=44;。

� H part:設定中斷點在圖 4-3 step2a的地方。

圖 4-7 GDB debug quick sort and binary search (#3)

� I part:c (continue) 使 CPU開始運作,繼續從上次中斷點的地方繼續

執行,並遇到中斷點在 step2a的地方。

� J part:使用 p (print) 讀取變數(記憶體)內容值,得知接下來要排序

的陣列元素是 data[0]~data[3],接下來刪除所有中斷點,避免當使用

step over功能時停在設定的中斷點。

� K part:n (next) 執行 step over功能,之後程式停在 step2b的地方,表

示 data[0]~data[3]已排列完成,之後再使用 p (print) 讀取變數(記憶

體)內容值,得知接下來要排序的陣列元素是 data[5]~data[9],並把排

序前的 data[5]~data[9]數值顯示出來,之後執行 step over將

69

data[5]~data[9]排序完成。

圖 4-8 GDB debug quick sort and binary search (#4)

� L part:觀察 data[5]~data[9]發現均已排序好。

� M part:將新的中斷點設置在 binary_search函式的位置,使用 c使

CPU繼續執行直到遇到中斷點停留在 binary_search函式位置。

� N part:使用 l (list) 將 binary_search函式的原始碼顯示出來,之後使

用 s (single step or step into) 使 CPU執行到原始碼的第 96行得出欲比

對的第一筆陣列 index,也就是 mid 值。

70

� O part:使用 s (step into)直到決定 mid 直為止,使用 p讀取變數值,發

現第一筆比對的陣列內容值就是欲尋找的值也就是 25,這樣無法驗證

binary_search是否正確執行,所以使用 p data[mid+2]也就是讀取

data[6]的值,得出是 44,更改欲尋找的值為 44以確定 binary_search

是可以運作的,以就是更改 pivot 的值,已寫入記憶體方式更改,更改

完成後刪除所有的中斷點並使 CPU繼續執行程式直到結束為止。

� P part:顯示程式已結束。

71

圖 4-9 OpenOCD infomation for executing quicksort with binary search

上圖是 OpenOCD視窗,semihosting訊息(例如 printf 結果)都會展示在這

裡,可以看到主要有三個訊息,說明如下:

� A part:印出已排序好的 data[0]~data[9]值。

� B part:印出 binary search結果,顯示找到該資料在 data[6]的地方,如

果不經由寫入記憶體方式更改欲尋找的值,則會顯示尋找到該值在

data[4]的地方,表示修改記憶體與 binary search是有效的。

� C part:顯示現在程式已經結束。

72

4.6 實際範例實際範例實際範例實際範例-以以以以 JPEG 編碼程式與編碼程式與編碼程式與編碼程式與 3DG SoC程式程式程式程式為為為為例例例例

Debug software(OpenOCD)

USB/JTAG protocol converter(FT2232)

FPGA

Software(host)

SYS32TM

AXI

ICE

Memory

Debug software(GDB)

r/w memr/w reg

break pointWatch point

High level debug cmd

GPU

VS FS

MDK3D(on board)

AHB

CLCD

圖 4-10 Full Example environment

上圖 host端依然是使用 GDB來控制 OpenOCD,adapter則採用 ft2232將

USB package轉換成 JTAG signal控制硬體,而 FPGA內部的硬體主要組成有

SYS32TM+EICE、AXI BUS、GPU,而 AXI BUS 也連接到實驗版上的 AHB

BUS主要藉由 AHB BUS存取實驗版上的記憶體以及 CLCD。

用上面的架構圖來作實驗,將 RTL 燒錄進 FPGA之後在使用 GDB 和

OpenOCD來除錯 JPEG Encoder與 3D graphs SoC application,以證明 co-

verification platform是有效的的;跟 co-verification platform不同的在於兩點,

第一:不是使用 Platform Architect虛擬平台,而是將 RTL 合成並燒錄進

MDK3D 的 V5 FPGA裡面,FPGA燒錄內容包含 AXI BUS, SYS32TM(可經由

JTAG控制)以及 GPU,並且可以用 on board的 memory以及 CLCD(用來顯

示 GPU畫出的結果),第二:不是使用 systemc撰寫的 JTAGSC而是使用

USB/JTAG converter (FT2232)將轉換後的 JTAG訊號打進 FPGA內部。

兩個例子分別是 JPEG Encoder與 3D graphs SoC實驗,前者是將原先未經

壓縮圖片的 RGB值取出來後經由 SYS32TM執行 JPEG Encoder壓縮成 JPEG形

式,並經由 OpenOCD幫助以 semihosting功能將壓縮後圖片由 embedded system

的記憶體取出並儲存在 host端,後者是由 SYS32TM設定別間實驗室開發的

GPU並驅使 GPU畫出 texture cube,GPU內部又分成 VS 與 FS,VS (vertex

shader) 主要工作在於將使用者給予的三維座標轉化成平面二維座標,FS

(fragment shader)主要工作在於對每三個頂點圍出來的面執行塗色功能。

4.6.1 JPEG 編碼程式編碼程式編碼程式編碼程式

在開始說明此實驗前先說明一下 JPEG encoder功能以及此實驗目的,JPEG

73

encoder功能就是將原本未經壓縮的圖片壓縮成 JPEG格式,而此實驗目的是展

示 break point, read/write memory, semihosting, continue, single step等功能,說明

流程會先講解如何將 JPEG encoder編譯成可執行檔以供 SYS32TM執行,之後

會使用 GDB展示 break point, read/write memory, semihosting, continue, single step

等功能。

Host(x86-PC)

USB/JTAGconverter

MDK3D

CPU

EICE

MEM

USB

APP.c1.GNU

compilerAPP.o

2.GNU linker

APP.elf

3.GDB

LOAD

RSP 4.OpenOCD USB...APP(binary)

:FPGA:on board

圖 4-11 tool chain usage flow

基本上在 Host端會先將 application code(APP.c)透過 GNU compiler編譯成

object file(APP.o),再經過 GNU linker連結 library可執行檔(APP.elf)。

GDB(GNU debugger)將 APP.elf載入並去掉 debug與檔頭資訊得到 binary code,

可經由 RSP將 binary code傳到 OpenOCD,OpenOCD使用 write memory方式

控制 CPU(SYS32TM)將 binary code寫入 memory等待 CPU執行,以上是 Host

端大概執行的工作,接下來會詳細介紹 1~4步驟的操作(以 JPEG為例):

� 1.GNU compiler:首先先將 JPEG application code與 ISR code編譯,

在命列列輸入

� 參數說明:-c只將 application code作編譯成 object file的動作,-o

命名產生出來的檔案名稱,-g 加入 debug資訊以供 GDB使用。

� 2.GNU linker:接下來作連結動作,目的將 ISR code map在 address 0

開頭位址,JPEG application code在 ISR code後面,以及連結必要的函

式庫。

./arm-elf-gcc -c ENC.C image.h JGLOBALS.HJTABLES.H

JTYPES.H-o jpeg.o -g

./arm-elf-gcc -cisr.c -o isr.o -g

74

� 在命列列打上這樣的命令表示將預設的 linker script擷取出來,

linker script是決定每個 object file在執行檔裡面的位置,目標是將

isr.o放置在 address 0開頭位址,jpeg.o緊接 isr.o之後放置,所以

不能使用預設 linker script,必須修改。

� linker script修改:

� 把 linker script第 12行位置的數值修改成 0x0,表示 object

file 擺放位置從 address 0開始擺放。

� linker script第 49~52行修改成上面那樣,表示使用該 linker

script它會自動去放置 isr.o的執行程式碼在執行檔 address 0

開頭位址。

� 在命令列輸入上面指令,就可將之前的的 object file連結必要的函

式庫並產生出執行檔(jpeg.elf),此執行檔擁有一些 debug與區段

資訊並不是單純可供執行的 binary code,經由 GDB讀取後才能得

到 binary code,才可透過 OpenOCD幫助將 binary code寫入到記

憶體中,-e指示程式開始執行的進入點是從哪個函式開始,以上

面的例子就是以 Reset_Handler為進入點,亦可使用下述命令把

GNU compiler與 linker 動作一併執行完。

� 4.OpenOCD:在使用 GDB之前,必須先開啟 OpenOCD,如果成功開

啟就會顯示像圖 3-24 OpenOCD connect to JTAGSC successfully 這樣的

資訊。

./arm-elf-ld –verbose > link.script

./arm-elf-ld ./jpeg.o -T ./link.script -e Reset_Handler -o jpeg.elf -g

./arm-elf-gcc ENC.C image.h JGLOBALS.H JTABLES.H

JTYPES.H -T ./ link.script -e Reset_Handler -o jpeg.elf -g

75

� 用上面的命令來開啟 OpenOCD,開啟 OpenOCD必須給予 cfg

file,cfg file 是用來設定 OpenOCD,主要設定三項:

� A.開啟 OpenOCD RSP的 TCP/IP port提供 GDB連接。

� B.通知 OpenOCD目前使用的 USB/JTAG converter型號並初

始化 converter。

� C.通知 OpenOCD目前要連接的 CPU型號(SYS32TM)。

� 3.GDB:接下來開啟 GDB載入 jpef.elf,並連接 OpenOCD執行 debug

工作,接下來的 GDB 操作會展示 break point, read/write memory,

semihosting, continue, single step等功能,也就是此實驗的目的,這些

功能將會轉成 RSP形式通過 TCP/IP傳給 OpenOCD,由 OpenOCD實

現;執行以下命令會開啟 GDB並將 jpeg.elf載入 GDB,此時 GDB內

部已擁有 jpeg.elf的 binary形式,可供載入進 MDK 實驗版上面的記憶

體。

� 接下來要描述的是 GDB的操作流程:

圖 4-12 GDB control flow #1 of JPEG encoder

� A part:連接 OpenOCD。

� B part:從 GDB呼叫 OpenOCD命令,使 CPU停止。

� C part:執行 mdk3d.log檔案,主要功能是 write memory,目

的是為了設定 MDK 實驗版的 DDR memory組態。

./openocd –f conf.cfg

./arm-elf-gdb jpeg.elf

76

� D part:將 jpeg.elf的 binary載入 MDK 實驗版 DDR

memory,GDB使用 write memory方式將 binary寫入,實際

寫入的動作由 OpenOCD完成,GDB只是傳送 write memory

格式的 RSP給 OpenOCD。

圖 4-13 GDB control flow #2 of JPEG encoder

� E part:從 GDB呼叫 OpenOCD命令,開啟 semihosting功

能,詳細步驟請參照上一章。

� F part:設定 break point在開始取出 RGB原值以供壓縮的地

方。

� G part:使 SYS32TM開始執行 JPEG程式,之後遇到 break

point停止。

77

圖 4-14 GDB control flow #3 of JPEG encoder

� H part:執行 single step直到把第一個 pixel RGB值讀出來為

止。

� I part:由於第一個 pixel 是白色所以 RGB值全為 255,以

write memory方式將第一個 pixel 的 R 和 G全改為 0,所以第

一個 pixel 就換變為藍色;p是 GDB命令 print 之意,亦可使

用 p R=0方式改變 R 變數之值;這只是改變一個 pixel 的顏

色,輸入”so ~/draw.txt”可畫出一條藍線且舌頭變藍色,是基

於同樣的原理,draw.txt裡面的內容都是更改某 pixel RGB值

使之變成藍色。

� J part:將所有的 break point刪除掉。

� K part:繼續執行 JPEG程式將所有 pixel 壓縮完後,以

semihosting方式將壓縮完的圖片以寫檔案方式存到 Host端。

78

圖 4-15 JPEG encoder result of after GDB controlling

可以從上圖明顯的看到,左邊是正常沒經過修改的圖,中間是經過把第一

個 pixel 修改成藍色的圖,第一個 pixel 變成藍色的,右邊是執行 draw.txt畫出

一條藍線與把舌頭改成藍色的。

4.6.2 3D graphs SoC 應用程式應用程式應用程式應用程式

經過上述講解如何使用 tool chain之後,此實驗不再累述,而是直接講述使

用 GDB控制流程以及控制之後的結果,此實驗目的主要是使用 write memory

功能將旋轉角度改變,以證明經由 GDB+OpenOCD控制的 EICE可以透過

SYS32TM與其他 IP 溝通。

這例子是 SYS32TM使用 GPU將畫出 texture cube,GPU內部可分為 VS 與

FS,VS 主要工作是將三維頂點座標轉換成二維座標,透過 FIFO將轉換後的二

維座標傳給 FS執行貼圖動作,SYS32TM驅動 GPU的流程如下:

Step 1Set these value on memory for VS:VS_instructionVertex_value

VS_Uniform_value

Step 2 SYS32TM write

VST value(start VS)

Step 3 Set these value on memory for FS:FS_instructionTexture_data

FS_Uniform_value

Step 4 SYS32TM write FST and GPR bank value

(start FS)

Step 5 SYS32TM polling

FS status for checking GPU finish

drawing a graph

圖 4-16 the flow of SYS32TM driving GPU to draw a picture

� SYS32TM驅動 GPU有幾個步驟:

� Step 1:給 VS 的指令、要讓 VS 轉換的頂點資料以及物件呈現出

來的角度(uniform),SYS32TM先將這些資料放在 memory裡面。

� Step 2:SYS32TM驅動 VS 開始讀取 step 1所設定的資料,也就

是驅動 VS 開始運作。

� Step 3:給 FS的指令、要讓 FS貼圖的資料以及如何貼的設定,

SYS32TM先將這些資料放在 memory裡面。

79

� Step 4:SYS32TM告知 FS哪個位置讀取資料,並初始化 FS。

� Step 5:SYS32TM讀取 FS狀態,判斷 FS是否運作完成。

� 在下面的 GDB操作會先將中斷點設定在 Step 2,在 VS 還沒開始作時

候,將物品呈現的角度(uniform)作修改,改而呈現另一種角度

(uniform),下面會對 GDB操作作說明。

圖 4-17 GDB control flow of 3D graphs SoC

80

� A part:GDB連接 OpenOCD。

� B part:透過 OpenOCD幫助,命令 SYS32TM停止。

� C part:設定實驗版(MDK3D)memory組態。

� D part:將 3D graph程式載入實驗版(MDK3D) memory。

� E part:命令 OpenOCD開啟 semihosting功能

� F part:設定中斷點在驅動 VS 開始運作之前,也就是在執行 Step

2之前。

� G part:開始執行 3D graph程式,並遇到中斷點停止。

� H part:修改物件本來要顯示的角度,從角度(uniform)0宿改成角

度(uniform)2(如果沒有修改預設將會顯示角度 0)。

� I part:修改完後移除所有中斷點,並使程式繼續執行,直到程式

結束將結果展示至 CLCD螢幕上。

當結束程式運作後就會將結果展示到 CLCD螢幕上,下圖則是程式執行完

在 CLCD上的結果,左邊是沒有經過角度修改會產生的結果,右邊則是經過角

度修改之後得結果,可以很明顯的看到經過角度修改後的圖明顯旋轉了。

org after modify uniform

圖 4-18 3D graphs SoC result of after GDB controlling

81

Chapter 5 結論結論結論結論與未來發展與未來發展與未來發展與未來發展

在一開始本論文描述了 SoC發展的三個階段,模擬階段、雛型階段以及成

熟階段,雛型階段對週邊元件的開發與除錯對成熟階段架構 Operation System

非常重要,而雛型階段對週邊元件的開發與除錯非常仰賴 debugger與 EICE以

達到控制 CPU對週邊元件讀寫,所以對週邊元件開發前提條件是 debugger與

EICE可以正常運作,然而以往對 debugger與 EICE驗證都是合成成 FPGA再與

debugger相接,一旦發生問題解決的方法就是去猜問題之後再重新合成,非常

的耗費間。

本論文目的就是在減少合成時間以及加入 monitor後會造成的問題,其解

法就是 EICE與 CPU不用再合成成 FPGA才能與 debugger相接,在 RTL

simulation 就可以與 debugger相接,達成驗證目的;實驗部份證明協同驗證平

台是可以運做的,之後將 EICE與 CPU以及週邊元件合成成 FPGA,再與

debugger相接,執行複雜的 Jpeg encoder與 3D SoC graphs證明平台是有效的。

82

Reference [1] I. J. Huang, Tai-An Lu, ”ICEBERG: An Embedded In-circuit Emulator

Synthesizer for Microcontrollers” Proc. of the 36’th Design Automation Conference, June 1998.

[2] OpenOCD: Open On-Chip Debugger, http://openocd.berlios.de/web/, 2006.

[3] Debugger tool chain for ARM, H-JTAG company, http://www.hjtag.com/. [4] embecosm EAN5-JTAGSC, EMBECOSM company

http://www.embecosm.com/, 2006. [5] GNU ARM compiler, http://www.gnuarm.com/, 2004. [6] GDB: The GNU Project Debugger,

http://www.gnu.org/software/gdb/gdb.html, 2006. [7] USB to JTAG converter, FTDI chip Company, http://www.ftdichip.com/,

2004. [8] NS Manju Nath, “On-chip debugging reaches a nexus”, EDN,May 11,

2000, page 95, http://www.edn.com/article/CA46888.html?text=on%2Dchip+and+debugging+and+reaches+and+a+and+nexus.

[9] Mark W. Klingensmith, “Digital System Debug Techniques”, WESCON-IC EXPO, 1997,IEEE, Page(s): 98-120.

[10] IEEE-ISTO 5001™-1999, the Nexus 5001 Forum™ Standard for a Global Embedded Processor Debug Interface, http://www.ieee-isto.org/Nexus5001, 2010.

[11] Dae-Young Jung, Sung-Ho Kwak and Moon-Key Lee, “Reusable embedded debugger for 32 bit RISC processor using the JTAG boundary scan architecture”, Proceedings 2002 IEEE Asia-Pacific Conference on ASIC Aug. 2002.

[12] “IEEE Standard Test Access Port and Boundary-Scan Architecture”, IEEE Std. 1149.1-2001.

[13] A. Wieferink, T. Kogel, O. Zerres, R. Leupers, and H. Meyr, "SoC multiprocessor debugging and synchronisation using generic dynamic-connect debugger frontends", International Journal of Emerging Sciences, 2008, pp.109-118.

[14] Bradford G. Van Treuren and Jose M. Miranda, “Embedded Boundary Scan”, IEEE Design & Test of Computers, Mar. –Apr. 2003, Volume 20 Issue 2, Page 20 ~ 25.

[15] Chih-Wei Chang, D. , I-Tao Liao, Shau-Yin Tseng, Chein-Wen Jen, "PAC DSP Core and Its Applications", Solid-State Circuits Conference, 2006. ASSCC 2006. IEEE Asian, page 19~22.

[16] The ARM7TDMI Debug Architecture, ARM Ltd., http://infocenter.arm.com/help/topic/com.arm.doc.dai0028a/DAI0028A_arm7tdmi_debug_appsnote.pdf, Application Note 28, Dec. 1995.

[17] ARM7TDMI Data Sheet, ARM Ltd., http://www.heeltoe.com/weararm/pdf/ARM7vC.pdf, 1995.

[18] ARM RVDEBUG V1.8 Application, ARM INC., 1995 [19] 孫清華,”JTAG測試原理與應用” ,全華科技圖書股份有限公司,1999,

Chapter 2 [20] Braun, G.; Nohl, A.; Hoffmann, A.; Schliebusch, O.; Leupers, R.; Meyr,

83

H., “A universal technique for fast and flexible instruction-set architecture simulation” IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems, Pages: 1625- 1639, 2004.

[21] Shyh-Ming Huang; Ing-Jer Huang; Chung-Fu Kao , “Reconfigurable real-time address trace compressor for embedded microprocessors”, Proceedings of IEEE International Conference on Field-Programmable Technology (FPT), Pages: 196- 203, 2003

[22] Sang-Young Cho, Yoojin Chung, Jung-Bae Lee. "Virtual Development Environment Based on SystemC for Embedded Systems", Computational Science – ICCS 2007

[23] 俞甲子/石凡/潘愛民,” 程式設計師的自我修養-連結.載入.程式庫,碁峰資訊有限公司” ,2009

[24] 陳柏舟, “ 應用於嵌入式電路擬真器之可參數化的軟硬體控制模組” , 國立中山大學資訊工程研究所碩士論文, 2005

84

Appendix A OpenOCD 架構架構架構架構

在本章節中,我們將會針對 OpenOCD架構做分析與與探討。首先我們會先

針對 OpenOCD這個 open source software的架構與運作流程作探討與分析,並且

針對 OpenOCD幫業界解決了什麼問題以及 OpenOCD對我們實驗室做了什麼貢

獻,為了達到那些貢獻又有什麼困難需要突破。

A.1 OpenOCD 架構與運作流程架構與運作流程架構與運作流程架構與運作流程

前文有提及,OpenOCD可以接受外部藉由 GDB或者 telnet方式來連接與操

控 OpenOCD,如果要了解 OpenOCD首先就要針對 OpenOCD內部六個模組分

別負責什麼工作,以及當使用者藉由 GDB 或者 telnet下命令給 OpenOCD時候

OpenOCD是如何找到相對應的動作來回應使用者所下的命令。

A.1.1 OpenOCD內部模組內部模組內部模組內部模組

在圖 A-1 可以清楚的看到 OpenOCD模組與運作流程,我們首先來談論

OpenOCD裡面的每個模組的功能與特色,OpenOCD主要有六個模組:

F. Daemon:由於 OpenOCD對外與 GDB或者 telnet 溝通的管道皆

是藉由 TCP/IP網路協定方式來溝通,所以在 OpenOCD六個模組中必

定會有一個模組負責監聽網路的傳輸,把屬於 OpenOCD的封包抓進來

OpenOCD處理,而這個模組就是 Daemon 模組,其意義就是常駐於

PC作業系統中監聽屬於 OpenOCD的網路封包,OpenOCD通常開啟

telnet TCP/IP port是 4444,GDB TCP/IP port是 3333,TCP/IP port的選

擇可以透過修改 OpenOCD configure file來達成。

G. OpenOCD GDB server:當使用者藉由 GDB 方式來操控 OpenOCD

時,GDB與 OpenOCD溝通方式是採用 RSP協定來溝通,所以在

OpenOCD裡面一定要有一個模組來解譯從 GDB來的 RSP命令以及組

織 RSP回傳的命令給 GDB;所以 Daemon模組傳來的封包資料組合成

一個完整的命令之後,判斷是屬於 RSP協定,就會將該 RSP命令傳給

OpenOCD GDB server來做解析。

H. OpenOCD CLI server:同理當使用者使用 telnet方式來操控

85

OpenOCD時,也需要一個模組來解譯 telnet協定,所以當 Daemon模

組傳來的封包資料組合成一個完整的命令之後,判斷是屬於 telnet協

定,就會將該 telnet命令傳給 OpenOCD CLI server來做解析。

I. Target:此模組可以說是 OpenOCD裡面最重要的模組,因為針對

對不同的 processor會有不同的 JTAG訊號的設定與取方式,其因是

ICE scan-chain組態不一樣,例如 IR 的長度與 command會不一樣或者

DR 長度也會不一樣,以至於如何針對連接不同 processor,還可以提供

正確的組態來存取,是一個重要的課題,所以 Target模組提供不同且

豐富 processor組態來支援不同的 processor,OpenOCD會依照

OpenOCD configure file內容來決定使用哪個 processor組態,其組態內

容可以細分為兩大類:

3. Target Handle function:處理針對從 GDB來的不同 debug

event對應到相對應的處理函式,主要針對不同的 processor提供

不一樣的 JTAG存取次序。

4. Target HW information:針對不同 processor提供不一樣的

scan-chain組態,例如提供某 processor IR長度與命令或 DR 的長

度等…。

J. JTAG:當組態都設定好之後,真正需要與外部 processor溝通之

時就需要 JTAG模組,主要掌管如何使用 protocol converter的 API 來達

到跟外部 processor溝通的目的。

86

圖 A-1 OpenOCD framework and operation flow graph

A.1.2 OpenOCD 初始化初始化初始化初始化與運作與運作與運作與運作流程流程流程流程

OpenOCD flow可以分為兩個階段,分別是當 OpenOCD開啟時的

OpenOCD initial flow,以及當 OpenOCD initial完之後的 OpenOCD operation

flow。

A.1.2.1 OpenOCD 初始化流程初始化流程初始化流程初始化流程

在 OpenOCD開啟時候必須讀取變參考 OpenOCD configure file,而

OpenOCD configure file必須包含三類的資訊:

1. TCP/IP port information:此設定主要是要讓 OpenOCD知道 GDB

與 telnet連結是會透過 TCP/IP那個 port以方便 OpenOCD來監

聽。

2. processor information:主要讓 OpenOCD知道現在想要連接

processor是哪個 Processor以方便 OpenOCD依照不同的 processor

建立 Target Handle function與 Target HW information。

3. protocol converter information:主要是要讓 OpenOCD知道目前採

用的 protocol converter以方便 OpenOCD使用相對應該 protocol

converter的 driver。

87

當 OpenOCD configure file決定好之後,開啟 OpenOCD,當下 OpenOCD

就會讀取並參考 OpenOCD configure file,將上述三種資訊讀進 OpenOCD裡面

之後將會執行 Daemon模組裡面監聽 TCP/IP port的更新,依照 OpenOCD

configure file決定的 port做監聽的動作,再來會去建立 OpenOCD configure file

裡面指定 processor的 Target Handle function與 Target HW information,最後

OpenOCD會去建立 OpenOCD configure file裡面指定 protocol converter的驅

動。

當以上述三類資訊建立好之後,會針對 processor做 check ID的動作,其目

的在於確認目前連接的 processor是否是 OpenOCD configure file裡面所設定的

processor,詳細流程圖如圖 A-2 所示。

圖 A-2 OpenOCD initial flow

首先開啟 OpenOCD之後,會去讀取給予的 cfg檔,針對 cfg檔設定的 CPU

型號去建立與初始化 target structure,target structure包含如何控制 EICE的所有

處理函式,之後 OpenOCD會去檢查硬體 id code以確定建立的 target structure

是否適用在該硬體上,最後當檢查通過後,OpenOCD再去執行必要的硬體初始

化或者獲得硬體目前的狀態。

A.1.2.2 OpenOCD 運作流程運作流程運作流程運作流程

當 OpenOCD initial flow完成之後 OpenOCD將會進入 operation mode等待

外部 GDB或者 telnet藉由 TCP/IP方式的連接,當有外部連接 OpenOCD時

Daemon會依照 port number來判斷目前連接的是 GDB還是 telnet,下列分成

GDB連接與 telnet連接來說明 OpenOCD的 operation mode,其流程如圖 A-1 所

88

示:

GDB連接 OpenOCD:當 Daemon判斷是 GDB連接後,會將封包傳遞給

OpenOCD GDB server解譯 RSP訊號(G1G1G1G1),得出 RSP命令後,呼叫相對應在

Target模組裡的 Target handle function(G2G2G2G2),Target handle function會去參考

Target HW information(G3G3G3G3),之後 Target handle function會呼叫在 JTAG模組裡

面 core的 IR 或者 DR scan來達成 RSP的命令(G4G4G4G4),JTAG模組裡面 core再將

接收到的 IR 或者 DR scan轉成一連串了 API 來控制 ft2232d(G5G5G5G5)

telnet連接的 Data flow:當 Daemon判斷是 telnet連接後,會將封包傳

遞給 OpenOCD CLI server解譯 telnet訊號(T1T1T1T1),得出 telnet命令後,呼叫相對

應在 JTAG模組裡 Tcl.c的 handle function(T2T2T2T2),handle function會去呼叫在 JTAG

模組裡面 core的 IR 或者 DR scan來達成 telnet的命令(T3T3T3T3),JTAG模組裡面 core

再將接收到的 IR 或者 DR scan轉成一連串了 API 來控制 ft2232d(T4T4T4T4)

A.2 ITRI’s Project – PACDUO((((高效能高效能高效能高效能平行架構核心採用平行架構核心採用平行架構核心採用平行架構核心採用

ARM9 以及以及以及以及雙雙雙雙 DSP為為為為發展平台發展平台發展平台發展平台))))

在這節中我們將會專注說明工研院所委託的專案工研院遇到什麼困難,以及

我們如何找到問題的徵結點,首先一開始我們換先描述工研院PACDUO的平台,

接下來會說明工研院委託的內容,最後會描述如何找出問題的徵節點與解決之後

的結果。

A.2.1 PACDUO [15]

PACDUO 是工研院近幾年來研發的項目之一,屬於異質多核心的平台,在

PACDUO系統裡面有一顆 ARM 9ejs以及兩顆工研院研發的數位訊號處理器 (稱

作 PACDSP),其架構圖與外觀如圖 A-3 與 A-4 所示。

總共有三條 BUS分別是 AXI、AHB 以及 APB,在 AXI BUS 上的 IP 主要有

兩個工研院自行開發之 PACDSP,以及 PACDSP運作時應付 PACDSP資源飢渴

的 DDR RAM 和 SDRAM,並有 BUS bridge連接 AXI 與 AHB 以使用 AHB BUS

上面的資源;AHB BUS上有的 IP 是 ARM9ejs、FLASH、LCD、camera…等等比

較常見且對傳輸頻寬要求沒那麼渴望的裝置,並有BUS bridge連接高速BUS AXI

以及低速 BUS APB;APB BUS主要的 IP 都是一些低速 IP,例如 UART,也有

連接到 AHB BUS bridge。

89

圖 A-3 PACDUO architecture

圖 A-4 PACDUO view

如圖 A-4,可以看到整個發展平台的輸出入,其中 ARM ICE port與

90

PACDSP ICE port,就是 OpenOCD透過 adapter (ft2232) 連接的 JTAG port,達

到控制 ARM9 與 PACDSP之效果。

A.2.2 PACDUO 除錯效能與使用除錯效能與使用除錯效能與使用除錯效能與使用 GDB 控制問題控制問題控制問題控制問題

工研院 PACDUO主要有兩個問題,其一:由於如何有效降低 Debug

Hardware Cost,同時提昇 Debug performance且採用 USB介面,另外在維護及

更新觀點上要能持續精進及發展,並且容易擴充功能及彈性的相容於

Microprocessor或 DSP Debug,所以使用新的 protocol converter ft2232d替原本

protocol converter轉換板 OkBoard,軟體方面也要跟著改變,必須由 OpenOCD

取代配合 OkBoard的軟體即 USB_driver,然而在更改的過程中工研院發現在

OpenOCD實現的 load program速度沒辦法達到原本 USB_driver的 load program

速度;接下來會先介紹一下 OpenOCD與 USB_driver的差別,再列出可能的問

題關鍵點,針對哪些關鍵點做解法,最後在將修改完的程式做測試與驗證。

其二:由於 OpenOCD裡面 Target模組並不支援 PACDSP processor,以至於

無法透過 GDB 來控制 OpenOCD,為了使用圖形化介面 Eclipse可以透過 GDB

控制 OpenOCD,所以必須在 Target 模組裡面新增 PACDSP的 Target Handle

function以及 Target HW information。

A.2.3 尋找尋找尋找尋找 PACDUO 問題所使用問題所使用問題所使用問題所使用的的的的方法方法方法方法

在速度方面,因為想要使用 OpenOCD取代 USB_driver,但是 OpenOCD

速度不及 USB_driver,所以自然的會去想要比較 OpenOCD與 USB_driver差

別,在開始說明差別之前,我們會先簡單描述簡易的 OpenOCD與 USB_driver

的運作流程,之後依照運作流程比較出差別後,依據這些差別來規劃比較的方

位。如圖 A-5 所示,上半部是 USB_driver簡易的運作流程,USB_driver從

GDB接收 RSP訊號經過 USB_driver解譯 RSP的訊號後,再去呼叫 OkBoard的

API 對 OkBoard下命令,把 RSP透過 OkBoard以 JTAG訊號方式跟外邊的

PACDUO溝通;同理下半邊是 OpenOCD簡易的運作流程,OpenOCD從 GDB

接收 RSP訊號經過 OpenOCD解譯 RSP的訊號後,再去呼叫 ft2232的 API 對

ft2232下命令,把 RSP透過 ft2232以 JTAG訊號方式跟外邊的 PACDUO溝

通。

91

圖 A-5 the different between OpenOCD and USB_driver

從圖 A-5 中 A line 可以看出來 OpenOCD與 USB_driver差別在於 API 使用

的層級不同,USB_driver呼叫 API時只要傳送 IR 或者 DR資料給 API 就可以了,

而 OpenOCD使用的 API 是會直接去控制 JTAG的信號,也就是說 OpenOCD所

使用的 API 控制較 USB_driver底層,然而 USB_driver所使用的 API 不是 open

source 的,在維護及修改功能過程中很容易受到限制,所以比較點上以

USB_driver使用 API 層級來做比較的基準點也就是 A line;另一不同點在於使用

的轉換板不一樣,所以 B line與 C line也是比較的對象。

在 OpenOCD與 GDB連接方面必須新增 PACDSP的 Target Handle function,

所新增的 function如 Table 1所示,左欄是從 GDB 來的 RSP命令,右欄是 RSP

命令對應到的 Target Handle function,如果要將 OpenOCD可以接受從 GDB來的

命令,即是要將 Table 1的 function全部都實現。

RSP command function name

H Initial()

g read_regs()

P Write_regs()

m read_memory()

M write_memory()

s Step()

c Resume()

? Poll()

Z0 add_breakpoint()

z0 remove_breakpoint()

Z1 add_watchpoint()

92

z1 remove_watchpoint()

F Semihosting_end()

M load program()

表 A-1 Target Handle function list

A.2.4 PACDUO 問題解決與最後結果問題解決與最後結果問題解決與最後結果問題解決與最後結果

當初接下工研院案子時 USB_driver Load speed 是 30kb/s而 OpenOCD只

有 8kb/s,預估問題在於傳輸是有 bug,所以切成以下抽象層次由上而下的 4個

問題關鍵點:

I. 圖 A-5 從 A line 比較 USB_driver與 OpenOCD write memory

function,由資料傳輸量進行評估。

II. 在圖 A-1tcl.c所使用的 API 是否比較沒效率(不需要 scan_in卻使

用 scan_inout的 API)。

III.在圖 A-5B line比較 USB_driver與 OpenOCD傳出去的 USB訊

號,是否 OpenOCD USB設定 ft2232比較沒效率。

IV. 在圖 A-5C line比較 USB_driver與 OpenOCD傳出去的 JTAG訊

號,是否 OpenOCD JTAG訊號比 USB_driver多傳了不必要的訊

號。

綜合以上關鍵點是由抽象層次(操作流程)由上而下分析出來的問題關鍵

點,只要由上而下解了其中一個問題關鍵點,則下層大致沒有問題,我首先選

擇解決上面關鍵點 I,觀察 USB_driver與 OpenOCD的 write memory function,

結果如下:

OpenOCD部份:

irscan :0

irscan :6 //把 scan chain切到 MSU

drscan :0x9:addr //設定寫入的位址

drscan :0xA:data //設定寫入的資料

drscan :0xC:0x00000020 + mask //設定資料的 mask與觸發 write_mem

//執行

drscan :0xb:0x00000000 //將 read data的 scan清空

drscan :0xC:0x00000000 + mask //結束 write_mem觸發

USB_driver部份:

WriteJtagInstr(xem, 0x06); //把 scan chain切到 MSU

WriteDR36(xem, 0x01, W_Addr); //設定寫入的位址

WriteDR36(xem, 0x02, W_Data); //設定寫入的資料

93

WriteDR36(xem, 0x04, 0x2f); //觸發 write_mem

WriteDR36(xem, 0x04, (0x20|mask));//設定資料的 mask

WriteDR36(xem, 0x03, 0x0); //將 readdata的 scan清空

WriteDR36(xem, 0x04, 0x0f); //結束 write_mem觸發

WriteDR36(xem, 0x04, mask); //設定資料的 mask

結論:表達方法不一樣,但是實際上的動作差不多。

接下來,選擇問題關鍵點 II,修改 tcl.c的 load function使用的 API,將不

需要 scan_in的 scan command使用的 API 從 scan_inout改成 scan_out。

結果:確實改善 load speed,在 TCK 6M 情況下,load speed可達到 30kb/s

以上,並且我們將一系列的 PACDUO開發版做測試,以確定每個版本均可達到

30kb/s以上的速度,結果如 Table 2所示。

PACDUO

version

Protocol converter TCK speed

(HZ)

Load speed(kb/s)

V2.0 External ft2232h 30M 120

V2.0 External ft2232h 3M 100

V2.0 External ft2232d 3M 28

V3.1 Internal ft2232d 6M 31

V3.1 Internal ft2232d 3M 27

表 A-2 testing result

第一欄是不同的 PACDUO板本,V2.0是沒有 protocol converter ft2232晶片

在上面,需要外接的 protocol converter ft2232,但是較 V3.1穩定;V3.1上有

protocol converter ft2232晶片在上面所以不需要外接 protocol converter ft2232只

要插入 USB port就可以了,穩定性較 V2.0差。第二欄是不同的 protocol

converter,可分成三種,高階的 ft2232h、低階的 ft2232d以及焊在 PACDUO實

驗板上的 ft2232d;ft2232h提供較快得 TCK 速度(至少有 30MHZ)以及支援

RTCK機制,ft2232d最高 TCK 速度只有 6MHZ 且沒有支援 RTCK。第三欄是

選擇不同的 TCK 速度測試,有 30MHZ、6MHZ 和 3MHZ 可以選擇。第四行是

測試出來的 load speed。

我們亦參考由第三方 YAGARTO 測到的 Load speed說明已到達 ft2232dLoad

speed所能達到的極限,如 Table 3所示,Table 3顯示 YAGARTO 所做的測試,

連接 STR7 USB-MSDboard,第一欄顯示使用不同的轉接板 FT2232指的就是

ft2232d而 FT2232-fast指的就是 ft2232h,第二欄顯示不同的 TCK 速度,第三

行顯示 YAGARTO 測試出來的 Load speed,由上面結果來看,我們對 Load

94

function做的改良已趨近 ft2232d的 Load speed極限(26kb/s),如果還要提昇速

度,就只有換比較高階的轉換板也就是 ft2232h。

表 A-3 ft2232d Load speed from YAGARTO

95

Appendix B EICE_control_event/JTAG 轉換器說明轉換器說明轉換器說明轉換器說明

此章節目的介紹 JTAGSC也就是 EICE_control_event/JTAG signal converter,

其目的在於將 OpenOCD透過 shared memory傳來的 EICE control event轉換成

JTAG序列(TDO、TDI、TMS 與 TCK)的表示方式,在進一步的與 RTL 執行協

同模擬;反之若有 TDO從 RTL 方面回來 converter,他會將以 JTAG序列表示的

資料整理成 16進位資料型態透過 shared memory方式傳回給 OpenOCD。

會依照下列 introduce JTACSC、the file list of JTACSC、the operation flow of

JTACSC等三個章節來介紹 JTACSC。

B.1 JTAGSC 介紹介紹介紹介紹

此 JTAGSC是參考 related work [11] (embecosm EAN5)而來的,提供 Reset、

IRScan和 DRScan API給使用者使用,由 SystemC程式碼組成,基本上無法直接

在 Platform Architect上使用,使用者可以藉由簡易的 API 使用,達成把 Reset、

IRScan和 DRScan的 EICE control event轉換成 JTAG訊號,以下簡介 API 的用

法與結果。

Reset()函數 EICE control event用法:

圖 B-1 JTAGSC reset code example

#3:宣告 SystemC event的指標,並指到新創的 event物件(SystemC

本身就有的)。

#4:宣告 Reset event的旗標。

#6:宣告 Reset 旗標指向新創的 Reset物件,並把 SystemC event當

作參數,好讓 Reset event完成後可以透過 SystemC event通知事件完

成。

#7:將 Reset event寫入佇列裡面,等待執行。

#8:等待 Reset event執行完後再往下執行別的程式碼。

#9、10:刪除之前宣告的物件。

IRScan()函數 EICE control event用法:

96

圖 B-2 JTAGSC IRScan code example

#3:宣告 SystemC event的指標,並指到新創的 event物件(SystemC

本身就有的)。

#4:宣告 IRScan event的旗標。

#6:宣告 IRScan旗標指向新創的 IRScan物件,其中有三個參數說明

如下:

� actionDone:SystemC event當作參數,好讓 Reset event完

成後可以透過 SystemC event通知事件完成。

� CHAIN_SELECT_IR:欲將 scan到 RTL IR Scan Chain的

資料。

� JTAG_IR_LEN:RTL IR Scan Chain的長度。

#7:將 IRScan event寫入佇列裡面,等待執行。

#8:等待 IRScan event執行完後再往下執行別的程式碼。

#10:刪除之前宣告的物件。

DRScan()函數 EICE control event用法:

圖 B-3 JTAGSC DRScan code example

#3:宣告以 64Bit 為長度的變數,並指定初值為 0x4。

#4:宣告 SystemC event的指標,並指到新創的 event物件(SystemC

本身就有的)。

#5:宣告 DRScan event的旗標。

#7:宣告 DRScan旗標指向新創的 DRScan物件,其中有三個參數說

明如下:

� actionDone:SystemC event當作參數,好讓 Reset event

完成後可以透過 SystemC event通知事件完成。

97

� dReg:欲將 scan到 RTL DR Scan Chain的資料,此

例就是 0x4。

� DrLen:RTL DR Scan Chain的長度。

#8:將 DRScan event寫入佇列裡面,等待執行。

#9:等待 DRScan event執行完後再往下執行別的程式碼。

#11、12:刪除之前宣告的物件。

到此,JTACSC介紹到此結束,此章節簡單介紹關於 JTACSC的基礎用法,

下一章節將介紹 JTACSC file list 的組成,以及關於要做些怎樣的變更才能使

Platform Architect上能使用。

B.2 JTAGSC檔案目錄列表與編成元件可在檔案目錄列表與編成元件可在檔案目錄列表與編成元件可在檔案目錄列表與編成元件可在 SC-RTL 協同模協同模協同模協同模

擬平台使用擬平台使用擬平台使用擬平台使用

此章節分成兩小章,分別介紹 JTACSC內的檔案構成,以及了解檔案構成後,

基於怎樣的想法將 JTACSC改寫成可以在 Platform Architect使用。

B.2.1 JTAGSC 檔案目錄與結構檔案目錄與結構檔案目錄與結構檔案目錄與結構

此章將介紹 JTAGSC 檔案組成,將逐一說明每個檔案的作用,檔案列表如

下:

|-JtagSC.cpp(.h)

|-TapAction.cpp(.h)

|-TapActionDRScan.cpp(.h)

|-TapActionIRScan.cpp(.h)

|-TapActionReset.cpp(.h)

|-TapStateMachine.cpp(.h)

|-Makefile

JtagSC.cpp(.h)是主要驅動整個 JTAGSC 運作的檔案,上一章節的 Reset、

IRScan和 DRScan的 EICE control event就是撰寫在此檔案裡面的 JtagSC::driver()

裡面,在模擬開始時就會去讀取 JtagSC::driver()裡面的 EICE control event,轉成

JTAG序列與 RTL 模擬,TapAction.cpp(.h)主要宣告實做 JTAGSC所會用得到元

件,例如 virtual boolprocess()的原型宣告,此原型宣告會被實做在個別的 API 裡

面,即 TapActionDRScan.cpp、TapActionIRScan.cpp和 TapActionReset.cpp此三

個 API 檔案都會實做 process()裡面的內容,而此三個 API 檔案主要工作在決定

98

模擬時當下每一個 TCK cycle所要傳送的 TDI 和 TMS,TapStateMachine.cpp(.h)

主要掌管 TAP FSM移動的資訊,即紀錄當下 RTL 裡面 TAP FSM走到什麼狀態,

和往某個特定的狀態前提下,TMS 要為多少,而 Makefile則是將上述的這些檔

案編譯成連結檔,以方便使用者呼叫與使用。

下圖為上述這些實做 converter的檔案的關聯圖,以及檔案間互相的關係:

圖 B-4 JTAGSC file relation

如上圖 B-4 所示,TapStateMachine提供紀錄目前 RTL 的 TAP FSM機制以

及 TAP FSM移動的機制,當成 API 提供 TapActionDRScan、TapActionIRScan、

TapActionReset給 JtagSC使用。

TapAction 裡面宣告的是最基礎的類別,提供給 TapActionDRScan、

TapActionIRScan和 TapActionReset繼承最主要是宣告 process() 函數的原型。

TapActionDRScan、TapActionIRScan和 TapActionReset等三個 API file 繼承

TapAction,主要目的在於實做 process() 函數,主要功能是描述此三個 API 在每

一個 TCK cycle該如運作,另外此三 API file 也將 TapStateMachine當成如何移

動 TAP FSM 的 API 使用,此三個檔案主要是實現 TapActionDRScan()、

TapActionIRScan()和 TapActionReset()函數的檔案。

JtagSC主要內容是如何驅動 JTAGSC的方法以及 IRScan、DRScan和 Reset

的 EICE control event 就放置在此檔案內。

B2.2 JTAGSC 如何可以被當成元件在如何可以被當成元件在如何可以被當成元件在如何可以被當成元件在 SC-RTL 協同模擬平台上協同模擬平台上協同模擬平台上協同模擬平台上

使用使用使用使用

在此章會介紹如何將 JTAGSC在 Platform Architect上使用;原先 JTAGSC只

99

能做一般的 SystemC模擬,並不能在 Platform Architect上當作一般的 libary 使

用,為了達到此目的我們必須做一些修改使得 JTAGSC可以在 Platform Architect

上使用。依據上一章節有關描述 JTAGSC架構的說明,其實 TapActionDRScan、

TapActionIRScan和 TapActionReset不常被修改,反而 EICE_control_event組成內

容經常被改變,基於這樣的想法,將 JtagSC與其他的檔案分開編譯是比較合適

的 , 也 就 是 說 TapActionDRScan、 TapActionIRScan、 TapActionReset、

TapStateMachine和 TapAction 會先被編譯成動態連結檔,再由 JtagSC裡面的

pattern 呼叫動態連結檔裡面的 API,而 JtagSC會被加入 Platform Architect元件

裡面當成眾多元件之一,擔任 OpenOCD與 RTL simulation 溝通的介面。

所以接下來有兩件事情要做:

� 使用 Platform Architect從外部將 JtagSC加入,成為元件之一

� 將 JtagSC除外的所有檔案編譯成動態連結檔

欲達成此目的,我們要去修改 Makefile,修改如下:

圖 B-5 file list need to be compiled

將 Makefile修改成向上圖一樣,將 JtagSC.o移除掉,如此一來 make之

就可以編譯成檔名為 libjtagsc.a的動態連結檔,並將此動態連結檔移到

Platform Architect編譯模擬平台時會去參考的動態連結資料庫裡面,如下兩

個路徑:

� /CADtools/Platform Architect/V2010.1.1/PAMD/linux/gnu/gcc-

3.4.4/lib

� /CADtools/Platform Architect/V2010.1.1/PAMD/linux/common/lib-

any

如此一來當 Platform Architect編譯模擬平台,編譯完成後,在連結階段,

位於 JtagSC裡面的 EICE control event,就會自動去搜尋上述資料庫裡面的

libjtagsc.a動態連結檔,以實現 IRScan、DRScan和 Reset的功能。

B.3 JTAGSC運作流程運作流程運作流程運作流程

有了 JTAGSC的基礎認識之後,在這章節會介紹 JTAGSC細部運作原理、

流程,將會講解 JTAGSC內部程式碼的解釋;其順序會以 JtagSC最先介紹,在

之後是 TapActionDRScan、TapActionIRScan、TapActionReset等三個 API 檔案,

最後是基礎構成檔案的 TapStateMachine。

100

B.3.1 JtagSC.cpp and JtagSC.h

此小章會說明 JtagSC.cpp和 JtagSC.h需要注意的部份,例如從哪邊描述有

幾個輸出、輸入阜,以及驅動整個 JTAGSC運作的流程的程式碼,最後是 EICE

control event 要放置在哪裡。

� JtagSC模組輸出、輸入阜宣告:

圖 B-6 input and output port of JtagSC

� 上圖是 JtagSC.h裡面的一段 code,主要描述當 JtagSC放入 Platform

Architect當成 libary後,總共有多少個阜,即共有三個輸出阜和兩

個輸入阜,分別是 TDI、TMS、TRST和 TCK、TDO。

� JtagSC模組初始化:

圖 B-7 initail part of JtagSC

� 上圖是 JtagSC的建構式,#94是產生 SystemC內建的 FIFO元件,

當由運用 TapActionDRScan()、TapActionIRScan()、TapActionReset()

三個 API 函數所構成的 pattern 要運做在 RTL 時,會先把 pattern

寫 入 該 tapActionQueue FIFO 之 內 , 之 後 執 行

SC_METHOD(processActions)由 processActions()把 tapActionQueue

FIFO 裡 面 pattern 讀 出 來 後 , 依 照 TapActionDRScan、

101

TapActionIRScan、TapActionReset API檔案的描述將 pattern 轉成

JTAG序列訊號。

� #95是創造一個 TapStateMachine的物件,主要目的在於紀錄 RTL

目前的 TAP FSM移動到哪個狀態,以及提供 RTL TAP FSM移動

到特定某個狀態的方法。

� #97 和#98 的目的在於執行 processAction()這個函數,此函數作

用在於把 FIFO的 pattern 讀出來後,依照不一樣的 pattern 讀取相

對應的 API,將 pattern 轉成 JTAG 序列;converter的運作方法就

寫在該函數裡面。執行該函數的頻率以 TCK 為依據,當 TCK 上緣

觸發時就會執行一次。

� #101和#102主要是執行 driver()函數,主要給 RTL 模擬的 EICE

control event 是撰寫在此函數裡面,其觸發方式是第一個 TCK 上

緣觸發後就一直執行到整個模擬結束,而不是每一次上原處發就執

行一次;因為所有的 EICE control event只需要執行一次就可,不

必重複執行,所以才選擇使用 SC_THREAD()的方法,不像

processAction()這個函數它負責 JTAGSC的架構運轉,所以需要重

複的執行來確定每一個 TCK cycle下的 TMS 與 TDI 的值,基於這

樣的理由才採用 SC_METHOD()的方法。

� JTAGSC運作(由 processAction()函數負責):

102

圖 B-8 JTAGSC operation flow

� 上圖是 JTAGSC運作程式碼,每當 TCK上緣觸發時都會執行一次,

以確定當下的 TCK cycle下 TMS 和 TDI 輸出數值,順便讀取 TDO

的值。

� #184和#185宣告當下 TCK cycle想要給 RTL模擬的 TMS和 TDI

值,在此地方只是宣告,並不表示當把值給 tms_o和 tdi_o後就相

當於真正的 TMS 和 TDI 輸出。

� #187~197目的在於讀取之前提到的 tapActionQueue FIFO;先判

斷是否已經把之前的 TapAction 做完(就是判斷 currentTapAction

是否為 null),換句話說就是判斷當下要給在 RTL 模擬的 EICE

control event 是否完成,若完成則讀取下一筆 event ,反之則不讀

取,繼續把未做完的 event 完成。

� #200~#204目的在於運作 API 決定當下的 TMS 與 TDI 並接收

TDO的訊號;currentTapAction所指向的 process()函數就是每個API

103

運作的核心,原型宣告在 TapAction 檔案裡面,實做的描述在

TapActionDRScan、TapActionIRScan和 TapActionReset API檔案裡

面,要開發 API 檔案則要去繼承 TapAction類別,所以當#200行

執行時會得知當下TCK cycle所需要的TDI 與TMS並暫存在 tms_o

和 tdi_o裡面,return為 true時表示 EICE control event已做完,所

以在#201 與#202 分別通知 SystemC事件已完成,以及把

currentTapAction指標清空,表示目前 event 已完成,下一次執行

processAction()時可以把新一筆的 event讀進來,return為 false時

表示該 event還未完成,下一次執行 processAction()時在一次運作

process()函數以得知下次的 TMS 與 TDI。

� #207是當決定 TDI 與 TMS 並暫存在 tms_o和 tdi_o裡面後,先更

新 JTAGSC裡面 stateMachine物件,該物件目的在於紀錄 RTL TAP

FSM以及接下來 RTL TAP FSM會停在哪個狀態上。

� #210與#211則是依據 tms_o和 tdi_o去驅動 JTAGSC的 TMS 與

TDI 訊號阜給 RTL 執行模擬。

所以依據上面的說明,可以將這些流程用圖形表示,可以更加清楚的了解

converter的運作。processAction()函數運作圖如下:

Execute API process() function

Read next event from

FIFO

YES

Current event is finish?

NOFor getting TMS

and TDO of current TCK cycle

Set currentTapAction=

null

API return true

API return false

By ref.

currentTapAction(null:event is finish)

Update stateMachine and

active JTAG signal to RTL

圖 B-9 working flow chart JTAGSC operation flow

首先依照 currentTapAction是否有值來判斷目前 EICE control event 是否結

束,若是,則先去讀取 tapActionQueue FIFO把下一筆 event讀出來,再執行 API

104

得到當下 TCK cycle對應的 TMS 與 TDI 的值,依據執行 API 後 return的值來判

斷目前 event是否結束,若是,則設定 currentTapAction為 null,以方便下一次執

行processAction()函數時,判斷是否需要從 tapActionQueue FIFO讀出新的pattern,

最後則驅動 JTAGSC訊號作給 RTL 模擬。

圖 B-10 example of JTAG EICE control event

上面的程式碼是位於 JtagSC.cpp裡面的driver() 函數,要與RTL模擬的EICE

control event就是撰寫在這裡,上面程式碼的範例就是依序執行 Reset,之後執

行 IR scan將 0xE的指令下給 RTL EICE,最後執行 DR scan,將 128 bit全為 0

的資料打進 RTL DR scan chain裡面,並將 scan out的資料讀出來;其中

tapActionQueue->write ();就是將 event 寫入 tapActionQueue FIFO,並由

processAction()函數來讀出,並呼叫API處理,wait(*actionDone)就是等單筆event

完成的指令,當 processAction()函數執行 currentTapAction->getDoneEvent()-

>notify();後,就是通知 driver()裡面的 wait(*actionDone);此 pattern已完成,可以

繼續把下一筆 pattern寫入 FIFO了。

B.3.2 JTAGSC API 運作流程運作流程運作流程運作流程

此章會描述 TapActionDRScan()、TapActionIRScan()、TapActionReset()三個

API 函 數 如 何 實 做 , 實 做 部 份 在 TapActionDRScan.cpp(.h)、

105

TapActionIRScan.cpp(.h)、TapActionReset.cpp(.h)此三個 API 檔案上;由 B.2節可

以看到,此三個檔案繼承 TapAction的類別並且實做 process()這個函數;每當執

行 API 時就會執行 process()函數(如圖 B-7#200所看到的,看當下的 event是

IR、DR 或是 Reset pattern,執行實做內容不同的 process()函數),所以會將此章

節的重點擺放在此三個 API 檔案如何實做 process()這個函數。

TapActionReset:其 process()函數主要實做成連續 5 個 TCK cycle,TMS 均

為 1,讓 RTL TAP FSM重新移動到 Test-Logic-Reset,reset RTL Tap control。

TapActionDRScan、TapActionIRScan:主要運作架構如下圖

圖 B-11 flow chart of IR or DR working flow

此兩個 API 檔案實做的 process()函數架構主要分三個階段:

� SHIFT PREPARING:準備要執行 scan shift 動作,即是將 TAP FSM

移動到 Shift-DR或 Shift-IR,準備將資料或是指令 scan到 scan chain

裡面,當移動到 Shift-DR 或 Shift-IR 後,就會執行第二階段—

SHIFTING,此階段內 return都是為 false,表示該單筆 pattern還未

完成。

� SHIFTING:TMS 均為 0,將指令或資料寫入 IR 或 DR scan chain

裡面,並且將 TDO回來的值記錄下來,當把指令或資料完整 scan

進 IR 或 DR scan chain後,將會移動到下一個階段—SHIFT

UPDATING,此階段內 return都是為 false,表示該單筆 pattern還

未完成。

� SHIFT UPDATING:當把指令把資料 scan完畢後,就會從 Shift-DR

或 Shift-IR 移動到 Update-DR或 Update-IR,將指令或資料更新,

當 TAP FSM state移動到 Update-DR或 Update-IR就會 return true

106

表示單筆 pattern已完成。

當執行 API 時就會執行 process()函數,而執行 process()函數就會執行上述的

process()架構流程一步,至於如何決定 TMS 與紀錄 RTL JTAG state的辦法將在

B.3.3節 TapStateMachine and TapAction介紹。

B.3.3 TapStateMachine

這裡會介紹基礎元件,例如如何紀錄 RTL TAP FSM和如何移動 TAP FSM

state的方法,在圖 B-7 可以看到當 JtagSC初始化的時候會創造 tapStateMachine

的物件,此物件裡面有個 state 變數就是用來紀錄 RTL TAP FSM;當執行

stateMachine->nextState (tms_o);時,就可以改變 state狀態值,其意義是依據接下

來的 TMS 值來更改 state變數後,再將 TMS 作用在 RTL 上(如圖 B-7#207~#

211),其更改 state機制如下圖程式碼:

圖 B-12 TAP FSM decision table

此機制主要分成兩大塊陣列—#99 的 TMS=1 的移動陣列以及#103 的

TMS=0的移動陣列,在#108行主要判斷目前 TMS為 0還是 1,依照不同的 TMS

值參照相對的移動陣列以更新 state。

上述已說明如何紀錄與更新 RTL TAP FSM,接下來說明如何決定 TMS,程

式碼如下:

107

圖 B-13 TMS decision table

決定 TMS 的方法是用一個二維陣列來描述,將目標 state與 TMS 當參數,

由#151參照在#129的二維陣列決定 TMS為何值,當目前 state移動到目標 state

後就會 return true,表示目前已移動到目標 state。

這陣列的用法是先從右邊的註解看,例如 map[RTI][X]的那一列,指的就是

從 Run-Test/Idle移動到個別 state所需要的 TMS 值,例如 map[1][0]=1 就是

map[RTI][TLR],從 Run-Test/Idle到 Test-Logic-Reset第一次的 TMS 要為 1。

所以給個簡單的範例來了解如何使用 map 這個陣列,假設目前 state停在

Run-Test/Idle,目標是 Shift-DR:

� map[RTI][SDR]=map[1][4]=1,TMS 為 1,return false表示還未移動到目

標 state,進行一個 TCK cycle,state更新到 Select-DR-Scan,。

� map[SDRS][SDR]=map[2][4]=0,TMS 為 0,return false表示還未移動到

目標 state,進行一個 TCK cycle,state更新到 Capture-DR。

� map[CDR][SDR] = map[3][4]=0,TMS 為 0,return false表示還未移動到

目標 state,進行一個 TCK cycle,state更新到 Shift-DR。

� map[SDR][SDR] = map[4][4]=0,TMS 為 0,return ture表示還已移動到

目標 state,進行一個 TCK cycle,state停留在 Shift-DR。

108

Appendix C 藉由協同驗證平台所找到的藉由協同驗證平台所找到的藉由協同驗證平台所找到的藉由協同驗證平台所找到的 OpenOCD

與與與與 EICE 錯誤錯誤錯誤錯誤

此章附錄會描述我們使用 co-verification platform找到哪些 OpenOCD高階除

錯命令與 EICE 之間的 bugs,這些 bugs發生的主要原因都是由 OpenOCD來的

EICE control event內容錯誤,或者 EICE本身狀態更新規則有錯,導致 OpenOCD

無法得知 EICE狀態,

C.1 SYS32TM 無法被停止無法被停止無法被停止無法被停止

在表 4-4項目 2,要停止 CPU主要動作是要將 BDU 組態設為馬上拉高

break訊號,當 CPU收到 break拉高之後,會馬上停止運轉將運轉的控制交給

embedded ICE,BDU 組態設定方法就是將 address mask與 data mask都設為

0xffff_ffff ,意義是現在不管監測到何種 data或者 address馬上視為符合條件將

break訊號拉高給 CPU通知 CPU將運轉控制權交給 ICE管理,我們稱之為將

CPU停止。

sc2

TDI

TDO

BDU

R/Waddrdata

Address mask

data mask

Address value

data value

ctrl value

ctrl mask

Status_reg

decoder

Break(to CPU) CPU

GCU

Break_ackICE_Break

CLK

EICE

圖 C-1 EICE architecture

上圖為 EICE簡易架構圖,主要有 BDU 模組,負責監測 CPU執行,BDU

內部設定(例如 Address valus, data value…負責觀測條件設定的數值)均由 scan

chain 2設定,當一設定好之後,BDU 就會進行觀測 CPU運作,只要觀測條件

成立(例如 meet break point)就會拉高 Break訊號命令 CPU停止,CPU停止之

109

後會拉高 Break_ack通知 GUC模組,GCU模組是負責管理現在 CPU是參考系

統時脈運作或是參考 TCK 在運作,GCU模組收到 Break_ack之後就會把 CPU

運作時脈從系統時脈切換至 TCK 並由 EICE控制 CPU(進入 debug mode),並

更新 BDU 內部 status_reg。

當 CPU確認運轉控制權可以交給 ICE管理變會將 Break_ack拉高通知

GCU模組,GCU模組是負責控管現在 CPU運轉權是由外部 wrapper來控制還

是 ICE來控制,當 GCU收到 Break_ack拉高便會將運轉控制權交由 ICE控

制,並且拉高 ICE_Break通知整個 EICE模組現在控制權在 ICE(已進入 debug

mode),並且更新 BDU Status_reg以便 OpenOCD得知已進入 debug mode。

sc2

TDI

TDO

R/Waddrdata

decoder

BDU

ICE_Break

Dstatus

R/Wdata[4:0]

ENStatus_reg

UpdateStatus_val

1111

2222

圖 C-2 scan chain2 connection with BDU before modification

OpenOCD如何取得 debug_status?首先 OpenOCD先將 scan chain選擇掉二

條 scan chain 2,也就是 SC2,之後下讀取 status的序列(R/W=0,

address=status_addr, data=0x0),之後 TAP FSM經過 UPDATE-DR將序列作用於

硬體上,此時 status_val已在 sc2上面,再對 sc2作 scan動作就可取得當下的

status_val數值。

可是在現有硬體設計上有兩點問題:

1. 當 decode選到 status_reg(當 Dstatus為 1),如果 status_valus要

更新必須從 sc2來的 R/W bit為 1;也就是說 JTAG序列必需下寫

入 status_reg的序列 status_reg才會更新 status_val,但是

status_reg的作用是讓驅動 JTAG序列的外部軟體(OpenOCD)知

道目前 CPU環境,不該會有寫的動作發生,所以當寫才更新是錯

誤的,應該讀的時候就要更新。

2. 當 status_reg更新 status_val的時候更新來源是從 sc2來的 data而

非外部來的 ICE_Break,如此會讓外部軟體一直不知道實際外部

的 ICE_Break,這關係著能否告知外部軟體 CPU的運轉權是否在

ICE,只有當運轉權落在 ICE,外部軟體才能透過 JTAG序列控制

CPU。

110

sc2

TDI

TDO

R/Waddrdata

decoder

BDU

ICE_Break

Dstatus

R/Wdata[4:0]

ENStatus_reg

UpdateStatus_val

1111

2222

圖 C-3 scan chain2 connection with BDU after modification

關於這兩個問題的解法:

1. 將 Updata作反向,當讀取就會更新的動作。

2. 將外部的訊號(如 ICE_Break)拿來作更新的來源。

C.2 EICE 無法控制無法控制無法控制無法控制 SYS32TM寫入記憶體寫入記憶體寫入記憶體寫入記憶體

在使用 ICE執行 write/read memory的動作都很相似(CPU目前控制權在

ICE):

Step 1:選擇 scan chain 1

� IR:scan n IR command

� DR:0x1,選擇 scan chain 1

Step 2:呼叫 write register功能

� R0:存放要存取的 address

� R1~R15:如果是 write memory,則存放要寫入記憶體的資料;是 read

memory則將會存放讀取回來的資料

Step 3:存取 scan chain 1

� Write memory:先給 CPU兩次 nop指令清除 decode和 execution state

最後在給 STMIA(寫入 4個 bytes), STRH(寫入 2個 bytes) or STRB

(寫入 1個 byte)指令給 CPU,並且當給 STMIA, STRHor STRB指令

的時候也將 scan chain 1的第 33bit拉為 1,目的是當 CPU做完

STMIA, STRHor STRB指令後可以立即停下來將運轉控制權交回

ICE。

� Read memory:動作與 write memory相似,差別在於給予的指令是

LDMIA (讀取 4個 bytes), LDRH(讀取 2 個 bytes) or LDRB(讀取

1個 byte)

Step 4:將 CPU進入 normal mode(CPU運轉控制轉移給 wrapper,目的是

111

為了能讓 CPU與 memory能夠溝通)

� IR:Restart IR command

� TAP DSM:經過 RUN-TEST/IDLE

Step5:CPU與 memory溝通完成後,馬上將控制權交給 ICE,原因是 step3

將 scan chain 1的第 33bit拉為 1

Step 6(read memory才需要):呼叫 read register將讀記憶體取回來存放在

R1~R15的記憶體內容透過 scan chain 1讀回給 OpenOCD

圖 C-4 EICE control event activities form OpenOCD

上圖是 sacn chain 1部份架構之一,主要由 scan chain 1第 33bit決定進入

normal之後完成該指令是否要返回 debug mode。

問題:

現行 OpenOCD在 step3控制 scan chain 1給予 bit33為 1的時間點是在給予第二

個 nop指令,而不是在給予 STMIA, STRH , STRB, LDMIA, LDRHor LDRB指

令才給予 bit33為 1,這議會造成當 CPU進入 normal mode完成 STMIA, STRH ,

STRB, LDMIA, LDRH or LDRB指令後法將控制權交還 ICE,而導致 OpenOCD

無法繼續透過 JTAG序列來控制沒有把控制權交還給 ICE的 CPU。

解決方法:

只要當要給予 CPU STMIA, STRH , STRB, LDMIA, LDRHor LDRB指令順便給

予第 33bit為 1,這樣當 CPU完成指令後馬上就會將控制交還給 ICE。

112

C.3 中斷點中斷點中斷點中斷點觸發之後停止的位址不是設定中斷點得位址觸發之後停止的位址不是設定中斷點得位址觸發之後停止的位址不是設定中斷點得位址觸發之後停止的位址不是設定中斷點得位址

當要設定 break point的步驟有:

Step 1:選擇 scan chain 2

� IR:scan n IR command

� DR:0x2,選擇 scan chain 2

Setp 2:設定 break point,可分為 soft break point與 hard break point

� soft break point:是以 watch point方法實現 break point:

� 呼叫 read/write moeory將要設定 break point的 address內容保存

下來,並將內容更改為 0xdeee_deee。

� 並把 BDU 的 data value設為 0xdeee_deee,data mask設為 0x0,

address mask設為 0xffff_ffff ,control value設為 0x100,以及

control mask設為 0x0。

� 做完前兩項設定後,BDU 就會開始監測近來 CPU的 data是否為

0xdeee_deee如果是則會拉起 break通知 CPU已遇到 watch point,

此時 CPU必須將運轉控制權交給 ICE;當監測到 0xdeee_deee的

時候,CPU相當於就去讀取設為 break point 的 address,藉此達

到 break point功能。

� hard break point:設為 break point 的 address設定在 BDU 的 address

value裡面:

� BDU 的 data mask設為 0xffff_ffff ,address value設為 address,

address就是要設成 break point的 address,address mask設為

0x0,control value設為 0x100,以及 control mask設為 0x0。

� 做完設定後,BDU 就會開始監測近來 CPU的 address是否為

BDU address value所設定的 address,如果是則會拉起 break通知

CPU已遇到 break point,此時 CPU必須將運轉控制權交給 ICE。

113

圖 C-5 the cpu control signals path in EICE

上圖是 EICE簡易架構圖,主要有 CPU、BDU、與 Interface模組,BDU 模

組功能已在前面敘述過,主要用來觀測 CPU,而 Interface模組是將 BDU 需要

判斷的訊號收集起來。統一發送給 BDU 判斷。

問題:

當 break point被設定好之後,BDU 便會開始監測,BUD 會需要由 CPU來

的 ctrl_signal(CPnTRANS, CPnOPC, MAS, nRW)來幫助判斷 DBG_break拉起

的時間點,所以當控制 CPU運算的 CLKEN 訊號拉高時表示 CPU運算中,此

時就應該即時的把 ctrl_signal傳給 BDU 而不需要等待 CLKEN 拉低,但是現有

的設計會等待 CLKEN 拉低再把 ctrl_signal傳給 BDU 判斷,這會導致

DBG_break拉高的時間點發生錯誤。

解法:

將把導致 CLKEN 拉低才把 ctrl_signal往 BDU 送的 F.F去除掉,這樣一來

DBG_break拉高的時間點就可以正確了。

SYS32TM

Interface

Ctrl_signal

F.F F.F

GCU

CLKEN

bdu

F.F F.F

CLKEN

DBG_RQ

W0

W1

DBG_break

F.F F.F

CLKEN