トップ

SFLメモ

SFLに関する覚書とか

SFLチュートリアル

SFLのチュートリアル(NSLにも対応)を公開中です。

nsl.vim を vim.org に登録しました

http://www.vim.org/scripts/script.php?script_id=3904

こちらのほうが最新版で、変更を加えてあるかもしれません → https://github.com/metanest/nsl_vim

少しでも何か気付かれたことなどありましたら、なんでもお知らせください

NSL について

マニュアルやドキュメント類には記述がないが、Verilog HDLのシステムタスク $write 相当として _write が使える。

NSL( http://www.overtone.co.jp/products/about_nsl/ )における SFL からの変更点について主なものをまとめる

その他メモ

作ったもの

他人の作ったもの

研究会仕様書の仕様に関するメモ

古い仕様と現行(研究会仕様書)の変更点

記述上の注意点

ex. a & b | c == a & (b | c)
    a | b & c == a | (b & c)

定数表記の Tips

たとえば 10 ビットの定数を 16 進と 2 進で交ぜ書きする場合 0x00ob01 のように書く。2 進プレフィックスの b が 16 進表記に呑まれないためにダミーの o を置く(このような記法は sfl2vl や NSL ではできなくなっている)。

any alt の使用例

ガードの条件が排他的なら any

/* セレクタ */
input i<4>;
input s<2>;
output o;
instrin do;

instruct do any {
s == 0b00 : o = i<0>;
s == 0b01 : o = i<1>;
s == 0b10 : o = i<2>;
s == 0b11 : o = i<3>;
}

ガードの条件が独立なら any

/* to be written */

alt のガードの記述順を利用する例

/* プライオリティエンコーダ */
input i<4>;
output o<2>;
instrin do;

instruct do alt {
i<3> : o = 0b11;  /* i == 0b1??? */
i<2> : o = 0b10;  /* i == 0b01?? */
i<1> : o = 0b01;  /* i == 0b001? */
i<0> : o = 0b00;  /* i == 0b0001 */
}

else の利用例

/* to be written */

par と any と alt は代用可能

仮に par と any と alt のどれかが無かったとしても、残りを使い、次のようにして記述は可能である(読み書きしにくいが)

par

par {
  stmt1
  stmt2
  stmt3
  ...
}

これは以下と同等である。たとえば、ネストを深くしたくない時にこの書き換えは利用できる

any {
  0b1 : stmt1
  0b1 : stmt2
  0b1 : stmt3
  ...
}

any

any {
  cond1 : stmt1
  cond2 : stmt2
  cond3 : stmt3
  ...
}

これは以下と同等である

par {
  alt {
    cond1 : stmt1
  }
  alt {
    cond2 : stmt2
  }
  alt {
    cond3 : stmt3
  }
  ...
}

alt

alt {
  cond1 : stmt1
  cond2 : stmt2
  cond3 : stmt3
  ...
}

これは以下と同等である

any {
  cond1 : stmt1
  ^cond1 & cond2 : stmt2
  ^cond1 & ^cond2 & cond3 : stmt3
  ...
}

文法が LALR(2)

alu32 という名前のモジュールがあるとする

declare alu32 {
  ...
}

module foo {
  alu32 alu32;   ← 左の alu32 は、この時点では構成要素の定義(サブモジュール)
          右の alu32 は、名前空間がモジュール名とサブモジュール名で
          分かれているので(?)合法。
  alu32 ??????   ← この alu32 は、構成要素の定義(サブモジュール)の開始か、
          共通動作の定義の一部か ?????? を読まないとわからない。
          ?????? が名前なら構成要素の定義(サブモジュール)、
          . なら共通動作の定義の一部(サブモジュールの参照)。

LALR(1) パーサジェネレータでは shift/reduce conflict になる。
デフォルト(shift)では、 サブモジュールの定義とみなされ、共通動作のつもりだと次の記号で名前の出現を期待しているため構文エラーとなる。回避のためには共通動作を par { alu32.〜; } のようにくくってやればよい。

(なお、NSL Core ではこのような名前のかぶらせかたをするとウォーニングが出る)

その他

実装に関するメモ

sfl2vl

Links

その他メモ

Quote

http://www.am.ics.keio.ac.jp/pocobook/verilog.htm から引用「本当のことを言うと、個人的には、もっとも優れたハードウェア記述言語はSFLだと思っている。これは、本書の最初の版で設計用言語として使ったものであり、NTTにより設計された純国産製で、美しいシンタックスを持っている。残念ながらもう現場では使われていないが、VerilogやVHDLのおっさんたちだけを見て、ハードウェア言語ってこんなもんか、と思われるのは、本当は困るのである。一面、ハードウェア設計者は、僕も含めて言語なんて問題ではなく、本当に問題なのはそれで書く設計対象である、と思っているので、これが結果として、変なおっさんたちをはびこらせる結果となるのかもしれない。」

(注: 言語マニアとしてコメントすると、キモはシンタックス(構文)よりセマンティクス(意味)じゃないかという気もする)