2010年1月30日 星期六

多核心8051與代理人伺服器

摘要

多核心處理器是目前最重要的研究議題之一,在未來要提高計算能力而同時不讓功率與散熱成為阻礙時,多核心處理器是解決方法之一,不過多核心處理器的開發不僅僅是硬體的問題,同時在系統設計以及軟體開發方面也具備多重困難。與其一開始就切入使用過於複雜的處理單元,本系統採用簡單的8051為基礎,經過適度的修改後,將多顆修改過的8051以晶片網路(Network on Chip-NoC)的方式連結起來,並且採用服務導向架構(Service Oriented Architecture-SOA)以及元件式軟體架構(Component Based Software Architecture-CBSA)的方式讓多顆8051可以共同運作並且為同一套應用軟體進行運算,我們使用代理人伺服器(Agent)負責將軟體元件的二元碼(Binary)透過元件快遞協定(Component Dispatch Protocol)傳送至多顆8051進行運算,而軟體元件之間所需要的資料交換則是利用我們所定義的元件資料交換協定(Component Data Exchange Protocol)透過晶片內網路進行傳輸,而運算的結果透過代理人/元件通訊協定(Agent Component Communication Protocol),最重要的是,我們提供了包含以SystemC為基礎的電子系統層(Electronic System Level-ESL)的模擬器(Simulator)並執行在我們自行開發的開放原始碼的OpenESL發展平台之上,同時我們也提供了FPGA的實體模擬器(FPGA Emulator),而代理人伺服器暫時是使用一部PC來取代。整體的成果呈現出一個簡單的多核心系統所應具備的基本功能,相信這是一個具體而微的展示,讓人可以看見(Visualize)未來真正功能強大的多核心系統,我們計畫在不久的未來採用更先進的處理器以及作業系統,讓多核心系統真正具備實用價值。

2010年1月20日 星期三

2010寒假training course

目前LAB training course 時間為2/1~2/5 共計5天 早上9點開始

請碩0新生務必出席 專題生做相關領域的也請出席

也請講者 AAA學長 宗胤學長 塞公學長 嚕嚕帥哥

將課程投影片及相關文件上傳上來

課程設計部份

FPGA 2/1~2/2(一~二)講者 SCAAA 2/2 4282 2/3 4285
SLIM 2/3(三) 講者 塞公 4282
SYSTEMC 2/4(四) 講者 嚕嚕 4282
ANDROID 2/5(五) 講者 宗胤 4285

也歡迎其他有興趣的可以來聽

2010年1月18日 星期一

系統層級程式設計簡介與實做

1/18, 2010

由於學長在期末作業的tool kits上出了一點小問題, 所以必須延遲kit的上傳時間. 老師在此感到十二萬分的抱歉, 讓大家無法早一點回家放假.  不過為了讓大家的學習可以有一個比較完美的成果, 還是請大家勉為其難一下.

Kit預計在星期三(1/20)上傳. 星期四(1/21)學長會在4263等各位並且做詳細的說明. 原則上, 假如會正確使用套件以及之前的作業都做好了, 那摸應該只需要2~3天就可以完成了.

無論如何, 這是我們的疏失, 所以作業繳交期限延至1/2/2010.

---------------------------------------------------

1/8, 2010

期末作業注意事項請在這裡下載: Final Project

由於期末作業套件準備不及, 作業繳交時間延後至1/25晚上12點. 請隨時注意套件上傳的資訊.

過去第四與第五個作業還沒交的組, 可以在1/25前繳交. 已經按時繳交的組該作業加5分.

---------------------------------------------------



1/4/2010

這是關於Ports/Interfaces的最後的一次投影片, 我引用參考資料裡對階層式通道的例子, 這是要進入實做比較複雜的介面, 如AMBA或者是晶片內網路(NOC- Network on Chip)等的時候你所必須採取的方法.

這也是這學期最後的一份投影片, 我把它跟Ports放在一起. 我在之後會將這學期所有的投影片再做一次總整理, 並且會有一份附帶的講義, 預期在半年後放上來, 請各位同學到時候來下載.

請在這裡下載: Hierarchical Channel

最後提醒各位, 期末作業的套件講解是1/7, 請務必來上課.

最後祝大家學習愉快與順利, 也希望這個課程對大家的未來有所幫助, 更希望有更多資訊系同學能投入到這個領域的研究, 假如我上課有不周全的地方, 請大家到這裡留言, 我會想辦法改進, 這樣對以後來修課的同學會更有幫助.

-------------------------------------------------



12/31

這是SystemC有關Ports的部分. 這次先上傳一部分.

請在這裡下載: Ports

--------------------------------------------------

12/28

有許多同學在問第五個作業是什麼, 我記得我在課堂上講很多次了.  就是

第四個作業用OpenESL的Command Line模式再做一遍, 用意在讓各位熟悉ESL工具.

--------------------------------------------------



12/8

這是SystemC有關Communication的部分. 目前完成的部分是Primitive Channels的部分, 其他的會在之後上課前放上來.

本周的作業是將此次投影片裡有關sc_semaphore的範例的其中一個master module改成用method來實做. 請在12/24前繳交.

這一周除了上SystemC之外, 另外要請同學開始試用實驗室宗胤學長開發的8051 SystemC Simulator. 下周品皓學長也會把對應的GDB也做好. 這是期末作業的最重要的元件之一, 請同學一定要熟悉.

下周會請哲榮上OpenESL的使用, 請同學下載試用. 請在Windows XP或Linux環境下使用.

請在這裡下載: Communication Channel

---------------------------------------------------

12/1

這是SystemC有關Thread與Method更進一步的介紹, 不過也因為還沒完全寫好, 只算是完成70%, 請見諒.

請在這裡下載: Thread and Method

----------------------------------------------------------

12/1

這是SystemC有關Concurrency, 不過因為還沒完全寫好, 只算是完成70%, 請見諒.

