2016年7月4日月曜日

第4回〜レイアウト設計でawkのお世話になったお話

入社5年目ぐらいの頃に、自分が所属していた会社が設計拠点を青森県五所川原市に作る動きになり、私を含む3名がロジック系のグループとして、五所川原に異動ということになったのでした。

そこで私待ち受けていたのは、お仕事全然な〜い!っていう状況からの、設計拠点の立ち上げのための様々な雑務、そしてやったこともないチップレイアウト・・・

でも、レイアウト設計に関するノウハウみたいなものは、自分的には全くないので(笑)、さすがに書けません。が、持てる知識を総動員して、なんとか切り抜けた、っていうお話です。

最初に

今回、言いたいことは、業務の中で学んだスキルではない、自分で勉強していた(というか趣味で楽しんでいた)コンピューターのスキルが身を助けた、っていう話なのですが、それに至る背景の説明が長くなってしまいます。申し訳ありませんが、それも含めて私の経歴です。お付き合いください。

プロジェクトの概要

青森県五所川原市に作ろうとしていた設計拠点、ASICのグループで最初に取り組んだのは、私がそれまで派遣先の親会社で担当していたCPU搭載ASICの製品シリーズの、最後の製品となる製品でした。

入社してから、五所川原に異動するまでの間取り組んできたCPU搭載ASICの製品シリーズが、いろんな事情から終息方向という中で、旧製品のリメイクのご要求が来て、これが宙に浮いた状態になっていたのでした。そして回り回ってこの製品のレイアウトをやらせて頂くことになりました。

製品の中身は、親会社オリジナルの8ビットマイコンのCPUや周辺機能、SRAM、ROM、そしてお客様の回路(ソフトマクロ)でした。

これは1993〜4年頃の話でしたが、まだ入社して5年、研修期間が終わって3年目。それまで徹夜でテスターばっかりやってた人が、いきなりレイアウトですよ(苦笑)

LSIのレイアウトに必要なもの


LSIのレイアウト設計と一口で言っても、様々な形態があるのですけど、私が経験したのは内製ツールによる自動配置配線ツールを使ったチップレベルのレイアウトです。

これを行うために必要なものは、(マウスカーソルをそれぞれの項目の上に置くと、説明が出ます。)


ネットリストは上流工程から落ちてくるし、セルライブラリー、ハードマクロは既存のものを使うのですが、レイアウトツールが問題でした。

どうやって事をすすめるか


時代はちょうど大型計算機からEWS(Engineering Workstation)への過渡期、大型計算機で動いていた自動配置配線ツールをEWSにポーティングする、というプロジェクトが親会社のEDA開発部門で進んでいて、それを使わせて頂けることになりました。しかしリリース前のソフトなので、生煮え状態ではありました。

もっとも、生煮えのツールとは言っても、演算結果が違う、なんてことはほとんど無いのでして、急に反応しなくなるとか、core dump吐いて止まると言った、まだわかりやすい生煮え状態ではあるのですけどね。それに、親会社のEDA部門は、できる限りの最高のサポートをしてくださいましたし、同じ事業所にEDAの仕事をしているグループがいたので、そちらにもかなり助けてもらいました。

自動配置配線ツールだけがあっても製品は作れないので、ツールチェーンと作業フローを決めておかなければいけないね、ということで、EDAの人たちにも入ってもらって、設計フローを決めました。実際はもう少し細かいのですけれど。

この中で、ツールの完成度の関係で、配置配線の左側にある結線チェックに関して、1カ所だけツールに入れるデータを人手で作らなければならない箇所があったんですね。

これは、具体的にはソフトマクロと他のブロックとの接続検証に必要な、ソフトマクロ全体の外形情報、端子の名前、位置などの情報です。これを定型フォーマットにしたがってデータファイル化しなければいけませんでした。この人手作成、最終的には不要になったはずですが、当面これをちゃんと作って検証する方法を確立しておかないと、レイアウト検証まで含めた設計フローの試行ができません。

ツール群のつながりがしっかりと出来ていない状況で無理に使うと、こういうことも普通にあります。

接続検証に必要なデータ、の検証

人手作成しなければならないデータ、作るのに必要な情報は、全て設計データを格納しているEWS上のデータベースに入っていて、何かプログラムを書けば自動抽出もできるはずのものです。

先ほど最終的には不要になると書いたのはそのためで、本来は自動配置配線ツールから結線チェックツールにレイアウト情報を引き渡すときに、自動的にできてくれるべきものです。

しかし、まだリリースされていない不完全な状態のものなので、自動的にできる状況ではありません。したがって、データの作成は、当面の間データベースエディタを開いて一つずつ拾い上げて手作り、ということにせざるを得ませんでした。あくまでも暫定的な措置で、本番ではなくなる作業のはずだったので、あえて自動化のための動きはとりませんでした。

そのような状況なので、人手作成したデータが、ネットリストのブロック定義と一致しているかどうか、この検証が重要です。人間が作ったものはミスが入り込むものですからね。

