2016年6月16日木曜日

第2回〜2相クロックの罠

はじめに

第2回目は、私が会社に入って最初に任されたまとまった仕事のことを書きます。

会社に入って最初の年は、ひたすら机でお勉強することと、いろんなソケットの半田付けなんかが主立った仕事でしたが、その年の秋頃から評価用のLSIの実装機評価を任されました。

これはタイマーとかシリアルインタフェースといったマイコン周辺機能のブロックだけを入れたLSIを作って(LSIの開発自体は別の人がやってました)、それを実装機で動かして機能の評価をする、という仕事で、たしか評価対象のLSIは、ウォッチドッグ・タイマーフリーランタイマークロック同期シリアルインタフェース調歩同期シリアルインタフェースの4チップ。

おそらく、機能的にそれほどたいしたものではないっていうことから、先輩方も新人に任せたのでしょう(調歩同期はちょっと厄介だけど)。

ところが、動かない・・・




プロジェクトの背景など

この評価用チップ、元々、当時新たにビジネスをスタートさせようとしていたCPU搭載ASICの製品シリーズにおいて、組み込み用マイクロコンピューターのソフトウエア開発には必須のIn-Circuit Emulatorを、チップが出来上がる前に準備したい、という目的で、CPUや周辺機能(モジュールと呼んでいました)単位でLSI化して、ボード上でソケットにチップを差し込むことによって最終チップと機能的に等価なものを作る、という仕組みを作るために作られたものでした。

組み込み用のCPUでは、パソコンソフトウエア開発をする場合と異なり、モニターもキーボードもありませんから、CPUの中のレジスタやCPUとつながっているメモリーの中身がどうなっているかを知る方法がありません。 
そこで、システム開発の中のソフトウエア開発において、CPUの機能に加えて、レジスタの中身を読んだり、メモリーの中身を読んだり、好きなところでソフトウエアを止めたりといった、ソフトウエア開発に必要な機能を追加したものを組み込み機器につないでソフトウエア開発をします。これを、In-Circuit Emulatorといいます。(In-Circuit Emulatorはインテルの登録商法だそうで、各社他の名前で商品を出していますね。) 
In-Circuit Emulatorに関する詳しい説明がこちらにあります。京都マイクロコンピューター様のサイトです。PDFなので環境によっては読めないかも知れませんが、In Circuit Emulatorがどんなものかがわかりやすいです。 

試作サンプルが出て来たら、実装機で機能評価をして、動作的に問題ないことがわかったら、ICEを開発している別部署にサンプルを提供して、ICEとしての動作を評価してもらう、という手はずになっていましたが・・・


動かない

クロック同期シリアルが機能確認が一番しやすいと考えて、クロック同期シリアルのチップから着手したんですが、レジスタへの書き込みはなんとか出来ていたように見えていたものの、送信データと同期クロックが全然出てこないんです。手順的に問題がないかどうか、色々と実験するんだけど、いくらがんばっても送信データと同期クロックが出て来ません。


何が何だか

機能評価は、実装機に搭載されたZ80(正確にはZ80とオブジェクトレベルで互換性のある、10MHz動作のオリジナルCPU)に、外付けEPROMにハンドアセンブルして作った機械語プログラムをROMライターで書き込み、それをを読ませて実行させるのですが、何をどうやっても送信データと同期クロックが出てこない。Hレベルに張り付いたまま。何回消去と書き込みを繰り返したことか・・・

ちなみに、このLSIに関しては、LSIテスターの準備がなされていなくて、LSIテスターで何かしら動くかどうかを確認することが出来なかったので、私の実装機評価が全てでした。

テスターでテストパターンがパスしているっていう実績があれば、評価環境の問題だよね、と言うことで問題が絞り込めるのですが、評価環境の問題なのかチップそのものに問題を抱えているのかからしてわからない状態で、混沌としたなか毎日仕事をしてました。

ついに夜明けがやってきた

そんな膠着した日々が続いたある日、実装機上のある部品に目がとまって、ちょっとイタズラしてみたくなり、試しにその部品に指を触れながら動かしたら・・・

なんと送信データもクロックも出るじゃありませんか!

オシロスコープで送信データと送信クロックの端子がパタパタ動いているのを見て、何かダマされていないよな?とあちこち疑いながら、何度もリセットボタンを押してプログラムをリスタートしてみたり、電源を一旦落として再投入してみたり。それでもちゃんとデータが出ています。

何もわからずにやっていたわけですけれど

実は使った実装機、簡単な動かし方は教えてもらっていましたが、細かな仕様書類があるわけでもなく、よくわからない状態で使っていたのです。そしてその指を触れた部品というのは、単相クロックからチップに供給する2相クロックを作るためのディレイラインの遅延時間選択用のジャンパーピンでした。