請在這裡下載: Concurrency



----------------------------------------------------------

11/25

這是SystemC有關Main Function以及Module Function的宣告以及大致的實作方式與範例.

請在這裡下載: Structure: Main and Module

----------------------------------------------------------

11/25

這是一份 SystemC的Overview, 講一些有關SystemC的基本概念與元件是開發觀念. 有Example提供大家參考.

請在這裡下載: SystemC Overview

範例程式請在這裡下載: SystemC Overview Program Example

---------------------------------------------------------

11/24

這是有關解釋SystemC如何根據時序(Timing)來進行模擬, 因為所有硬體系統都需要跟時序相關的.

請在這裡下載: Timing

-------------------------------------------------------------------

11/24

這是有關解釋SystemC的資料型態.

請在這裡下載: Data Types

----------------------------------------------------------

11/23

這是OpenESL的投影片, 主要是說明SCREAM Lab所開發的ESL 整合設計環境(IDE)的使用方式.

請在這裡下載: OpenESL

-------------------------------------------------------

11/23

這是SystemC的安裝教學.

請在這裡下載: Installing SystemC

--------------------------------------------------------

11/22

這是簡單的Verilog與Logic Design教學以及ModelSim的用法.

請在這裡下載這三份檔案:

 Using ModelSim

Basic Logic Design

Verilog Basics

--------------------------------------------------------

10/6, 2009

這是第五回的投影片, 是有關SystemC的概念性簡介:

For SystemC Beginners

請在這裡下載: SystemC Beginners

----------------------------------------------------------

9/29, 2009

這是第四回的投影片, 是有關ESL的整體的概念性簡介:

Basics of ESL Design and Modeling

請在這裡下載: ESL Basics

----------------------------------------------------------

9/24

這是第二回的投影片, 是有關8051的簡介以及工具

請在這裡下載: SCREAM 805,  its toolchain and FPGA Emulator

未來的Topics包含:

Review of Verilog coding and simulation

Basics of ESL Design and Modeling

SystemC coding and simulation

OpenESL

Heterogeneous Simulation Environment

Simple SoC Design, Modeling and Simulation

HW and Grading: 五個, 分別練習 C++/Threads, 8051 coding, Verilog coding, SystemC coding

Term project: Simple SoC Modeling and Simulation Using 8051/ModelSim/SystemC

HW(60%)+Project(40%). 如期末作業未交或兩個作業(或以上)未交則不及格. 作業必須要能正常執行, 否則視同未交.



課程資料:

主要上課資料: 線上投影片(PDF  格式)

參考資料: 1. SCREAM Lab Blog 

               2. SCREAM Lab Open Source Blog

               3. SystemC From the Ground

               4. The Guide to SystemC

 

假如你們還對此一topic想有進一步的了解, 相關研究所課程的內容如下, 近期會有一個討論串發佈.

Topics:

1. SystemC Simulation Kernel

2. Advanced OpenESL tool development

3. TLM2.X

4. ARM Processor ESL Model

5. Multi-core Virtual Model

6. Multi-core Programming on Virtual Model

7. Multi-core application programming using CUDA

8. Debugging tool for microprocessors

HW and Grading:

1. 10 to 12 presentations

2. 3 projects

如有作業未交或超過3次presentations未準備者則不及格.

課程資料:

主要上課資料: 線上投影片(PDF  格式)

參考資料: 1. SCREAM Lab Blog 

               2. SCREAM Lab Open Source Blog

               3. SystemC From the Ground

               4. The Guide to SystemC

               5. CUDA

               6. TLM

               7. ARM ESL


-------------------------------------------------------

9/22

這是第一回的投影片, 是有關C++, Process與Thread.

請在這裡下載: C++, Process與Thread

---------------------------------------------------------



9/20

ruru: 請將8051 simulator的用法加在品皓底下post的power point裡再傳給我, 請包含如何跟SystemC銜接的方法.  另外我的ESL Basics有幾張圖要畫一下, 我再寄Powerpoint給你.

宗胤:  請將C++/threads/processes的投影片寄給我. 請你寫一份TLM2.0/2.1的投影片. 一月中會用到, 請你12月完成.



--------------------------------------------------------

7/24, 2009

提醒我自己與大家一下, 該上傳了. 我自承有點怠惰, 會趕快把SystemC的部分一點點補上來.

----------------------------------------------------

6/18, 2009

投影片我改成PDF檔, 請指教. 請負責的同學記得在7月底上傳投影片.

--------------------------------------------------

我一直覺得SoC設計應該要由資訊系的學生來做才恰當, 但是資訊系的學生一向怕硬體, 為了破除這個問題, 我預計在下學期的大學部開一門選修課, 課名如標題. 英文標題是:

Introduction to Programming and Tools of Electronic System Level (ESL) Design

我寫了第一階段的投影片, 用意在簡介一下ESL的設計觀念. 如下:

Electronic System Level Design Basics

因為是大學部的課, 一些基本的東西還是要含蓋一下, 我又不想把課弄得講太多ESL, 可是實務卻做的少. 所以我計劃有一章是基本工具與知識的介紹, 以便在實做term project或Homework時可以用到. 我把可能需要介紹的東西以及要負責寫的同學條列如下:

1. C++ Basics: Gary

2. Threads: 塞公

3. Processes: 塞公

4. Verilog HDL Basics and Logic Design: ruru

5. HDL Simulator and FPGA: ruru

6. SCREAM 8051 and toolchain: 品皓

7. SCREAM OpenESL: 小龍

8. Computer Architecture Basics: 品皓

這一部分是:



All programming skills you need to know to master SystemC and learn ESL design together with some useful information

請各位就一個不是懂太多的大學部學生為準則, 盡量寫得讓他們看得懂. 順便幫他們複習一下他們過去學過的, 但是對這門課重要的部分. 不過請不要copy你過去學過的書或講義, 務必是你消化後再寫出來的東西比較好.

