2009年3月10日 星期二

Bluespec Helloworld

Helloworld Version 1
一個Bluespec設計應該是多個packages的集合,但在這個範例程式中我們將只會有一個package。
因此我們先開始寫一個叫"FirstAttempt"的package,剛好這是一個練習加註解去解譯這個程式的好機會。
程式如下:
package FirstAttempt;
//My first design in the cool Bluespec language
endpackage

package名稱必需要跟檔名相同,因此我們將上面的程式儲存為"FirstAttempt.bsv"。
請使用下面的命令去編譯它:
bsc FirstAttempt.bsv
它應該可以很正確的被編譯成功,並且沒有任何的錯誤。

然而一個package至少應該包含了一些類型及常數的初使化定義,及一些module的定義。
比如下個範例,我們定義了一個字串,讓我們將來可以將它輸出到螢幕上。
package FirstAttempt;
//My first design in the cool Bluespec language
String s = "Hello world";
endpackage

接下來我們思考一下在這個範例裏的主要module。我們要思考的是它將如何和其它的硬體進行溝通呢?
不管這些硬體都設計在這個模組裏,或是和外部的硬體都需要進行溝通的。因此我們必需決定它的溝通介面。
但在我們這個範例中,是可以完全不理會溝通介面,因此我們並沒有去定義它。

為了方便起見,所有的modules的命名都以"mk"開始命令,並且將這個主要module宣告在package裏,
範例程式如下:
package FirstAttempt;
//My first design in the cool Bluespec language
String s = "Hello world";

module mkAttempt;
endmodule
endpackage

上面的範例就是最基本的一個package加一個module。

接下來我們要為這個module加入rules(規則),而這個rules將直接定義在module的內部。
(通常我們應該都會為module加入interface(界面)以提供跟外界互動,但在這個範例裏我們沒有這麼做)。
這個範例裏我們只有一條規則,規則名稱為"say_hello",它將會使用系統命令"$display"執行輸出文字訊息。
接著我們要將它合成,以進行模擬其執行結果。
範例程式如下:
package FirstAttempt;
//My first design in the cool Bluespec language
String s = "Hello world";

(* synthesize *)
module mkAttempt(Empty);
rule say_hello;
$display(s);
endrule
endmodule
endpackage

Simulation(模擬)
將我們的package轉成Verilog RTL:
bsc -verilog FirstAttempt.bsv
(產生)Verilog file created: mkAttempt.v

產生的verilog檔內容如下
`ifdef BSV_ASSIGNMENT_DELAY
`else
`define BSV_ASSIGNMENT_DELAY
`endif

module mkAttempt(CLK,
RST_N);
input CLK;
input RST_N;

// handling of system tasks

// synopsys translate_off
always@(negedge CLK)
begin
#0;
$display("Hello world");
end
// synopsys translate_on
endmodule // mkAttempt

將mkAttempt.v轉成可執行的模擬程式
bsc -o sim -e mkAttempt mkAttempt.v
./sim

mkAttempt指向我們所設計裏的top-level module。
請試看看它的執行結果,你將會看見每個clock cycle都會執行一次rule,所以會在螢幕上一直印出"Hello world"。

執行畫面如下:

Helloworld version 2
如果你有執行它,你應該發現了,程式並不會停止執行,如果想改成印一次Hello world然後停止程式,
修改程式碼如下:
package FirstAttempt;
String s = "Hello world";

(* synthesize *)
module mkAttempt(Empty);
rule say_hello;
$display(s);
$finish(0);
endrule
endmodule
endpackage


Helloworld version 3
接著我們再改個版本,使它可以執行"Hello world"的命令5次,為了這個目的,我們必需要有一個計數用的暫存器。將計數器宣告在在這module裏,在rule之前。這個計數器需要計數到5,因此3 bits就夠用了,所以我們可以用UInt#(3)來宣告,它的意思是使用無號的3位元整數。我們也指定了暫存器的初使值為0(它指的是一發生reset時就將0放回暫存器中)。
宣告使用計數器程式如下:
package FirstAttempt;
//My first design in the cool Bluespec language
String s = "Hello world";
(* synthesize *)
module mkAttempt(Empty);
Reg#(UInt#(3)) ctr <- mkReg(0);