そのジャンパーピンがそういう機能を司っているというのは、チップが動くようになった後にジャンパーを色々いじってクロック波形をオシロスコープで見てわかったんですけど、とにかくその実装機がクロックの波形が調整できるように作られていたことに、その時初めて気が付いたんです。

なにせ、実装機はこれ、EPROMにプログラム書いてリセットボタン押すと動き出すからね、評価するチップの仕様書はこれ。後はよろしくね〜ってな感じでしたかね。それなりの経験を積んだ技術者なら、そんな状態からでもちゃんとアウトプットを出せるのでしょうが、入社して1年も経たない出来の悪い新入社員だったので、とてもそんな仕事の進め方はできませんでした。

言い訳して申し訳ありません。


動かなかった原因は・・・

結局、実装機上のクロック調整機構を色々といじって実験した結果、2相クロックのノンオーバーラップ時間が足りず、内部でデータの突抜けが生じて、動かなかったのだろうという推論を立てて、そこからやっと、残りのチップも含めての動作確認ができるようになりました。

しかし、評価着手から全てのチップにおいて機能的に問題ないことがわかるところまで、結構な時間を費やしてしまいました。3〜4ヶ月かかったような記憶がありますけど、実際のところは覚えていません。申し訳ありません。

父親のような存在の課長に勉強させていただきました

思えば私は新人にもかかわらず先輩方からはずーっと放置されていて、あまりの進捗の遅さに、課長みずから朝会を開いてその日やることを確認、夜中までかかって朝にやると決めたことを消化して結果を報告、という進め方で評価を加速してもらったんですよね。

恐かったしキツかったけど、こういう仕事の進め方もあるのかと、感心しながらそれなりに楽しんでいたと思います。

その後評価はLSIテスターへと移り、ノンオーバーラップ時間がどのぐらい必要なのかを定量的に測定し、設計した人が想定していたよりも多めに確保しないと動かない、ということを確認できたのでした。確か記憶では、設計スペック10nsに対して、30ns程度とらないと動かない、という状況だったと記憶しています。

派遣先(親会社)の課長さん、怒ると恐い人だったけど、技術論のみならず仕事の進め方なんかも本当に色々と勉強させて頂きました。この方がいらっしゃったからこそ、その後の自分があると今も思います。そういう方が何人かいらっしゃって、周りの人間には本当に恵まれた会社生活でした。

さて2相クロックとは

ここでこの騒動の原因となった2相クロックについて説明を書きたいと思います。

だいぶ前から、クロック同期回路の設計において、クロックは単相クロック、フリップフロップ類はスタティックというのが普通だと思います。論理合成やらStatic Timing Analysisといった設計手法で設計していく世界では、そうじゃないと設計できないという都合もあるのだと思います。

しかし、ある時期までのマイクロコンピューターなどの世界では、回路規模を小さくするために、クロックドインバーターとインバーターを組み合わせたラッチを、2段直列に接続してフリップフロップを構成する回路手法が使われていました。

このクロックドインバーターとインバーターを組み合わせたラッチは、クロックドインバーターが開いているときに入力端子に印加されているデータを取り込み、閉じているときはクロックドインバーターの出力とインバーターの入力の間のアルミ配線に溜まった電荷を使って論理値(1か0か)を保持するもので、ダイナミック・ラッチと呼ばれます。

このダイナミックラッチ2段のフリップフロップを動かすために2相クロックが使われていました。ASICのライブラリー化のためにマイコンの設計部署から頂いてきたマイコンの回路がそのような設計手法が使われていたので、それをそのまま踏襲することになり、ASICのライブラリーとしてのマイコンのCPU、マイコン周辺機能の中でも当然使われています。

回路構成上、入力データが半クロック遅れて出てくることにはなりますが、そういう前提で設計すれば使える素子なので、使われていたのでしょう。

今回の記事で書いたトラブルでは起こったトラブル、実際何が起こっていたのかをこちらのページに書きました。2相クロックのノンオーバーラップ時間の不足ということですが、これが足りないと、1段目のラッチが閉じる前に2段目のラッチが開いてしまうので、回路設計で前提としていたタイミングよりも早く2段目のラッチの出力が変化してしまって誤動作する、という現象が起きていたと思います。(思いますと書いたのは、Forced Ion Beamや針当て等でチップ内部の信号を直接観察したわけではないので、確認済みの現象ではないのが理由です。しかし、状況証拠から見て、そのような現象が起こっていたと確信しています。)

そうなると、周りの回路との協調が取れなくなり、回路全体として誤動作、ということになります。

この案件、1989年から90年にかけての出来事でした。随分年月が経ちましたが、未だに結構良く覚えています。良い勉強をさせていただいたと思っています。

しかし、そもそもなぜノンオーバーラップ時間が足りないなんていうことになったの?という疑問が湧きますが、これについては自分が設計した仕様ではないので、ここには書かないことにいたします。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。