【目次に戻る】

2. モジュールkueshiftの設計


まずは,KUE-CHIP2のシフト命令を処理する回路をSFLで記述します.SFLで は,ある機能を持つひとかたまりの回路をモジュールと呼びます.ここでは, シフト命令を処理する回路をモジュールkueshiftとして設計します. あるモジュールは別のモジュールの中で,サブモジュールとして利用できます. すなわち,階層化設計を行うことができます.モジュールkueshift は,後でKUE-CHIP2全体を設計するときに,サブモジュールshifter として利用されます.

SFL記述 [TOP]

リスト 2.1にモジュールkueshiftのSFL記 述の一例を示します.

5行目から7行目では,外部端子の定義を行っています.キーワード instrin, input, outputは,それぞれ,制御入力端子,データ入力 端子,デー タ出力端子を示します.制御入力端子は,外部からそのモジュー ルに仕事を依頼するためのものです.kueshiftは,doとい う制御入力端子を外部から起動することで,シフト処理を行うものとします. データ入力端子としては,シフトの種類を示すmode<3>と,シフトさ れるデータin<8>と,シフト前のCFの値ciを持つものとし ます.ここで,modeは,8種類のシフト命令のうちの1つを指定する ものですが,表1図2sssに対応させることにします. データ出力端子としては,シフト結果を表す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  }

SECONDSを用いてシミュレーション [TOP]

モジュール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を適当に変更して,いろいろな値で 動作を確認してみてください.

リスト2.3: SECONDSの実行結果
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