rule say_hello;
$display(s);
$finish(0);
endrule
endmodule
endpackage

接著我們必需控制什麼時候數值,什麼時候結束。
package FirstAttempt;
//My first design in the cool Bluespec language
String s = "Hello world";
(* synthesize *)
module mkAttempt(Empty);
Reg#(UInt#(3)) ctr <- mkReg(0);

rule say_hello;
ctr <= ctr + 1;
$display(s);
if (ctr == 4) $finish(0);
endrule
endmodule
endpackage

Helloworld version 4
package FirstAttempt;
//My first design in the cool Bluespec language
String s = "Hello world";
(* synthesize *)
module mkAttempt(Empty);
Reg#(UInt#(3)) ctr <- mkReg(0);

rule end_run(ctr == 5);
$finish(0);
endrule

rule say_hello(ctr < 5);
ctr <= ctr + 1;
$display(s);
endrule
endmodule
endpackage

Helloworld version 5
package FirstAttempt;
//My first design in the cool Bluespec language
String s = "Hello world";
(* synthesize *)
module mkAttempt(Empty);
Reg#(UInt#(3)) ctr <- mkReg(0);

rule end_run(ctr == 5);
$finish(0);
endrule

rule say_hello(ctr < 5);
$display(s);
endrule

rule inc_ctr;
ctr <= ctr + 1;
endrule
endmodule
endpackage

自己比較一下version 3/4/5的差異性吧^^

原始官方文件:


資料來源:
Learning Bluespec Wiki
Learning Bluespec
MIT開放式課程

2009年2月27日 星期五

養老計劃

這個是朋友轉寄給我看的文章,還蠻有趣的,貼出來給大家看看囉!

大約兩年前,我太太和我搭乘一艘公主號遊輪經過西地中海。晚餐時,我們注意到有一位老太太單獨坐在大廳的大樓梯邊。我也注意到,所有的工作人員、幹部、服務生、小弟等似乎都和她很熟絡。 我問我們的服務生那位老太太是誰,本以為他會告訴我老太太是船東,但他告訴我他只知道她已經在這艘船上待了四趟航程。
有一天晚上,當我們離開餐廳時,我和她互相看了一眼,於是我就停下來和她打個招呼。我們聊了一下,然後我說:「聽說妳在這艘船上已經參加了前面四趟航程。」她說:「是啊。」我說:「我不明白。」
她立即答道:「這比安養院便宜。」
以下是老太太的看法:
所以,我的將來不會有安養院。
當我年老體衰,我就要搬到一艘公主號遊輪上去。安養院平均每天要花 200 元。我查過公主號遊輪的價錢,我可以有長期折扣和老年折扣,每天只要 135 元。 每天剩下 65 元可以用來:
1. 每天只要 10 元小費。
2. 只要我! 還能走到餐廳,我每天可吃到十餐,不然我也可以叫客房服務,就是每天都可以在床上吃早餐。
3. 公主號有三個游泳池,一間健身房,免費的洗衣機和烘乾機,每天晚上都有表演。
4. 船上有免費的牙膏和刮鬍刀、免費的肥皂和洗髮精。
5. 他們把你當做客人而不是病人。再加 5 元的小費,船上所有的工作人員都會來幫助你。
6. 每 7 到 14 天我都會遇到一些新的人。
7. 電視機壞了嗎?需要換燈泡嗎?需要換床墊嗎?沒問題! !他們會修好所有的東西並為了你的不方便向你致歉。
8. 你都不必要求,每天就有乾淨的床單和毛巾。
9. 如果你在安養院跌倒摔斷了大腿,你就要仰賴醫療保險;如果你在公主號跌倒摔斷了大腿,他們就會把你升級到更好的房間,還有更好的!
10.你想去看南非、巴拿馬運河、大溪地、澳洲、紐西蘭、亞洲,或其他地方?公主號會有船去到那
所以,別去安養院找我,船靠岸時來找我。