接下來我會寫SystemC的部分以及請Gary寫一章TLM2.0的部分. 至於OCP與AMBA, 我還在考慮要不要放進來, 但是還是請ruru準備, 反正都是要寫的.

以上請各位有空可以開始寫了, 我希望大家在七月底可以完成四個Chapters的powerpoint, 並且開始寫書的部分.

以上請各位學長與學姐指教, 如能自願幫忙, 感激不盡.

2010年1月8日 星期五

操作的必要性與不方便的必要性

Nita來訪, 確實給我許多啟發, 對孩子的教養就不提了, 因為這部分太多了我需要時間去消化.

偶然間, 她提到安藤的建築. 以下圖片是google來的, 要是有人覺得我這樣有點違反規則, 留一下言, 我把他刪了就是.

ap_20070724022248243



住吉的長屋據說是他為人設計但是之後買回來當自己事務所的房子. 這房子把一大堆地坪分給了天空, 然後把房子一分為二, 你要從房子的一邊到另一邊, 天氣好的時候可以曬一下太陽, 對健康有益, 要是遇到下雨, 恐怕要撐一下傘, 每一間房間都不大, 動線也不是太好, 總而言之是不太方便使用的那種, 看起來平凡簡樸至極, 可是卻是常被拿來討論的屋子, 傢俱據說也都不是方便大氣的那類, 因為擺不下. 看了下面幾張圖, 請自己揣摩一下.

7f0a6d5d

房子已經不大, 入口更小, 大約就是70~100cm寬的門.

sumiyoshi_no_nagaya_01

這房子住起來肯定沒有時下台灣所謂的豪宅舒服與方便, 以安氏而言, 電視裡面老是愛宣傳的那類超大豪宅他是絕對住得起的, 不過人家可是在這不太方便又小小的屋子裡面構想與誕生出一堆很棒的設計. Nita說得好, 就是要這麼不方便, 住在裡面的人就是要這麼遷就這建築才行. 不這樣, 無法有操作的機會, 不這樣, 無法有傑作誕生, 歷來一位作者一生中最好的藝術作品不都是作者在不方便, 甚至困頓的情況下誕生的嗎?

大哉斯言!

一個人必須透過不斷的操作, 包括心理與身體兩方面, 才可能可以有源源不斷的創意與作品誕生, 待在過於安逸的狀態是不足以產生好的東西的, 甚至連產生普通好的東西都不行. 好友吳鳴兄說, 要嫻熟一樣技藝, 或甚至只是初窺堂奧, 起碼需要一萬小時, 假如每天練習6小時, 那麼要四年多的時間才夠. 要成一家之言, 那非得日思夜想, 超過十年才行.

這讓我想起近年來, 物品越來越方便, 於是人類靠自己的雙手操作,  靠自己的感官判斷的機會越來越少, 當然由身體力行進而刺激思考的機會也就會更少, 接受新知識與新觀念的能力也就連帶的下降了. 所以人就會越來越退步了, 最後就像是提前衰老的人, 再也想不出新的東西來了. 很可悲的.

所以思想上與身體上的操作行為是必要的, 而要有機會操作, 那麼適當的不方便也是必要的了. 但是請不要誤會我的意思, 我並沒說一切都要不方便才行,  但是你必須知道你需要的是哪一類的不方便才行喔!

這讓我想起我的黑膠系統, 不方便的盤,  不方便的唱臂(沒有自動上下與舉臂停臂器), 要唱一張唱片要進行的儀式與過程以及要忍受的黑膠唱片的一些不完美很多, 這也許是現代用慣 CD, iPod, 甚至電腦音源的人所無法習慣的, 可是透過這些操作, 我似乎學到一點點道理, 也許就像是這住吉之長屋一樣, 不方便歸不方便, 它內在真正的好處還是要使用的人去體會才是. 雖然我自己做的東西不是頂極的東西, 多數頂極的東西在操作上面通常是需要下一點工夫的. 就像Stereo Sound裡描述的頂級音響一樣, 人是需要花以年為計算單位的時間去熟悉與操作, 才可以把器材的潛力帶出來的. 有一些東西, 為了達到終極功能的目的, 操作上的方便在設計時是可能被忽略或故意被忽略的.

DSC01872

DSC01871 

最後想到自己以前還是學生的時候, 那時的硬體與系統軟體工具都不方便, 所以要把一個硬體系統叫起來模擬需要一大堆前置步驟, 而每一個步驟之間的格式轉換多半要靠自己寫程式來弄, 因為沒有現成的人家寫好的code可以用, 所有的路徑, 目錄, script都要自己寫與管理. 所以還沒開始模擬就先花一個小時了. 不過因為這樣, 每一個步驟都清楚他在做什麼, 可是現在多的是人家編好的工具與寫好的script, 一旦叫不起來,  多數學生只能傻眼, 然後接下來就不知道怎麼辦了. 其實, 只要挖進去, 一步步了解他的步驟裡的所有動作以及去了解這些動作的意義, 一切就開朗了.

可惜的是, 當初我的訓練是一剛開始就從零開始, 所以這些步驟我很清楚, 現在的學生則是多半沒經過那樣子的訓練, 所以在解讀步驟時會不知道怎麼辦. 反過來說, 我自己就不知道那些script與伴隨那些script的那些工具的確實功能, 反之, 因為我自己沒寫過那樣子的script, 新的工具用新的語法或語言寫的, 而過去多半的工具是自己用很爛的程式寫的, 這也是因為我後來在這方面欠缺操作的原因. 不過終究script與工具如何寫在多數議題上是末節, 原理要是知道就容易解讀了. 以我的年紀以及目前與未來我所要做的工作內容, 如何寫出更好更方便的script與工具是不必要的就是了, 也就是我再也不需要去操作這類東西, 但是對於年輕學生來說, 這卻常常是他們在不遠的將來找工作與做研究時所需要的, 不了解這些我所謂的末節反而是不行的. 時代在變嘛! 無有辦法!