しかし、数百レベルである端子の定義を、一つずつ目視チェックしたのでは、チェック自体の信頼性も疑わしい、なんてことにもなりかねないので、正確に早く検証する方法が何かないか、と考えて、コンピューターの知識に助けてもらうことにしたんです。

具体的な方法


当時、GNUのツールの中のGNU awkになぜか興味を持って、自分で勉強していたのです。awkはご存じの方も多いと思いますけど、文字列処理用のスクリプト言語の一種です。同様のperlに比べると機能的には若干劣りますけど、それでも強力なツールです。

これを使って何か出来ないか、っていうことで、あれこれ考えて、以下のことが出来るawkのスクリプトが書けないかどうか、NUTSHELLシリーズのsed & awkプログラミングという本と首っ引きで検討しました。

  1. ネットリストの中のブロック名を指定したブロック定義部分を探し出して、端子定義を解析、名前、属性を配列に読み込んでおく。配列の中には、チェックしたかどうかを記録しておくエリアも作っておく。
  2. レイアウトから出した端子定義情報のファイルを1行ずつ読んで、上記で作った配列の中から名前が同じものを探す。(端子定義情報ファイルでは、1行に端子1個の情報が記述されている)
  3. 見つかったら、チェックしたかどうか記録するエリアに何かを書き込んで、端子定義を比較して、何か一致しない項目があれば一致しない項目と該当の端子名を出力して終了。不一致がなければ正常、次の端子のチェックへ。
  4. 見つからなかった場合は、レイアウトにあってネットリストにない端子ということなので、その端子名を表示して終了。
  5. 最後に、配列に格納された端子全てがチェックされたかどうかを見て、全てチェックされていれば正常終了、
  6. チェック抜けがあった場合は、レイアウトにあってネットリストにない端子があることになるので、チェックが抜けている端子の端子名を表示して終了。
awkって、ご存じの方はご存じのとおり基本的に以下の形式で記述するスクリプト言語です

BEGIN {                                                                           入力ファイルの読み込みの前に
        最初に一度だけ実行する手続き群;                           一度だけ実行される。
}
/探したい文字列(もしあれば)/ {                                      この手続き群は、基本的にファイル入力1行
        文字列が見つかった場合に実行する手続き群;          に対して1回実行される。
}                     /文字列/で検索文字列を指定すると、検索文字列が見つかった場合に実行される。
END{                                                                               入力ファイルの読み込みが終わったあとに
        最後に一度だけ実行する手続き群;                           一度だけ実行される。
}

というわけで、BEGINでネットリストを読んでブロック定義を探し出し、配列に必要なデータを格納、1行ごとの処理で端子定義情報ファイルから1行ずつ読み込んで配列の中から端子情報を検索、という方針で検討しました。さすがにだいぶ前の話で、書いたスクリプトはEWSごと五所川原に置いてきて、とっくの昔に償却されてしまったと思うので、詳細なコードは失われています。こんな感じで記述した、っていうレベルで説明を書きます。

読み込むネットリストの形式は、
BLOCK名    BLOCK TERM1,TERM2,TERM3,TERM4,TERM5,TERM6,@
   TERM7,TERM8,.....
                   INPUT         TERM1,TERM2                    //端子属性定義部
                   OUTPUT     TERM3,TERM4
                   INOUT        TERM5,TERM6,TERM7

                   以下回路記述

                   END
だったと思います。パンチカードの流れを汲む72文字記述の形式がそのまま踏襲されていて、72文字に収まらない行は継続文字(上の例では@)をつけて次の行へ続く、という感じ。

最初にBLOCKというステートメントでブロックの名前と端子インタフェース定義があって、次に端子の入出力属性が定義され、回路の中身の記述がされてENDで終わる、といった構造です。細かいところが違っているかも知れませんが、概ねこのような記述だったはずです。

これを読んで、該当するブロックの定義から端子情報を抜き出す部分を、当時のうす〜い記憶を元に再現してみました。丸二日かかっちゃいました(苦笑)

こちらです。

このリンク先のページに書かれたBEGINセクションで定義した配列を使って、入出力属性などを端子名をキーとする連想配列にしてあげればよいのです。

当時の記憶では、たとえ最終的には不要になるとは言え、その時点で機械でチェックする仕掛けがないと、データの改訂のたびに数百の端子定義をもれなく人間がチェックする、ってなことになるわけで、自分も辛いし同僚も辛そうってことで2日か3日ぐらいでスクリプトを書き上げたような覚えがあります。

このようにして、フローの中の各項目の洗い出し、内容確認をして、できること、できないことの整理をして、できないところはどのようにしてできるようにするかを考えて、ヌケがないようにする、っていうことが大事です。

この製品、お客様の都合で量産はなかったんですけど、レイアウト完了後マスクデータを作成して試作、1st cutで完全動作させました。

レイアウト設計のスキル不足のせいで、面積的には結構無駄なレイアウトになってしまって、そのまま量産したら収益的にどうだったかを考えると、恐いものがありますね(苦笑)。

0 件のコメント:

コメントを投稿