goo blog サービス終了のお知らせ 

組み込まれたエンジニア

我輩は石である。名前はまだ無い。

LiveCygwin-edaにサンプル追加

2009-09-19 23:04:09 | Weblog
SYNディレクトリに、Allianceを用いるレイアウト設計のサンプルを追加した。

cd SYN
make chip.cif


で、チップレイアウトを作成し、CIFファイルを作る。
XmingなどのXサーバをインストールしてあれば、

make dreal

で、グラフィカルにレイアウト表示をしてくれる。
(デフォルトではアウトラインだけだが、Tool->Flattenで詳細まで表示)

モジュール共通動作記述の緩和

2009-09-17 14:53:18 | Weblog
モジュール共通動作のみのモジュールにおいて、複数の動作を並列に記述するときに、もっとシンプルに書けた方がうれしいので、下記のような記法を許すことにした。
  • NSL 表記
    module mm {
    input a;
    output f;
    reg r;
      r:=a;
      f=r;
    }
    


  • 生成されたVerilog
    module mm ( p_reset , m_clock , f , a );
      input p_reset, m_clock;
      output f;
      input a;
      reg r;
       assign  f = r;
    always @(posedge m_clock)
      begin
      r <= a;
    end endmodule



i8086互換CPU

2009-09-17 08:49:35 | Weblog
O氏のCPUパッケージもI氏のPDP11と同じく、インスタンスの引数で端子のバインドをしているので、端子順序の変更に伴い、変更が必要だった。
(これは、彼らが私が書いたveriskelというシミュレーションスケルトンジェネレータを使っているからなんで、遠因は私自身にある)

が、確認すると、それだけではなく、端子が見つからないというエラーがでる?

SFLでは、declareとmoduleは別々に記述可能だったが、今回、declareの端子記述を優先としたことで、O氏の記述で、二つがアンマッチになっている部分でエラー。これは、記述側を変更。

自分のインベーダーパッケージ(midway)を確認すると、クロック端子の二重定義が・・

interface文で明示的にクロック・リセットを記述して、本体のmodule記述もある場合、こうなる。今回は、BRAMに推定させるRAMの記述で発生。これは、sfl2vl側を修正することにする。interface文を持つdeclare宣言されているモジュールでは、クロック・リセット端子を自動ではインスタンス生成しないことにする。
もちろん、内部回路のクロック・リセット信号はデフォルトのものを使うので、勝手な名前をつけるわけにはいかないが・・

この副作用(?)によって、組み合わせ回路だけからなるモジュールでは、
  • 下記の記述によって、
    declare BUFG interface {
     input I;
     output O;
    }
    
    module BUFG {
     O = I;
    }
    

  • 次のような出力が得られる。
    module BUFG ( I , O );
      input I;
      output O;
       assign  O = I;
    endmodule
    



20090917版からの提供:このバージョンでは、NSL状態遷移の新文法時({ }内の状態)のバグをあわせて対策

Linuxのファイルディスクリプタ

2009-09-16 05:16:53 | Weblog
ubuntuで、sfl2vlの動作確認中、ライセンスファイルを用意しているにも関わらず、ライン数オーバーのエラーが出た。

straceで解析すると、どうやら、openしたファイルをクロースしても、ファイルディスクリプタが解放されていない気がする。

ファイルディスクリプタ番号がクロース後も増え続け、too many open fileでオープンが失敗する。手元の他のシステムでは問題ないので、AMD64上でia32プログラムを実行したときだけ?

今日はマシンに触れないので、確認できないが、考えてみれば、x86_64用のsfl2vlも用意していたのであった。これと動作を比較すれば、もう少し解明できそうだ。

う~む・・・

とりあえず、商用ライセンス時には、毎行ごとのライセンスファイル確認を停止し、回避するが、クロースしているのに、too many open fileってあんまりな実装だよな。

それとも、細かくopen/closeはするなってこと?