所以方便有時不見得是一件好事, 不方便也不見得是一件壞事, 反之亦然. 多數時候, 假如這是你該好好懂的東西, 當然不方便是有其必要性的. 至於你該讓哪些不方便的東西來訓練你產生操作的行為進而成為某方面的專家, 就只有你自己才知道的了.

關於這最後與最重要的一點, 安藤忠雄的住吉的長屋的例子可以給我們不少的啟發.

2009年12月23日 星期三

OpenSparc T2 in FPGA - 哲榮

------------------
2009 12 23 三
------------------
這禮拜把cygwin裝起來
然後執行yl學長說得指令sim xxx
可是沒有開啟modelsim

再加上我對sim這個script的內容不太瞭解
請aaa幫忙看之後,發現有文件!可以參考

目前正在看這份文件
想說先找出memory.hex如何產生的
然後直接放到之前的專案裡面一起跑
因為直接執行它的script還是需要nc-verilog或synopsys


------------------
2009 12 16 三
------------------
目的是希望能夠把Sparc t2燒入FPGA中
並接上TLM2.0的bus
將Sparc作為一個運算的component

目前下載OpenSparc的opensource
http://www.opensparc.net/opensparc-t2/download.html

短期目標希望先在pc上跑RTL simulation
然後在program rom裡面寫入一個簡單的loop program
能夠正常執行後接下來再把program更換為一個小型的os或者更小的管理程式
來處理sparc與周邊的資料傳輸

原本直接把t2的verilog code直接放到ModelSim上跑simulation
但是compile的時候會遇到dump.v裡面出現error:
(vlog-2155)Global declarations are illegal in Verilog 2001 syntax

後來看了一下dump.v裡面只是在做VCD和FSDB(fast signal database) dumpfile
加上file list裡面又沒有dump.v 所以直接把它拿掉xd
當初會放進去的原因是因為他跟top module t2.v放在同個資料夾,沒注意到他不在file list裡面

後來simulation過程中又出現了
**Warning:(vsim-7) Failed to open readmem file "memory0.hex" in read mode
#No such file or directory.(errno = ENOENT)

似乎是memory map file沒有讀到
但是搜尋下載的t2檔案裡面又找不到memory0.hex

後來問了一下aaa,還是決定在linux底下裝NC-Verilog 來跑simulation
因為readme file裡面有教怎麼在NC-Verilog上跑,照著作應該比較不會有問題


2009年11月25日 星期三

出國遊學玩樂感。kiki。

大家好 ,我是老人一枚-kiki~奉老師之命來po個出國遊學之感想!

出國前
一開始是想要去Working Holiday的,但是跟爸媽談過之後她們怕太危險怕很大,最後覺得遊學可以達到我的目的,也可以學一些東西~所以~就讓我年輕瘋狂一次吧!

雖然五月就出國了,不過我也是二月才開始Survey學校,一開始什麼都不知道,就從身邊有出國的朋友們下手,然後上ptt(沒有錯我是鄉民!)看相關資料,最後跑去代辦中心詢問,因為代辦實在有點貴,所以我就開始自己動手找學校啦!心裡想要的學校大概就是幾個方向,是大學附屬的(不想要只去一般學校~很像補習班)+交通方便,所以最後就找到了BU啦!在美麗的Boston,大家都說很棒的地方,所以就決定他了。附上很方便的網站 ~就是她讓我完成手續地!

出國了
學校課程是每天的早上9~1點,下午會有一些club可以參加,晚上做作業後,再去gym跑跑步就差不多晚上該睡覺了。每天規律的學生生活,超懷念的!而課程我選擇的是Business Class,個人覺得師資還不錯,會請starbucks之類的公司經理人來講課,很特別!課程只有三個月,咻一下就過去了,去遊學的孩子好像通常都會待個一年,只待三個月的真的不多。

我的室友是日本醫生正妹,在出國前就一直想要認識日本女生,結果非常lucky的就遇到啦 !我跟她踏遍了Boston的大街小巷,任何大大小小的活動都參加,學校的老師行政人員都因此認得我們,我們也因此認識了更多朋友。不過挺可惜的是,我去的時候剛好是暑假,所以沒有很多學生在學校,無法真的感受到她們的校園生活。

Boston是個很漂亮又有著方便地鐵的小城市,聽說是全美最多學校的城市,最高學府都在這裡,這裡的台灣圈很小,所以不小心就認識了高檔的MIT media lab的小妹妹,還有一群Harvard/MIT的高材生,每個人都懷抱著夢想,很閃亮!

課程結束之後,就開始了美國東岸趴趴走行程了。第一趟是跟著學校同學一起參加國內旅行團,去了Washington DC+Niagara Falls,這些景點太經典,但是開車又不方便,跟團便宜又免煩惱!結束後就開始到東岸的朋友家寄生啦!首推ya+0小朋友,他在NY念MBA唷,所以我就以他家為主,到處去玩耍啦!

第二趟是ya+0加上俊一的老婆一起的Orlando-Disney之旅,好像重回小時後時光耶!其中四天都泡在Disney裡,每天都看著唐老鴨米老鼠,連做夢都會夢到耶~哈哈。Orlando與Boston感覺差很多,飯店附近都很度假~南洋棕梠樹風,市區附近則很退休有錢風,好像每天都很悠閒。

第三趟是飛到北卡找我高中同學,他在Duke念博士,超級優秀的孩子,不過北卡真的就非常大自然風,我從飛機上看下去都是綠通通的樹一大片,我為了入境隨俗,所以這裡的行程都是參觀校園~Duke+UNC+NCSU~沒有城市的塵囂味,非常舒服,沒有什麼誘惑所以可以好好念書。