又,別忘了,當你死了,
他們就把你從船邊丟下去——不另收費。

-----------------------------------------------------------------------------
奇怪!它是怎麼算的,可以算到一天只要135元@@

參考網址:
富遊網公主遊輪簡介
公主遊輪官網
豪華退休 住郵輪養老 聯合新聞網

2009年2月13日 星期五

Android on x86 展示影片

Android on the HP 2133 Demo


Android on Asus EeePC 901 Demo

Linux kernel 各版本的精進功能

留個專門介紹各個Linux Kernel版本改變的地方

Linux 2.6.34
Linux 2.6.33
Linux 2.6.32
Linux 2.6.31
Linux 2.6.30
Linux 2.6.29
Linux 2.6.28
Linux 2.6.27

Kernel Log: What's coming in 2.6.28 - Part 9: Fastboot and other remainders

API changes in the 2.6 kernel series
Porting device drivers to the 2.6 kernel

Fred's Fastboot 快速開機


資料來源:
fred's fastboot
再談 FastBoot 快速開機簡記

Fred其它文章
桌面開發
快速開發
Fred's Homepage

ACPI和APIC有什麽關系?[轉貼]

很多人問道了什麽ACPI,什麽是APIC,他們有没有關系?名字這麽相近。下面給出我對其的一些理解,具體的解釋可以查看内核文檔庫的内核參數文件:
/usr/src/`uname -r`/Documents/kernel-parameters.txt

ACPI就是Advanced Configuration and Power Interface的縮寫,意思是“高級配置與電源接口”。這是英特爾、微軟和東芝共同開發的一種電源管理標准。
ACPI可實現以下功能:   
1、用户可以使外設在指定時間開關;   
2、使用筆記本電腦的用户可以指定計算機在低電壓的情况下進入低功耗狀態,以保證重要的應用程序運行;   
3、操作系統可以在應用程序對時間要求不高的情况下降低時鐘頻率;
4、操作系統可以根據外設和主板的具體需求為它分配能源;
5、在無人使用計算機時可以使計算機進入休眠狀態,但保證一些通信設備打開;
6、即插即用設備在插入時能够由ACPI來控制。
不 過,ACPI和其他的電源管理方式一様,要想享受到上面這些功能,必須要有軟件和硬件的支持。在軟件方面,Windows 98及其後續産品和Windows 2000都對ACPI給予了全面的支持;而Linux的内核目前對此支持得并不是太理想。硬件方面比較麻煩,除了要求主板、顯卡和網卡等外設要支持 ACPI外,還需要機箱電源的配合。電源在提供5伏電壓給主板的同時,還必須使電流穩定在720毫安以上才可以,這様它才能够實現電腦的“睡眠”和“唤醒 ”。
ACPI共有六種狀態,分別是S0到S5,它們代表的含義分別是:
S0–實際上這就是我們平常的工作狀態,所有設備全開,功耗一般會超過80W;
S1–也稱為POS(Power on Suspend),這時除了通過CPU時鐘控制器將CPU關閉之外,其他的部件仍然正常工作,這時的功耗一般在30W以下;(其實有些CPU降温軟件就是利用這種工作原理)
S2–這時CPU處於停止運作狀態,總線時鐘(Bus Clock)也被關閉,但其餘的設備仍然運轉;
S3–這就是我們熟悉的STR(Suspend to RAM),這時的功耗不超過10W;
S4–也稱為STD(Suspend to Disk),這時系統主電源關閉,但是硬碟仍然帶電並可以被唤醒 再進入系統時需重跑BIOS,如同WindowsXP的睡眠模式行為;
S5–這種狀態是最乾脆的,就是連電源在内的所有設備全部關閉,功耗為0。
我們最常用到的是S3狀態,即Suspend to RAM(載入到記憶體)狀態,簡稱STR。顧名思義,STR就是把系統進入STR前的工作狀態數據都存放到記憶體中去。在STR狀態下,電源仍然繼續為記憶體等 最必要的設備供電,以確保數據不丢失,而其他設備均處於關閉狀態,系統的耗電量極低。一旦我們按下Power按鈕(主機電源開關),系統就被唤醒,馬上從 内存中讀取數據並恢復到STR之前的工作狀態。記憶體的讀寫速度極快,因此我們感到進入和離開STR狀態所花費的時間不過是幾秒鐘而已;而S4狀態,即 STD(載入到硬盤)與STR的原理是完全一様的,只不過數據是保存在硬盤中。由於硬盤的讀寫速度比内存要慢得多,因此用起來也就没有STR那麽快了。 STD的優點是只通過軟件就能實現,比如Windows 2000就能在不支持STR的硬件上實現STD。
之前的電源管理是APM(Advanced Power Management),那麽ACPI和APM相比有什麽區別呢?