PDP11互換CPU

2009-09-16 00:19:13 | Weblog
このところ、大規模なコード変更中の、sfl2vlのデバグのため、昔の大き目のパッケージで動作確認中。

今日確認していた、PDP11互換CPUは、2002年にI氏作成のもの。数千行になる大規模パッケージで、過去との互換性チェックにちょうどよい。

といっても、さくっと試すと当然のようにハザードストップであった。

まずは、出力端子のデータ候補にハイインピーダンスがあることのチェックルーチンで、なぜか文字列検索が停止しない不具合。停止しなければ暴走尾するかというと、システム中のどこかにZの文字を見つけるとそこで停止するので、特定の場合にのみ出力端子を3ステート対応に変更してしまう。このコアは、while(*c) という典型的な文字列検索であり、普通に動きそうなのに、動かない理由は不明だが、文字列長は既知だし、急ぎの修正のため、for文に変更。

これを対策しても、まだどこかでハザードになる?

追いかけていくと、実は、PDP11互換CPUのシミュレーションパッケージは、Verilogとのつなぎのインスタンス生成に、名前なしの引数形式の端子接続をしていて、今回、端子順序を変更したことにより、接続が間違ってしまっていた。
これは、名前指定の接続にPDP11パッケージ側を修正。ついでに、ZIP形式のアーカアイブにした上で、IP ARCHからも配布することにした。(実行には、non-profitライセンスが必須)

まだシミュレーション実行中だが、とりあえず、UNIXを擬似ハードディスクからコールドブートして、
login:
のメッセージがでるところまで来たので、動作としては完璧だろう。

20090915版は、もう少し確認したら、正式リリース版にする予定。

2命令同時実行のSN/X

2009-09-15 10:32:06 | Weblog
ずいぶん前にブログには掲載し、パルテノン講習会では受講者に配布していたが、今年は講習会がないことと、HPに掲載を忘れていたので、LiveCygwin-edaのついでに、HP(http://www.ip-arch.jp)に掲載。

2命令同時実行といっても、1日でさくっと作ったCPUなので、かなりサボった実装になっているから、大きな期待は禁物。そもそも、命令がSN/Xだし :-)

実装の解説は過去のブログを snxsで検索してほしい。

LiveCygwin-edaにngspiceを入れる

2009-09-15 10:13:45 | Weblog
お手軽インストールのLiveCygwin-edaにSpice互換シミュレータを入れたいと思っていたが、結果として、ngspiceを入れることにした。
本当は、レイアウトソフトのmagicや波形エディタ・シミュレータのirsimも入れたかったのだけれど、バイナリ配布のものは、なぜかうまくCygwin下で動かず、断念。代わりに、GNU Electricを入れておく。 サーバー容量不足で、ElectricとArgoUMLのパッケージを入れるのは断念した。


sfl2vl: 状態定義

2009-09-14 17:17:19 | Weblog
state_name文で状態を定義するが、複数の文に分かれているときに、状態割り当てがばらばらになるのを防ぐ対策をした。
再帰下降で文法解析する解析木を記述順に再構成する必要があるため、実行時間には多少のオーバヘッドがかかるが、生成結果に統一感があった方が好ましい。

ついでに、入出力端子の順序もできるだけ、記述順にそろえた(はず)。

20090914で対策。

祝!ETロボコン南関東大会競技部門圧倒的差で優勝でも、チャンピオンシップを逃す

2009-09-12 21:26:21 | Weblog
本日、ETロボコン南関東大会競技の日。
あいにくの天気だが、ここ数日徹夜で作業していた、われらのチーム(ロボタビーズ)、実に天晴れな成績で競技部門優勝であった。

モデル審査を含めた総合成績は明日の発表になるが、これだけ大差をつけているので、総合でも上位が期待できる。

よく頑張りました◎

13日追記:

残念ながら、総合5位で、チャンピオンシップは逃しました。