第四趟則是到NY State比較北邊的Binghamton,這裡跟Boston的緯度一樣,只是在內陸一點,所以比較冷一點,但是他的感覺反而跟北卡比較像,因為都是走大自然風,沒有車無法生存的地方,也因此我又去參觀了名校:Cornell+也叫做BU的Binghamton University!超漂亮的!空氣都是甜的呢!!

最後一個星期我就乖乖的待在NY遊蕩了,因為Ya+0開學加上有在打工,很可憐很辛苦,所以我就上ptt去找人一起遊NY啦!台灣人見面格外親切,可以有人幫你拍照,也有人陪你聊天,超讚地!就這樣我的旅行就在NY畫下句點啦。

出國後
這樣出國也出去了四個半月,英文學好當然是必要的,但是最重要的是認識了好多不同國家的朋友喔!最多的是日本韓國朋友~還有哈薩克~多明尼加~阿拉伯ㄚ之類等等的,超級大開眼界的,每個國家的風俗名情都不一樣,產石油的國家真的都有比較有錢XD。。。

現在就算回國了,還是很努力的跟朋友保持聯絡,有認識這麼多朋友真是太划算了!有夢想就去實現他!這真的是我這生最棒的旅程啊!

詳細行程記錄在我的blog啦~一開始寫得很認真,後來都縮在一起啦~哈哈。報告結束,謝謝大家收看落落長文。

2009年11月23日 星期一

Google Chrome OS


義崧、禹鴻、跟唯中這個週末撥空南下巡視 …喔不,是南下探視成大的鄉親們,周大師甚至不棄嫌的願意下塌在小弟家,工業區晚上很冷清野狗又多的,大師一來連我家狗狗都不會吠他。


在聊天聊到半夜四點(?)的話題中,唯中提到Google宣佈了他們打算出產自家OS的消息,並且有初步的概念,很快的我訂閱的blog中也有人提到此事,所以貼上來分享給大家知道一下。目前我找到的project是Chromium,官方也釋出了有趣的介紹影片。

由影片中的介紹我們可以了解,他們的OS透過Chorme流覽器來當作我們習慣的「桌面」,使用他們的OS一定要接上網路,所有的資料都會透過網路來存取及計算,可想而知這是他們發展雲端計算後的下一步。以後開發程式可能不再是用C, C++,而是HTML5, CSS3, JavaScript …。

Who knows ?

2009年11月13日 星期五

Leon3, an OpenCore SoC system

Hello Everybody,

Long time no see... :)

I find that I'm losing to follow what everybody did since the blog are not up-to-date. However, I'd give a brief introduction of the SoC system adopted here. I especially highlight its debugging utility, being treated as a reference of 8051 project.

The SoC system is provided by AreoFlex. It consists of IP cores, OSs, compilers, debugger and simulators. Most are open-source following GPL licensing and some are commercial. The Leon3 is the processor core using the SPARC V8 architecture. The SoC system contains AMBA bus with plug&play functionality, so modules connect to the bus. Essential IPs are built in the package, as shown in the figure below. This system doesn't bound to any boards or processes. It means you can use it on whether Xilinx/altera FPGA and ASIC design. However, they collect various FPGA boards and fit the SoC system on them, including the peripherals on the board. A tool to configure the IPs is included. It helps you to construct the system you want, even without modifying any codes. You also can build multi-core system by configuring.

After configuring, synthesizing, and programming onto FPGA, you can execute program on the LEON3 processor. The GrMon is provided as a debugger. It can obtain the information from processors and other AHB slave by using the debug link module, which is a AHB master, as shown above. However, to access the registers in the processor, an additional debug support unit (DSU) is designed. The DSU is a separate AHB slave module, accessing the processor only when the processor is in debug mode. Once the GrMon tends to access the status of processor, its corresponding debug link module will signal the DSU. The DSU will enforce the processor to enter debug mode and halt, so that DSU can work. A DSU can cope with up to 16 processors.
As mentioned above, the SoC system has no limitation to FPGA boards, so their debugging environment is adaptable by providing various debug link modules. For example, it supports Xilinx standard USB-JTAG download cable for debugging. Some may question if there is no interface for the existing debug link. Don't worry. If you can connect your FPGA board with PC, all you need to do are to design your own debug link master module connecting to PC with interface on the board and to enable GRMon control your hardware module by implementing a set of pre-defined callback functions being invoked by GRMon. This makes it possible to build the system on the existing FPGA boards in our lab. :p
Moreover, the GRMon is an Eclipse plug-in and can attach with GDB for debugging. More information here.

Okay, that's it!

 

2009年10月29日 星期四

Cell Programming Tool - ㄚ凡

====================== 09.10.29 ======================

現在傳值的部分OK了
就是PPE裡給他一個array
讓它經過各個SPE運算
最後傳回PPE做輸出
現在開始寫API的說明跟整個tool的介紹
還要把codegen改好

====================== 09.10.15 ======================

目前
「PPE傳給SPE一個陣列
然後陣列在SPE之間計算傳遞
最後再傳回給PPE輸出」
已經OK了

之前因為系統只回傳一個 SPE_RUNTIME_EXCEPTION
只能一行一行註解來找 到底問題在哪
後來發現是在SPE收到PPE傳來的東西後
要更新read address時出的問題

因為大家的address丟來丟去
有時候是Local Storage的位址
有時候是effective address
沒轉換好 記憶體就會有問題

現在PPE可以傳東西給SPE
可是因為無法更新read address 所以只能傳一次
只要找出來read address是在哪裡算錯 就能解決了

接下來看Queue的相關函式能不能合併一下
測試一下大一點的陣列傳遞
就能根據這些程式碼來改codegen了

====================== 09.09.16 ======================

先說一下Double Buffer
學長提到的non-blocking DMA
是不是要問這兩個spe之間的同步機制