2、ACPI與APM比較
APM 1.0&1.1:由BIOS執行電源管理;
APM 1.2:操作系統定義電源管理時間,由BIOS負責執行;
ACPI:BIOS收集硬件信息,定義電源管理方案;由操作系統負責執行。
APM是一種軟件解决方案,因此是與操作系統有關的, 而ACPI是工業標准,包括了軟件和硬件方面的規範。

APIC (高級可編程中斷控制器)對計算機來講有兩個作用
一是管理IRQ的分配,可以把傳統的16個IRQ擴展到24個(傳統的管理方式叫PIC),以適應更多的設備。
二是管理多CPU。由於Nf2主板并不支持多CPU,所以,APIC關閉直接的影響是减少了可用的IRQ。
不過,如果板卡不是非常多的話,關閉 APIC對系統是没有什麽影響的。
要實現SMP功能,我們使用的CPU必須具備以下要求:
CPU 内部必須内置APIC單元。Intel 多處理規範的核心就是高級可編程中斷控制器(Advanced Programmable Interrupt Controllers–APICs)的使用。CPU通過彼此發送中斷來完成它們之間的通信。通過給中斷附加動作(actions),不同的CPU可以在 某種程度上彼此進行控制。每個CPU有自己的APIC(成為那個CPU的本地APIC),並且還有一個I/O APIC來處理由I/O設備引起的中斷,這個I/O APIC是安裝在主板上的,但每個CPU上的APIC則不可或缺,否則將無法處理多CPU之間的中斷協調。
APIC可能遇到的問題,很多這類問題可以通過BIOS更新來解决。
下面的是通過更改HAL類型來解决
  CPU實際運行頻率與BIOS設定頻率不符
  NF2的用户大约有10%的會出現CPU實際運行頻率與BIOS設定頻率不符的問題。我們稱之為“頻率不對”。
  這種現象帶來的直接後果就是在測試3dmark或跑3D游戲的時候,會感覺不流暢,也稱之為“頓”。
   一般在更改BIOS設置後、更新驅動後重啓時,用測試軟件如Aida32、MBM5等可以看到CPU的運行頻率和你在BIOS裏設置得不一様,而且差距 很大。這個時候,用super pi測試CPU速度,會比平常花費時間長好幾秒,用3dmark跑測試,會比平常低幾百分甚至上千分。在3dmark中看到的CPU頻率,也與BIOS設 定不符合。
  如果出現這種情况,則屬於我們所討論的“頻率不對”的問題。
  不過,不是所有的3D游戲“頓”都是這個原因。判斷的方法是:如果你只有個別游戲“頓”,或者用上述軟件測試頻率正確,就不是此問題。
  如果判斷確實屬此問題,解决的方法也很簡單,經過網友討論,只要關閉APIC功能即可。(注意,是APIC,不是ACPI)。

有一些服務器(比如IBM的,HP的),安裝LINUX時,會給出内核的錯誤,導致無法安裝,這個時候可以在安裝的時候輸入linux acpi=off noapic應該是安裝上的。

資料來源:
http://mlsx.xplore.cn/2006/01/12/what-difference-between-acpi-and-apic.html

一個小故事讓我們明白資金流通的意義

“又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...