Simulate Amber on Mac OS

The Amber processor core is an ARM-compatible 32-bit RISC processor. The Amber core is fully compatible with the ARM® v2a instruction set architecture (ISA) and is therefore supported by the GNU toolset.
I would like to try run on my Mac Mini, so, I install Armber, tools and do some modification…

1. Download the Amber project from the Opencores Subversion server

$ mkdir ~/AmberInstallPath
$ cd ~/AmberInstallPath
$ svn --username YOUR_NAME -password PASSWORD co http://opencores.org/ocsvn/amber/amber/trunk

2. Install the GNU cross compiler

$ sudo port install arm-none-linux-gnueabi-gcc
$ sudo port install gawk
$ cd /opt/local/bin
$ sudo ln -s gawk awk
$ sudo ln -s arm-none-linux-gnueabi-gcc-2005q3 arm-none-linux-gnueabi-gcc

3. Install Icarus Verilog Simulator

$ sudo port install iverilog

4. Edit ~/.profile and add the following

$ export AMBER_BASE=~/AmberInstallPath/trunk
$ export AMBER_CROSSTOOL=arm-none-linux-gnueabi

5. Make scripts executable and create a run link

$ cd $AMBER_BASE
$ chmod +x hw/tools/*.sh sw/tools/*.sh
$ ln -s ../tools/run.sh hw/sim/run

6. Create $AMBER_BASE/hw/tools/runIV.patch by following

--- run.sh	2011-04-29 08:47:23.000000000 +0800
+++ runIV.sh	2011-04-29 09:14:21.000000000 +0800
@@ -46,12 +46,9 @@
 AMBER_LOAD_MAIN_MEM=" "
 AMBER_TIMEOUT=0
 AMBER_LOG_FILE="tests.log"
-SET_G=0
 SET_M=0
 SET_D=0
 SET_T=0
-SET_S=0
-SET_V=0
 SET_A=0
 SET_5=0

@@ -59,14 +56,11 @@ SET_5=0
 # show program usage
 show_usage() {
     echo "Usage:"
-    echo "run  [-a] [-g] [-d] [-t] [-s] [-v]"
+    echo "run  [-a] [-d] [-t]"
     echo " -h : Help"
     echo " -a : Run hardware tests (all tests in $AMBER_BASE/hw/tests)"
-    echo " -g : Use Modelsim GUI"
     echo " -d : Create vcd file"
     echo " -t : Create vcd file and terminate"
-    echo " -s : Use Xilinx Spatran6 Libraries (slower sim)"
-    echo " -v : Use Xilinx Virtex6 Libraries (slower sim)"
     echo " -5 : Use Amber25 core instead of Amber23 core"
     echo ""
     exit
@@ -103,14 +97,8 @@ do
             case $1 in
                 -a)     SET_A=1   # all tests
                         shift ;;
-                -s)     SET_S=1   # Xilinx libs
-                        shift ;;
-                -v)     SET_V=1   # Xilinx libs
-                        shift ;;
                 -5)     SET_5=1   # Xilinx libs
                         shift ;;
-                -g)     SET_G=1   # Bring up GUI
-                        shift ;;
                 -d)     SET_D=1
                         DUMP_START=$2
                         shift 2;;
@@ -135,24 +123,7 @@ done
 # Set comfiguration based on command-line options
 #--------------------------------------------------------

-if [ $SET_G == 1 ]; then
-    RUN_OPTIONS="-do cmd.do"
-else    
-    RUN_OPTIONS="${RUN_OPTIONS} -c -do run.do"
-fi
-
-if [ $SET_S == 1 ]; then
-    FPGA="+define+XILINX_SPARTAN6_FPGA +define+XILINX_FPGA"
-    RUN_OPTIONS="${RUN_OPTIONS} -t ps  +notimingchecks -L unisims_ver -L secureip"
-else    
-    if [ $SET_V == 1 ]; then
-        FPGA="+define+XILINX_VIRTEX6_FPGA +define+XILINX_FPGA"
-        RUN_OPTIONS="${RUN_OPTIONS} -t ps  +notimingchecks"
-    else    
-        FPGA=" "
-    fi
-fi
-
+RUN_OPTIONS="-f iverilog.f"

 if [ $SET_D == 1 ]; then
     AMBER_DUMP_VCD="+define+AMBER_DUMP_VCD +define+AMBER_DUMP_START=$DUMP_START"
@@ -173,13 +144,8 @@ else    
 fi

 if [ $SET_A == 1 ]; then
-    if [ $SET_S == 1 ]; then
-        TECH="-s"
-    elif [ $SET_V == 1 ]; then
-        TECH="-v"
-    else    
-        TECH=" "
-    fi        
+
+    TECH=" "

     if [ $SET_5 == 1 ]; then
         CORE="-5"
@@ -273,54 +239,42 @@ fi

 #--------------------------------------------------------
-# Modelsim
+# iVerilog
 #--------------------------------------------------------
-if [ $MAKE_STATUS == 0 ]; then
-   if [ ! -d work ]; then
-       vlib work
-   fi
-
-   if [ $? == 0 ]; then
-       vlog +libext+.v 
-            +incdir+../vlog/amber23+../vlog/amber25+../vlog/system+../vlog/tb+../vlog/ethmac 
-            +incdir+../vlog/lib+../vlog/xs6_ddr3+../vlog/xv6_ddr3 
-            -y ../vlog/amber23 -y ../vlog/amber25 -y ../vlog/system  -y ../vlog/tb -y ../vlog/ethmac 
-            -y ../vlog/lib   -y ../vlog/xs6_ddr3 -y ../vlog/xv6_ddr3  
-            -y $XILINX/verilog/src/unisims 
-            -y $XILINX/verilog/src 
-            ../vlog/tb/tb.v 
-            $XILINX/verilog/src/glbl.v 
-            +define+BOOT_MEM_FILE="$BOOT_MEM_FILE" 
-            +define+BOOT_MEM_PARAMS_FILE="$BOOT_MEM_PARAMS_FILE" 
-            +define+MAIN_MEM_FILE="$MAIN_MEM_FILE" 
-            +define+AMBER_LOG_FILE="$AMBER_LOG_FILE" 
-            +define+AMBER_TEST_NAME="$AMBER_TEST_NAME" 
-            +define+AMBER_SIM_CTRL=$TEST_TYPE 
-            +define+AMBER_TIMEOUT=$AMBER_TIMEOUT 
-            ${FPGA} 
-            $AMBER_CORE 
-            $AMBER_DUMP_VCD 
-            $AMBER_TERMINATE 
-            $AMBER_LOAD_MAIN_MEM
-                  
-        if [ $? == 0 ]; then
-            vsim -voptargs="+acc=rnpc" tb ${RUN_OPTIONS}
-            
-            # Set a timeout value for the test if it passed
-            if [ $TEST_TYPE == 1 ]; then
-                tail -1  /dev/null
-                if  [ $? == 0 ]; then
-                    TICKS=`tail -1 > $AMBER_LOG_FILE
-fi
+      echo "+libext+.v"                > iverilog.f
+      echo "+incdir+../vlog/amber23"  >> iverilog.f
+      echo "+incdir+../vlog/amber25"  >> iverilog.f
+      echo "+incdir+../vlog/system"   >> iverilog.f
+      echo "+incdir+../vlog/tb"       >> iverilog.f
+      echo "+incdir+../vlog/ethmac"   >> iverilog.f
+      echo "+incdir+../vlog/lib"      >> iverilog.f
+      echo "+incdir+../vlog/xs6_ddr3" >> iverilog.f
+      echo "+incdir+../vlog/xv6_ddr3" >> iverilog.f
+      echo "-y../vlog/amber23"        >> iverilog.f
+      echo "-y../vlog/amber25"        >> iverilog.f
+      echo "-y../vlog/system"         >> iverilog.f
+      echo "-y../vlog/tb"             >> iverilog.f
+      echo "-y../vlog/ethmac"         >> iverilog.f
+      echo "-y../vlog/lib"            >> iverilog.f
+      echo "-y../vlog/xs6_ddr3"       >> iverilog.f
+      echo "-y../vlog/xv6_ddr"        >> iverilog.f
+      echo "+define+BOOT_MEM_FILE="$BOOT_MEM_FILE""               >> iverilog.f
+      echo "+define+BOOT_MEM_PARAMS_FILE="$BOOT_MEM_PARAMS_FILE"" >> iverilog.f
+      echo "+define+MAIN_MEM_FILE="$MAIN_MEM_FILE""               >> iverilog.f
+      echo "+define+AMBER_LOG_FILE="$AMBER_LOG_FILE""             >> iverilog.f
+      echo "+define+AMBER_TEST_NAME="$AMBER_TEST_NAME""           >> iverilog.f
+      echo "+define+AMBER_SIM_CTRL=$TEST_TYPE"                      >> iverilog.f
+      echo "+define+AMBER_TIMEOUT=$AMBER_TIMEOUT"                   >> iverilog.f
+      echo "$AMBER_CORE"          >> iverilog.f
+      echo "$AMBER_DUMP_VCD"      >> iverilog.f
+      echo "$AMBER_TERMINATE"     >> iverilog.f
+      echo "$AMBER_LOAD_MAIN_MEM" >> iverilog.f
+      echo "../vlog/tb/tb.v"      >> iverilog.f
+
+      rm -rf ./armber
+      iverilog -f iverilog.f -o armber
+      ./armber

7. Create runIV script for iverilog simulator

$ cd $AMBER_BASE/hw/tools
$ patch -o runIV.sh -i runIV.patch
$ chmod +x runIV.sh
$ cd $AMBER_BASE/hw/sim
$ ln -s ../tools/runIV.sh runIV

8. If you see the iverilog compile error message for log2 function in next step, you could replace log2 by $clog2 to solve the problem.

9. Run a Hello-World Test with Amber 25

$ cd $AMBER_BASE/hw/sim
$ runIV -5 hello-world

10. Hello-World simulation Result

Amber Boot Loader v20110202130047
Hello, World!

----------------------------------------------------------------------------
Amber Core
       > User         FIRQ         IRQ          SVC
r0       0x00000010
r1       0x16000000
r2       0x00000000
r3       0x00000000
r4       0x0c80e403
r5       0x00000000
r6       0x00000000
r7       0x00000000
r8       0xdeadbeef   0xdeadbeef 
r9       0xdeadbeef   0xdeadbeef 
r10      0x00000011   0xdeadbeef 
r11      0xf0000000   0xdeadbeef 
r12      0x00000000   0xdeadbeef 
r13      0x08000000   0xdeadbeef   0xdeadbeef   0x01ffffb8
r14 (lr) 0x0080e420   0xdeadbeef   0xdeadbeef   0x20000787
r15 (pc) 0x0080e960

Status Bits: N=0, Z=1, C=1, V=0, IRQ Mask 0, FIRQ Mask 0, Mode = User          
----------------------------------------------------------------------------

++++++++++++++++++++
Passed hello-world 29320 ticks
++++++++++++++++++++

MacPort selfupdate fail ?

剛才突然發現,做 MacPort 的 selfupdate 時會失敗,
上次做還 OK 啊..?

$sudo port -f selfupdate
Warning: No index(es) found! Have you synced your source indexes?
---> Updating the ports tree
Error: Synchronization of the local ports tree failed doing rsync
Error: /opt/local/bin/port: port selfupdate failed: Couldn't sync the ports tree: Synchronization of 1 source(s) failed

測試一下公司網路:

$ telnet rsync.macports.org 873
Trying 17.254.20.244...

嗯,Port 873 出不去!
沒想到,公司 MIS 連 rsync 的 port 也給封了!真是麻煩,
費了一番功夫後,
終於可以做 selfupdate 了:

$ sudo port selfupdate
Warning: No index(es) found! Have you synced your source indexes?
---> Updating the ports tree
---> Updating MacPorts base sources using rsync
MacPorts base version 1.9.2 installed,
MacPorts base version 1.9.2 downloaded.
---> MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
port upgrade outdated

奇怪的問題,無法理解!?

家裡有三台 Mac,分別是 Mac Mini, iMac and Macbook
但 Mac Mini 最近發生了一件怪事:

用 iTunes 在看朋友分享的『棋靈王』卡通時,
突然發現『只有影像卻沒有聲音』的現象,
可是以前看過啊,沒問題啊….
且看其他影片卻是正常,
反覆實驗,確認只有『棋靈王』系列影片(全集)有問題,
其他的影片完全正常!

難道是,檔案故障?
立刻將檔案複製到其他電腦 iMac and Macbook
結果一切正常:檔案沒壞!

在 Mac Mini 反覆做了一些實驗:
1. Safari 看 Youtube,影像聲音正常。
2. 用 Quicktime 看影片, 影像聲音正常。
3. 用 iTunes 看其他影片,影像聲音正常。
4. 用 iTunes 看『棋靈王』,只有影像,沒有聲音。
5. iTunes 砍掉重裝,沒用!
6. 用 QuickTime 看『棋靈王』,一樣,只有影像,沒有聲音。
7. 用 VLC 看『棋靈王』,一樣,只有影像,沒有聲音。
8. 用 MPlayer 看『棋靈王』,一樣,只有影像,沒有聲音。
9. 磁碟工具程式->修復權限,沒用!

難掉是 Mac OS 系統內部 某個 Audio Codec 掛了,
而這 Audio Codec 恰巧只有『棋靈王』用到?
這麼巧?
在 Google 不到有用的資訊下,
只好使出絕招:OS重灌!

一個半小時後…
暈倒!完全沒用,結果一樣!
WHY?WHY?WHY?WHY?

難道我的 Mac Mini 被 佐為 附身了?

就當我看著無聲影片,絕望沮喪之時,
手一不小心碰到外接喇叭的音源線,
突然,聲音出現了!!!
好像是,音源線接頭 與 MacMini 的耳機插孔 接觸不良,
碰一下 OK,再碰一下 聲音又會消失

不對!
要真是真是『音源線接頭 與 MacMini 的耳機插孔 接觸不良』
怎會只有『棋靈王』會有問題,其他的都OK
奇怪,不合理啊…..

將『音源線接頭』拔下,用橡皮擦,用力的擦一擦,
再裝回去後,『棋靈王』影音 就 穩定正常了。

嗯,很怪,得好好研究研究了…..

衝破封鎖線

由於公司將 MSN 給封鎖了,所以決定要自行突圍

Step.1 Download Tor for Mac OS Vidalia

    將 Vidalia 拖到 Application目錄後執行,到 控制面板 去 “啟動 Tor”
    這時 Vidalia 的狀態 會顯示:『已連線到 Tor 網路!』

Step. 2 Test Tor

    到 系統偏好設定-網路-進階-代理伺服器
    設定 HTTP and HTTPS Proxy = localhost:8188

    接著,用 Safari 訪問 Are you using Tor?
    看到

    就知道 Tor 網路使已經建立…

    若看到

    就知道 Tor 連線有問題,要先解決 Tor 的問題。
    測試完成後,記得將系統的 HTTP Proxy 改回來。

Step. 3 MSN Proxy Setting

    到 Messenger-Preference-Account 設定 Socks Proxy = localhost:9050

    這樣就可衝破封鎖線了!

PS1. 不知為何 Messenger Proxy Type 選 HTTP 的話,是衝不出去的,可能公司防火牆比較厲害。
PS2. Vidalia 控制面板 的 語系要到 Vidalia-Preference-外觀-語系 去變更, 可是卻是要選擇『簡體字』才會出現 繁體中文,這應該是打錯字了。

在 Mac OS 10.6 下安裝 SID Simulator

寫了一個 Makefile 來編譯並安裝 SID Simulator 在 Mac OS 10.6

#
# Build and Install SID
#

TAR_FILE    = $(CURDIR)/sid-20110301.tar.bz2
BUILD_DIR   = $(CURDIR)/SID_BUILD
SRC_DIR     = $(CURDIR)/SID_SRC
INSTALL_DIR = $(CURDIR)/SID_INSTALL

info:
        @echo "Current DIR is $(CURDIR)"
        @echo "make extract  ; Extraction Compressed File"
        @echo "make config   ; Build Makefile"
        @echo "make compile  ; Compile Source Code"
        @echo "make installe ; Install SID"

all: extract config compile install

extract: $(SRC_DIR)
        (cd $(SRC_DIR); tar -jxvf $(TAR_FILE))

config: $(BUILD_DIR) $(INSTRALL_DIR)
        (cd $(BUILD_DIR); $(SRC_DIR)/src/configure --prefix=$(INSTALL_DIR) LDFLAGS=-L/usr/X11/lib)

compile: $(BUILD_DIR)
        (cd $(BUILD_DIR); make)

install: $(BUILD_DIR) $(INSTALL_DIR)
        (cd $(BUILD_DIR); make install)

$(SRC_DIR):
        @echo [INFO] Create $@
        mkdir $@

$(BUILD_DIR):
        @echo [INFO] Create $@
        mkdir $@

$(INSTALL_DIR):
        @echo [INFO] Create $@
        mkdir $@

clean:
        rm -rf $(SRC_DIR)
        rm -rf $(BUILD_DIR)

使用 Mac OS TimeMachine 來轉移系統 的注意事項

最近因為 Macbook 的 350GB HDD 容量已滿
所以買了 750GB 的新 HDD 來換
這次 因為 手邊剛好沒有 2.5inch HDD USB 外接盒
所以沒辦法直接用『復原』來做系統移轉
所以這次改用 TimeMachine 的備份來轉移資料

Step.1 換上 new 750GB new HDD
Step.2 Install Snow Leopard on new HDD
Step.3 Transfer User Data, System Setting and Application from Time Machine Backup.

雖然轉移過程一次順利,User Data 似乎也都順利轉移
但是,有一些問題:

1. 原系統有安裝 SVN+http Server,但 TimeMachine 似乎未將相關設定一併復原。
2. 原來放在 /User/SVN-ROOT 的 svn repository 也沒轉移到 new HDD。

解決方法:

1. SVN+http Server 的相關設定 似乎沒有備份在 Time Machine,所以只好自已重新建立。
2. SVN Repository 雖然有備份在 Time Machine 可是卻沒有自動復原,可能是我放在 /User 目錄下的關係,所以只好手動回復。

未來,換HDD時,還是使用 磁碟工具中的『復原』,比較沒問題。

影片字幕檔的編碼

在觀看友人分享的影片時,
最常遇到的麻煩事:『字幕都是亂碼!』
原因十之八九都是編碼問題,
由於友人大都是 Windows 環境,
所以文字檔大都沿用 BIG5 編碼,
可是 BIG5 在 Mac OS 下卻是行不通的,
一個簡單指令可以迅速完成編碼轉換:

$ iconv -f BIG5-2003 -t UTF-8 BIG5.srt > UTF8.srt