對每2個frame來說
spe1 :
    wait_dma_complete(TAG10);
        <IMC的動作>
    FE_enqueue(&MyFrame, TAG10, &P_PPE);
    OutputSel = (++nFrameCount)&0x1;
        <PB的動作>

spe2 :
        <PB的動作>
    OutputSel = (++nFrameCount)&0x1;
    wait_dma_complete(TAG10);
        <IMC的動作>
    FE_enqueue(&MyFrame, TAG10, &P_PPE);

利用 wait_dma_complete(TAG10); 這個函式
來作waiting,直到上一筆傳輸確定做完

在呼叫 FE_enqueue(&MyFrame, TAG10, &P_PPE);
將這一個frame的運算結果傳回PPE時
不用等到傳輸結束
就可以先開始進行
下一個frame的PB運算

--

上禮拜說要寫個例子
因為還沒寫完 所以這禮拜也沒辦法報

====================== 09.09.08 ======================


目前Queue SPE->PPE的function改好了 也測試過了
Queue PPE->SPE的部分寫出來了 可是還沒測過
接下來想寫一個簡單的例子
把資料從PPE傳進SPE 算完後傳回PPE 輸出
等到這部分完成後 再來改codgen的部分

下面來個示意圖 說明一下不同Queue的初始化
方形的框是SPE
SPE旁邊長的兩個小框 上面是in_mbox 下面是out_mbox
圓的是PPE
然後箭頭則是初始化的步驟 (綠色是consumer 紅色是producer)
1. Consumer送 queue address
2. Producer拿 queue address
3. Producer送 read address
4. Consumer拿 read address


由上而下分別表示SPE->SPE、SPE->PPE、PPE->SPE
三種初始化傳位址方式
(這邊寫得比較簡化 實際上queue address是放在MAIL MESSAGE中
再把MAIL address 傳到producer那邊
而read address就直接傳給consumer 不透過MAIL MESSAGE)

====================== 09.09.01 ======================

Queue的重點主要在初始化的部分
需要經過4個步驟
1. Consumer送 queue address
2. Producer拿 queue address
3. Producer送 read address
4. Consumer拿 read address

目前spe之間的queue初始化
都是把address寫入對方spe的in_mbox
而ppe與spe之間的queue初始化所需的溝通
則是利用spe的in_mbox與out_mbox來完成

這邊舉例說明一下
假設spe1為producer spe2為consumer
spe2要將queue address 傳給spe1 :
首先spe2把要傳的queue address放進MAIL (傳遞用的資料型態)
再把MAIL address用mfc_put放入spe1的in_mbox中
接著spe1從自己的in_mbox中讀出MAIL address
再用mfc_get從這個位址取得MAIL
再從MAIL裡拿出queue address

只是PPE在扮演producer或consumer時
照這樣寫 又得多出8個類似的function
我想把它們盡量簡化 不然queue的初始化會非常複雜

接下來是資料的input
目前input是在module裡
也就是data flow中第一個執行的module若是VLD
就在VLD的function裡 取得bitstream
只有在運算完成 在data flow中最後一個module
負責把output送回ppe 由ppe來播放
這樣的流程不知道需不需要更動

另外 在學長的code中 spe1與spe2有使用double buffer
由這兩個spe輪流作輸出
我還看不太懂為什麼這樣實作
不過 我們的tool裡應該不用實作這部分吧

====================== 09.08.18 ======================

關於學長的程式
整個結構跟流程懂了
至於每個部分的實作細節
(由xml經過schedular來決定每個spe要放哪些module)
現在是有概念 但沒有說每一行都仔細看過
大致上是不需要改動的
不過學長當時有跟我說一些小地方 還有討論的空間
(都在schedular裡)
這些地方需不需要修改 等我codegen改的差不多了再決定

Queue的使用也知道了
實作上還有點看不懂 為什麼要這樣做
(會這樣寫一定有特定的理由 我還得再想想)
在queue的初始化部分
看懂了 可是覺得有點不直觀 可能會稍作修改

另外 因為是要open給人家用的
所以產生的程式碼必須加一些註解
至少讓使用者知道每一段程式碼分別在作什麼

queue的實作部分目前只有spe之間
接下來得寫出ppe用的版本
(memory access的function不同)

====================== 09.07.29 ======================

昨天請教學長之後知道

要透過schdular來安排資料在spe之間的流向
所以我們可以幫使用者做好資料傳輸的部分
使用者只需要填入他所要傳的資料當參數即可

所要產生的程式碼包含 :
ppe用的程式碼,負責初始化spe及餵資料
最後的輸出動作等
spe用的程式碼,由於我們已經知道資料的流向,使用者只須負責每個module內部的運算部分

至於傳輸資料的實作部分,我還有一些問題需要釐清,待明天跟學長討論之後再上來說

====================== 09.07.28 ======================

這篇討論串的目的是希望能開發一個generalize的tool
以便使用者在Cell上開發自己的程式

本來希望能將之前的圖形介面改寫成更一般化
能藉由拉進一個個module
再指定module之間要使用的傳輸方式
產生code 使用者只需要自己補完程式中運算的部分
ppe與spe、spe與spe之間的傳輸由我們的tool來產生

不過 之前的GUI是針對schedular設計
只需要指定module間的資料流向
程式碼的產生由schedular負責

而現在我們所要產生的code不包含程式的運算部分
也就是module要在何時將資料送到下一個module
而且傳多大的資料 我們並不知道
只能提供一個預先定義好的function 供使用者傳輸資料用
這麼做的話
我們似乎就不需要去考慮使用者有幾個module
以及這幾個module之間的資料流向
我們能提供的只有ppe及spe的程式碼範本
以及一個可簡單使用的傳輸資料function

之前師公所寫的codegen已可產生所需的程式碼
至於傳輸資料的function 我想使用之前學長寫的queue
稍加包裝應該就能供一般使用者用了
而要怎麼加入GUI 怎麼讓使用者能簡單的開發自己的程式
我還要在跟老師討論一下

