まずは,KUE-CHIP2のシフト命令を処理する回路をSFLで記述します.SFLで は,ある機能を持つひとかたまりの回路をモジュールと呼びます.ここでは, シフト命令を処理する回路をモジュールkueshiftとして設計します. あるモジュールは別のモジュールの中で,サブモジュールとして利用できます. すなわち,階層化設計を行うことができます.モジュールkueshift は,後でKUE-CHIP2全体を設計するときに,サブモジュールshifter として利用されます.
リスト 2.1にモジュールkueshiftのSFL記 述の一例を示します.
5行目から7行目では,外部端子の定義を行っています.キーワード instrin, input, outputは,それぞれ,制御入力端子,データ入力 端子,デー タ出力端子を示します.制御入力端子は,外部からそのモジュー ルに仕事を依頼するためのものです.kueshiftは,doとい う制御入力端子を外部から起動することで,シフト処理を行うものとします. データ入力端子としては,シフトの種類を示すmode<3>と,シフトさ れるデータin<8>と,シフト前のCFの値ciを持つものとし ます.ここで,modeは,8種類のシフト命令のうちの1つを指定する ものですが,表1や図2のsssに対応させることにします. データ出力端子としては,シフト結果を表すout<8>と,シフト後の 各フラグを表すco, vo, no, zoを用意します.
13行目から40行目には,制御入力端子doが起動されたときに行 う動作が記述されています.ここで,==は一致判定を, in<7>やin<7:1>などはビット切り出しを,||は ビットの連結を,/|は桁方向のorを表しています.KUE-CHIP2のシフ ト命令のシフトの量はすべて1ビットです.シフトの際に入り込んでくる値は, 一時的にedgebitというデー タ内部端子に保持するものとします. 10行目のselはデータ内部端子を示します.25行目から28行目は right方向のシフトの動作,29行目から32行目はleft方向のシフトの動作です. 34行目から37行目は,桁あふれフラグVFに関する記述です.SLA命令とRLA命令 で,シフト前とシフト後で最上位ビットが異なるときに,桁あふれとみなされ ます.図2のシフト命令の説明と照らし合わせ れば,SFL記述の意味が良く分かると思います.
以上で,リスト2.1の説明は終わりです.kueshiftのSFL記述は, kueshift.sflというファイルに格納することにします.
リスト2.1: SFL記述 (kueshift.sfl) [TOP]1 /** kueshift : shifter for KUE-CHIP2 **/ 2 3 module kueshift { 4 /** external pins **/ 5 instrin do; 6 input mode<3>, in<8>, ci; 7 output out<8>, co, vo, no, zo; 8 9 /** contents **/ 10 sel edgebit; 11 12 /** operations of instrin **/ 13 instruct do par { 14 any { /* edgebit */ 15 mode == 0b000 : edgebit = in<7>; 16 mode == 0b001 : edgebit = 0b0; 17 mode == 0b010 : edgebit = 0b0; 18 mode == 0b011 : edgebit = 0b0; 19 mode == 0b100 : edgebit = ci; 20 mode == 0b101 : edgebit = ci; 21 mode == 0b110 : edgebit = in<0>; 22 mode == 0b111 : edgebit = in<7>; 23 } 24 any { /* out, co */ 25 mode<0> == 0b0 : par { /* right */ 26 out = edgebit || in<7:1>; 27 co = in<0>; 28 } 29 mode<0> == 0b1 : par { /* left */ 30 out = in<6:0> || edgebit; 31 co = in<7>; 32 } 33 } 34 any { /* vo */ 35 mode<1:0> == 0b01 : vo = out<7> @ in<7>; /* SLA, RLA */ 36 else : vo = 0b0; 37 } 38 no = out<7>; 39 zo = ^(/| out); 40 } 41 }
モジュールkueshiftのSFL記述が完成したら,SECONDSを用いてそ の動作を確かめてみます.リスト2.2に,そのためのSECONDSのコマンド列を用 意しましたので,これを利用してください.3行目ではSFL記述を読み込み,4 行目ではシミュレーションイメージを構築しています.6行目から8行目では, レポートの書式を設定しています.report doでレポートを表示させ ます.setで端子に値を設定します.
リスト2.2: SECONDSへのコマンド列(kueshift.sec)1 # simulation data for kueshift 2 3 sflread kueshift.sfl 4 autoinstall kueshift 5 6 rpt_add ext \ 7 "do=%B mode=%B in=%B ci=%B out=%B cvnz=%B%B%B%B\n" \ 8 do mode in ci out co vo no zo 9 10 # sleep 11 report do 12 set mode 000; set in 00001111; set ci 1; report do 13 14 # execute 15 set do 1 16 set mode 000; set in 00001111; set ci 1; report do 17 set mode 001; set in 00001111; set ci 1; report do 18 set mode 010; set in 00001111; set ci 1; report do 19 set mode 011; set in 00001111; set ci 1; report do 20 set mode 100; set in 00001111; set ci 1; report do 21 set mode 101; set in 00001111; set ci 1; report do 22 set mode 110; set in 00001111; set ci 1; report do 23 set mode 111; set in 00001111; set ci 1; report do 24 25 set mode 000; set in 11110000; set ci 1; report do 26 set mode 001; set in 11110000; set ci 1; report do 27 set mode 010; set in 11110000; set ci 1; report do 28 set mode 011; set in 11110000; set ci 1; report do 29 set mode 100; set in 11110000; set ci 1; report do 30 set mode 101; set in 11110000; set ci 1; report do 31 set mode 110; set in 11110000; set ci 1; report do 32 set mode 111; set in 11110000; set ci 1; report do
リスト 2.2の内容を,kueshift.secというファイルに保存して,コマンドプロ
ンプトで,
% seconds < kueshift.sec
としてみてください.SFL記述が正しければ,リスト2.3のような結果となるは
ずです.ここで,何も設定していないときの制御入力端子doの値は0
であることがわかります.このときはまだdoは起動されていません.
従って,いくらデータ入力端子に値を設定しても,データ出力端子には結果が
出力されません.一方,setコマンドでdoに1を設定すると,
結果がきちんと出力されました.これは,doが起動されて,シフト
処理を行ったからです.また,値を設定しなければ,制御入力端子の場合はそ
の値が0となっていますが,データ入力端子の場合はその値がz(不
定)となっていることに注意してください.この違いは,一般に,制御端子と
データ端子にあてはまります.リスト2.2を適当に変更して,いろいろな値で
動作を確認してみてください.
do=0 mode=zzz in=zzzzzzzz ci=z out=zzzzzzzz cvnz=zzzz do=0 mode=000 in=00001111 ci=1 out=zzzzzzzz cvnz=zzzz do=1 mode=000 in=00001111 ci=1 out=00000111 cvnz=1000 do=1 mode=001 in=00001111 ci=1 out=00011110 cvnz=0000 do=1 mode=010 in=00001111 ci=1 out=00000111 cvnz=1000 do=1 mode=011 in=00001111 ci=1 out=00011110 cvnz=0000 do=1 mode=100 in=00001111 ci=1 out=10000111 cvnz=1010 do=1 mode=101 in=00001111 ci=1 out=00011111 cvnz=0000 do=1 mode=110 in=00001111 ci=1 out=10000111 cvnz=1010 do=1 mode=111 in=00001111 ci=1 out=00011110 cvnz=0000 do=1 mode=000 in=11110000 ci=1 out=11111000 cvnz=0010 do=1 mode=001 in=11110000 ci=1 out=11100000 cvnz=1010 do=1 mode=010 in=11110000 ci=1 out=01111000 cvnz=0000 do=1 mode=011 in=11110000 ci=1 out=11100000 cvnz=1010 do=1 mode=100 in=11110000 ci=1 out=11111000 cvnz=0010 do=1 mode=101 in=11110000 ci=1 out=11100001 cvnz=1010 do=1 mode=110 in=11110000 ci=1 out=01111000 cvnz=0000 do=1 mode=111 in=11110000 ci=1 out=11100001 cvnz=1010