これには、からくりがあり、総合成績は、モデル部門、競技部門とも最高点を1、最低点を0に単純正規化し、その調和平均で計算するのですが、競技部門は、リタイア組等240秒のチームが必ずいるので、単純正規化すると、上位チームの得点差はきわめて小さく矮小化されます。これに対し、モデルは、ほぼ団子状態を正規化するので得点差が大きく拡大される傾向にあり、せっかくのぶっち切りの性能が総合得点にあまり寄与できなかったのです。

そもそも他の地区では、トップクラスでも走行結果がマイナスになっていないのだから、-66.6秒という成績がいかにすごいかが分かる。

NXTでは、このコース、早いチームが50秒程度で回るので、細かな点を無視すると、
わずか二週のレースで、二位のチームを周回遅れにする
ということだ。

南関東特別賞をいただいたので、何もなしではないが・・・

sfl2vl: 再びコードの大幅リストラ

2009-09-12 01:22:02 | Weblog
モジュール共通のFSMを実現できるように、状態の持ち方を大幅に変更した。下記の例のような記述が可能。{ } 内に状態の定義があれば、そのブロックはローカルな状態を有するとみなして、別の状態変数で状態を回す。stage/segmentはSFLでは状態を持つと定義されているので、この中で状態を回すには、必ずstate_nameによる定義が必要(グローバルなスコープは持たない)。


module test {
func_in ex;
output f[2];
state_name st1,st2,st3;
{
        state st3  { f = 0b11; goto st1; }
}
function ex {
        state st1  { f = 0b01; goto st2; }
        state st2  { f = 0b10; goto st3; }
        }
}




今回も、アルファ版と考えていたが、このバージョンのテスト中に、過去のSFL基礎教育の例題が動かないshow stopper発見。過去のものをどう対処するかは検討中だが、とりあえず、このバージョンはベータ版としておく。

不具合は、サブモジュールインスタンスを複数 ',' で区切って定義するところ、','をパースできず、シンタックスエラーとなる。1行に1インスタンスとすれば動作するので、致命的ではないにせよ、以前動いていたものが動かない可能性が高いので、できれば、ベータ版にバージョンアップして欲しい。


回路状態とステートマシン

2009-09-10 21:52:35 | Weblog
SFLでは、ステートマシンはステージ記述内のみで許されている。ただし、ステートマシンの動作とステージの動作は独立していて、ステージが呼び出されても状態レジスタは初期化されない。

ステートとステージが独立というのは納得できる設計だけれど、独立なら、ステージ内という制限も緩和可能では?

と思い立ち、{ } ブロック(parの拡張NSL文法)内に状態を記述できるようにした。未確認だが、状態のネストもできるように作った(はず)。


状態遷移は、あるFSMの状態を変更するという意味であり、ステージを起動するなどとは本質的に異なる。state文は当該状態における動作を記述する。
SFLでは、ステージと組み合わされて状態が説明されるため、きわめてわかりにくい。パイプライン制御を行なう時には、パイプラインステージ内で状態を回すのは、よほどコルーチン的な変わった制御をするとき以外にはない。(普通は、パイプラインレジスタから制御をもらうように作るはず)
ところが、パイプラインと関係ない回路ではFSMで状態を回すのは常識である。なので、これらを組み合わせず、独立に扱うことで、幅広い設計分野に自然な記述が可能となる。


初期状態は、最初に記述された状態に自動的にする。ブロック内に状態宣言があるかどうかを最初の宣言文で判定するため、記述順序には制限があるので、注意。

下記の例は、st1~st3を延々と繰り返す遷移を行なう。状態レジスタはクロック同期なので、毎サイクル新しい状態に遷移する。

moudule test {
 {
   state_name st1,st2,st3;
   state st1 goto st2;
   state st2 goto st3;
   state st3 goto st1
}
}