2009年10月20日 星期二

GDB for 8051 - 品皓

======================11/25=======================

meeting投影片

延續上禮拜做的給做完。之前的loop因為寫得太單調了所以感覺沒用到幾個branch instruction,改的複雜一點就可以看出差別:
Function call -> LJMP, RET
while loop -> SJMP, CJNE
For loop -> SJMP, JNC
If-else -> JZ, JNZ
但仍然有少數的branch instruction我試不出來。最後沒辦法只好寫inline assembly自己測試:
ACALL, AJMP, LCALL, DJNZ, JB, JNB, JBC

======================11/18=======================
實作decoder加入判斷branch目標位子的功能。測試程式我是寫了簡單的while loop, for loop, 和function call來測試,但是看了對應的assembly code發現有些branch指令還是沒測到。之後會直接inline assembly繼續測試。

======================11/10=======================
寫了一個簡的測試程式,把每一行C code設breakpoint測試,都有停下來。同理用next step一步步執行也都有停到預期的program address;除了branch instruction。

因為只能根據目前的instruction長度判斷下一個instruction的位子來設定breakpoint,如果停下的點是branch instruction,則設定的breakpoint位子可能是執行不到的。譬如無限迴圈while(1);在assembly code就只是sjmp當下位子,我breakpoint則會設定到迴圈之外。

簡決方法是單步執行的decoder還必須能判斷branch的位子。

======================11/04=======================
原本Breakpoint的指令是用timer達成,現在已經改成學長的建議用software interrupt: SETB TF0。

上禮拜關於GDB的單步執行(next)會卡死的原因,發現單步執行所給予的breakpoint位子不可能走的到,我判斷是GDB端的問題。GDB處理signal step的地方當初是直接延用bbb的risc32,也就是判斷下一個instruction的位子是目前PC直接+4,所以才會造成GDB會產生一個不可能走到的breakpoint。又因為8051是CISC,下一個instruction的位子等於目前PC值加上目前instruction的長度,所以加上一個簡單的decoder判斷目前instruction的長度。

目前build GDB失敗......

======================10/28=======================

主要是實作8051 stub處理breakpoint的問題。8051 stub接到breakpoint指令後,啟動timer0 interrupt。利用timer interrupt每執行一個instruction都進handle_exception()檢查目前PC值和之前設定的breakpoint是否相同。
不同則表示還沒到breakpoint,return。
相同則表示已經走到breakpoint,進入無限迴圈等待GDB的指令。

目前測試看來是成功的,不過奇怪的是GDB的單步執行(next)會卡死,懷疑可能是GDB端給的program memory address有誤,目前還在debug。
======================10/21=======================

處理breakpoint之前,我想先完成單步執行的功能,因為breakpoint可以利用單步執行,每執行一instruction就比對一次目前的PC值是否和breakpoint table裡任一數值相吻合。

另一方面,GDB的單步執行(next)也差不多是如此;GDB的繼續指行(continue)就是跳出handle_exception繼續執行直到遇到breakpoint後又進去handle_exception。GDB的單步執行(next)則是根據symbol table知道下一步instruction的位子,設定breakpoint在那位子後,繼續執行(continue)。

處理單步執行我是用timer0 interrupt,簡單的驗證方式是觀察每一步的PC差距,更進一步應該是要比對binary code的instruction。還沒完成是因為遇到bug,應該只是個小錯誤,還在debug中。======================10/16=======================
我試著插入breakpoint於測試程式中,觀察設定breakpoint後GDB傳給8051 stub的program memory address內容有誤。直到觀察assembly code才發現某些C code沒有對應的assembly code。

因為我的測試程式寫得太簡單,裡面一些簡單的變數運算可能sdcc判斷為無用。更進一步去觀察測試程式所設定的變數,變數設定太簡單,sdcc會直接定為某個register,而不是給予一個記憶體位子。這樣會間接導致那些變數編譯完後也不存在於symbol table中。

後來變數加入volatile的設定而解決,主要目的是程式對volatile的變數作存取時必須直接到他的位子作讀寫而不是經過暫存器或者cache之類的。這樣的設定也會強制sdcc必須安排volatile的變數一個記憶體位子,而不是定為某個register。

======================10/08=======================
paper投影片

BEE2 是由四個user FPGA和一個control FPGA組成,根據FPGA提供的功能如I/O pins和其要求如供電壓等作設計,最後加上其他周邊硬體如usb, rs232等完成整個平台。
平台裡每個FPGA都加入PowerPC的架構並在control FPGA執行Linux,主要用於控制周邊硬體,監控等。
======================10/06=======================

常常會忘記自己做的東西是很底層的,很多是事情其實直接用inline asm解決即可;也有很多問題是必須trace assembly code才會知道錯誤在哪。

上禮拜是驗證8051 stub回傳的PC是否正確,這禮拜是驗證其他registers(r0-r7 sp)。
驗證方法很簡單,在進入function handle_exception()之前用inline asm隨意指定r0-r7的數值,之後觀察8051 stub回傳的r0-r7和之前指定的數值是否一致。

接下來是之前提到的,回傳的memory數值不正確。
原因是為了8051 stub回傳registers方便,我宣告一些全域變數用來儲存registers的參數;並為了inline asm撰寫方便,宣告時也指定那些全域變數的位子。我本來以為compiler會處理其他(如區域變數)的位子並避開前面我指定位子的全域變數,結果並不會。簡單的判斷方法就是宣告幾個同位子的變數看compiler是否有warning或error。我之所以認為compiler會處理這問題是因為Keil C51就會在變數位子的宣告有重疊時會產生warning,但是我目前用的SDCC卻不會。這問題就會影響到8051 stub回傳memory數值的錯誤,我用以下範例說明。

