HW実験Tips

バイナリ版read_int, read_float

誰得だけど、入力がビッグエンディアンのときの、3班のread_intとread_floatの実装(バイナリ読み込み版)。

確か審判サーバを-bオプションをつけて実行するとビッグエンディアンになると思います。

! 入力はビッグエンディアンとする

! 返り値は%g3
min_caml_read_int:
        ! 0で初期化
        add %g3, %g0, %g0

        ! 24bit目 ~ 31bit目
        input %g4
        add %g3, %g3, %g4
        slli %g3, %g3, 8

        ! 16bit目 ~ 23bit目
        input %g4
        add %g3, %g3, %g4
        slli %g3, %g3, 8

        ! 8bit目 ~ 15bit目
        input %g4
        add %g3, %g3, %g4
        slli %g3, %g3, 8

        ! 0bit目 ~ 7bit目
        input %g4
        add %g3, %g3, %g4

        return

! 返り値は%f0
min_caml_read_float:
        ! %f0 = imovf(min_caml_read_int())
        call min_caml_read_int
        sti %g3, %g1, 0
        fldi  %f0, %g1, 0

        return

全部Makefileで済ませてみた

とりあえずMakefileを晒します。

LIBDIR = ../lib
LIBMINCAML = ../compiler/FirstArch/libmincaml.s

SIMDIR = ../simulator
CMPDIR = ../compiler
HWDDIR = ../hardware/debugger

CMP = $(CMPDIR)/min-caml
ASM = $(SIMDIR)/asm
SIM = $(SIMDIR)/sim

IMPACT = ${HOME}/Xilinx/ISE_DS/ISE/bin/lin64/impact -batch

SLEEP = @sleep 1

.PHONY: all clean

.PRECIOUS: %.bin %.s %.txt

all: 
        @echo "please specify the target."

libs: 
        $(MAKE) --directory $(LIBDIR)
sim:
        $(MAKE) --directory $(SIMDIR)
asm:
        $(MAKE) --directory $(SIMDIR)
cmp:
        $(MAKE) --directory $(CMPDIR)
loader:
        $(MAKE) --directory $(HWDDIR)

%.s: %.ml cmp
        $(CMP) $*

%.bin: %.s $(LIBMINCAML) libs asm
        $(ASM) $(LIBMINCAML) $(LIBDIR)/*.s $< -o $@

%.txt: %.bin sim
        $(SIM) $<
        $(SLEEP)

%.hw: %.bin loader
        $(IMPACT) loader.impact.cmd > /dev/null 2>&1
        $(SLEEP)
        $(HWDDIR)/loader -s 0 $< > /dev/null 2>&1
        $(SLEEP)
        $(IMPACT) 1starch.impact.cmd > /dev/null 2>&1
        $(HWDDIR)/receiver

%: %.s
%: %.txt
        
# このTabは重要!

clean:
        rm -f *~ *.s *.kn *.bin *.txt a.out

\tが半角スペースになってしまっているかもしれません。
また、このMakefileは高確率で稚拙です

使い方は、make (ファイル名から.mlを除いたもの) で、.mlのコンパイル、.sのアセンブル、バイナリの実行をやってくれます。必要ならば、コンパイラ・アセンブラ・シミュレータのコンパイルもしてくれるので、「なんかおかしいぞ、あっシミュレータ古かった」という事もなくなっています。

また、impactで.bitを焼いて、命令列をローダで送って、、、というのも非常に煩わしかったので自動化しました。
impact -batch (コマンドファイル) でimpactをCUIで扱えるのがキモです。コマンドファイルは、いつもimpactを使っていると勝手に出来ている_impact.cmdを参考にします。また、GUIでの実行中にも、下のペインをConsoleにすれば、logと一緒に表示されています。(GUIの操作とコマンドを対応付けられます。)
参考までに、loader.impact.cmdを晒します。

setMode -bs
setCable -port auto
Identify -inferir
identifyMPM
assignFile -p 2 -file ../hardware/1starch/top.bit
Program -p 2
quit

ただし、このHW自動化は、ちょっと挙動が怪しいので、フィードバックを募集中です。


Categoryノート

プロセッサ・コンパイラ実験/Tips (最終更新日時 2012-03-09 17:35:57 更新者 furaga)