たとえば、次のような使い方は、よく行なわれるかも?

moudule test2 {
control_in  trans;

function trans {
   state_name st1,st2,st3;
   state st1 goto st2;
   state st2 goto st3;
   state st3 goto st1
}
}


この回路は、外部から制御入力transを受けたときにのみ、状態を回す。状態が有効なのは、このブロックが有効なとき(すなわち、transが入ってきたときのみ)なことに注意。

20090910から暫定サポート

Linuxを使う上の落とし穴

2009-09-10 10:58:00 | Weblog
某所のLinuxカーネル読解講座で、私が直接担当している部分の内容的は、
・スケジューラ
・メモリ管理
・デバイスドライバ

なのだが、サブテーマとして
・Linuxを使う上の落とし穴
ということを考えながら教材を作っている。

メインテーマ以外に、下記の内容をカーネルソースコードと対比させながら調べ、例題を含め、しっかり実習して、サンプルコードも受講者には配布するので、次の日から仕事に使える。

・メモリ参照順序によるプログラム性能の差
  ・メモリアロケータ
  ・キャッシュ
  ・TLB
・デバイスドライバの作り方
  ・procfsエントリの作り方
  ・sysctlエントリの作り方
  ・割込みを使う例
  ・タイマを使う例
  ・タスクレットを使う例
  ・ワークキューを使う例
  ・時間にクリチカルなデバイスを用いた実装演習

この経済状況で、参加者が減少し、講座は閉鎖の危機だそうだが、これらの内容が役に立つ人はまだまだ多いはずなので、単に閉鎖してももったいない気がする。

sfl2vl: NSL仕様サポート

2009-09-08 09:41:48 | Weblog
オプション -nsl を付加することで、ビット指定、数値表現、論理演算子、比較演算子をVerilogHDL互換にした、新しいNSL文法をサポートします。(20090908版より)

ただし、論理演算子の中で、ビット幅方向の演算は、VerilogHDLと違います。SFLに準じて、/&, /|などを使います。 追記:気が変わって、ビット幅方向演算もVerilog互換にしました。また、selの代わりにwireも使えます。

また、ビット指定は、ビット幅、ビット切り出しとも、カギ括弧に変更していますので、ご注意。


また、このバージョンより、クロック信号、リセット信号に任意の名前を設定可能です。ただ、分割コンパイルするときには、信号名が違うとあまり便利ではないので、信号名変更はお勧めしません。

FLEXの記述には、大域変数・局所変数・マクロなどが入り乱れており、字句解析をSFL/NSLとダブルで持たせるのに、ちと手間取り、完全な確認が取れていないので、ベータ版扱いです。

LiveCygwin-EDA

2009-09-04 08:03:57 | Weblog
従来のLiveCygwinにAllianceVHDLを導入し、UMLtoNSL, sfl2vlも最新版にした
LiveCygwin-EDA
を作成。配布を開始した。
AllianceVHDLにはいくつかX11を用いるプログラムがあるが、X11サーバは入れていないので、別途、XmingなどフリーのX11サーバを導入して欲しい。(Xのコマンドを使わなければいいんだけれど)

また、Allianceのツールのコマンドは私自身オンラインマニュアルがないと使えないので、manコマンドが動作するように関連ファイルもインストール済みだ。

パッケージを適当なフォルダに展開して、
startup.bat
をダブルクリックすると、起動する。

UML2NSL

2009-09-03 17:54:06 | Weblog
制御端子の引数の扱いを変更したり、いろいろと拡張機能を使っているので、すでに、SFLではなくなっているため、新しい変換ツールは
UML2NSL
と名づける。(NSL = Next generation Synthesizable Language)

まだツールはリリースしていないが、図のように、ステレオタイプにinterfaceを指定すると、interfaceをつけたdeclare文を生成する(このときには、module文は生成されない)。
また、instr_argはすべて生成せず、制御端子の引数として記述される。