reg_PC一變數是我宣告用來儲存中斷點的位子,也就是handle_exception function return的位子。所以一開始8051 stub與GDB連線時,stub會進入handle_exception function並回傳所有registers的數值,其中包含PC值,所以在這一點我是直接回傳reg_PC的數值,也是上禮拜用來確定回傳的PC值是否正確的依據。

但是reg_PC也是一個變數可以在symbol table找到,所以可以用指令display reg_PC調出他的數值。用display指令和之前回傳register的方式不太一樣,前者是回傳目標記憶體位子的數值;後者則是直接回傳指定變數的數值。之前會回傳錯誤資訊的原因是因為handle_exception function的區域變數會覆蓋到reg_PC的位子。解決方式就是不要指定位子,全部給compiler分配就好了。

======================9/29========================

8051 stub方面,有個問題是不知道怎麼在C程式裡得到processor暫存器(pc,sp,r0-r7)的資料,後來直接寫inline assembly code來解決。首先宣告一個固定位值的變數如: data unsigned char at 0x20 reg_temp[8],表示變數reg_temp陣列在iram裡的0x20-0x27位子,接著用inline asm 如: mov 0x20, r0 的方式把r0-r7的資料存到reg_temp陣列裡,最後reg_temp就保存了r0-r7的資料了。pc也是用類似的方法,只是inline asm 是用pop push得到進入handle_exception function前的pc值。(handle_exception是stub裡的function,主要是收送GDB端讀寫的封包,一般在程式走到breakpoint會進入的function)

目前我只能驗證stub回傳的pc值是正確的,假設handle_exception function的進入點是在main function裡,可以從symbol table得知main function的起始位子,簡單的計算就可得知stub回傳的pc是否正確了。

接下來的問題是回傳的memory數值不正確,不過應該只是stub哪裡寫錯了,詳細情形我還在找原因。

GDB方面,之前有提到說把register的數值列印出來的指令會導致GDB當掉,原因是出在我GDB裡的TARGET-tdep.c裡對於每個register的宣告上(function enum gdb_regnum)我設定9個register,然而在(function TARGET_analyze_control_transfer)裡分析register裡,也就是switch case裡我少設定一個register,導致找不到那缺少的register case而在default case裡回傳error message的動作。改完後就可以正常的列印出暫存器數值了。

======================8/30========================


debugging stub透過COM port與GDB溝通的方式為RSP(Remote Serial Protocol),其封包格式很簡單: $ddd...#hh。 '$' 是封包的開頭,'ddd...'是十六進位資料且並無限定長度,'#'表示結尾,'hh'為十六進位的兩個checksum。

GDB遠端連線建立好後,會先送出"qSupport",stub收到後回傳"T05"表示停下來的原因是breakpoint,接著stub回傳所有register的資料。以上資訊傳輸完後,GDB就會列印出目前的位值和等待使用者的指令,stub也是在一個無線迴圈內等待GDB的封包。

我目前的遇到的問題是,連線建立後,輸入指令如列印出某暫存器的數值後GDB會死當,根據找的文件是說這可能是BFD那邊的問題,也就是symbol table的問題,真正問題的原因我還在尋找。

至於上個禮拜關於debugging stub回傳暫存器的數值有誤的問題,本來以為燒錄器的問題: 因為同一個程式燒入兩次卻有不同的結果。但是後來請aaa幫忙修理才知道燒錄器沒問題,是晶片at89c51燒壞了。

======================8/24========================

GDB for 8051我想粗分成以下幾個階段:
1. GDB透過COM port能與8051硬體相連,傳輸最基本的功能就是讀寫registers和memory。
2. GDB端的symbol table
3. 支援breakpoint

我目前還在第一階段,想說先架起最基本功能的debugger,可以根據兩端傳輸的資料看出我哪一端有修改錯誤。GDB端要做修改的地方應該比較簡單,主要是修改TARGET-tdep.c和TARGET-dis.c對暫存器的宣告(TARGET=8051)讓GDB認得TARGET的架構;8051硬體端,也就是debugging stub,負責與GDB做溝通,目前最基本的功能就是讀寫暫存器和記憶體。

測試程式方面我是用SDCC (small device c compiler)編譯,產生binary執行檔格式為Intel Hex format。GDB認得這格式為executable file,但是卻會顯示找不到symbol table,因為裡面純粹是程式的資料。不過少了symbol table,GDB應該還是可以讀寫暫存器和記憶體。
目前是卡在debugging stub回傳暫存器的數值有誤,我還在尋找出錯的原因。

第二階段是關於GDB需要的symbol table方面。SDCC編譯C程式可以產生8051的執行檔(Intel Hex Format)和symbol table(CDB format),主要是用於SDCC提供的8051模擬器SDCDB。麻煩的是GDB不支援CDB格式的symbol table,我目前也找不到工具可以將CDB轉成GDB已知的格式如ELF或者COFF等。

GDB認得symbol table的格式定義在BFD,修改BFD讓GDB可以看的懂CDB格式的symbol table,
這應該會是我第二階段要做的。

最後支援breakpoint階段我想等前面的問題釐清後再討論。

======================8/11========================

這是我在meeting時報的paper: Functional Simulation Using Sim-nML
由於時間比較緊迫,我並沒有仔細讀完全部的,上台報告的像是Sim-nML教學。
paper大略的內容是利用Sim-nML語法模擬出一個processor model,作者的Functional Simulator Generator可以parse此model成一個c++的class,並產生一個屬於此processor的simulator。

這simulator可以執行模擬的processor的執行檔,且利用GDB作為介面,remote control這個simulator。

投影片
論文


在meeting的時候提出的討論:
1. (pg. 6) SystemC is targeted more toward system level modeling rather than processor modeling.
對這句話有疑問,systemC不一定就是要用system level來描寫。
2. (pg. 25)—Methods for handling traps and other synchronized events
是指關於interrupt時processor處理的行為,白算盤裡有詳細的解釋。
3. 關於Sim-nML,是有compiler等工具支援,發展至少有十年歷史。