Cと verilog の相違点

【設計手法の相違】

 C と verilog HDL は同じような文法をしていますが、同じように設計できるでしょうか。
 それは NO!! です。
 プログラミングの世界で、C++は、Cの文法を少し拡張しただけだから同じようなプログラム設計が できるでしょうか。
 Cは構造型プログラミング言語、C++はオブジェクト指向型言語で、設計指向が全く異なり、そのために 文法が似ていてもソースコードは似てもにつかぬ相違があります。
 いわば、カルチャーが違うといえます。
 CとC++の差に比べたら、CとBASICの差や、CとFORTRANの差の方がずっと小さいといえます。 ちょっと文法が違うだけです。BASICやFORTRANは構造型プログラミング指向言語ではないので その点はちょっとCと異なりますが、カルチャーの相違に比べたら文法の差なんて大したことはありません。
 日本人がアメリカに行ってなかなか言葉が通じないのは英語だからというのもありますが、カルチャーの 相違が著しく大きいかと思います。
 Cと verilog HDL に関しても文法は似ていますが、カルチャーが全く異なりますので、同じように 設計することはできません。というか、同じように設計をするとメリットが出ません。
 そのことをよく肝に銘じておいて、Cで回路設計する手法とCを verilog に変換する手法を勉強しましょう。

【プログラミング言語とHDLの相違】

 言うまでもなく、Cはプログラミング言語、verilog とか VHDL とかのHDLはハードウェア記述言語です。
 根本的に異なるのはプログラミング言語は実行する命令の順番通り順次実行します。ところが ハードウェア記述言語は同期設計が基本となっているのでレジスターは全部同時変化にします。
 そのためプログラミング言語でハードウェアを記述するときはその同時変化をどのように記述するかが重要な 要素であり、YasC ではその同時変化を容易にプログラミング言語で記述するテクニックです。
 もう一つ異なる点は、プログラミング言語では事象が起こるところに記述するのが原則です。HDLでは ハードウェア資源毎に記述をまとめるのが原則です。従って記述に場所はプログラミング言語とHDLでは 異なることが多い。

【プログラミング言語での設計は簡単か?】

 Cによるデジタル回路設計のメリットを強調してきましたので、Cによるデジタル回路設計は簡単かと 思われたかもしれませんがどうでしょうか?
 実際は NO!! です。
 Cによるデジタル回路設計はHDLによる回路設計に比べて格段に難しく、技量を要します。
 なぜならば、HDLによる回路設計は、レジスターはノンブロッキング代入で記述するというルールに しておけば、後はアサイン文を含めて記述の順番を気にせずに設計できます。ところがCでは実行順序が 重要であり、 YasC のテクニックでノンブロッキング代入しているレジスターの出力に関しては何ら順序を 気にする必要はありませんが、HDLのアサイン文(組み合わせ回路)に当たる代入文に関しては、 その結果は後で実行するものにしか適用できません。
 この制約が設計をかなり難しくしています。YasC では assignment() という関数を用いて、代入の 前で使いたい場合は代入を一番前に持ってくるというテクニックを使用しています。しかしこれを 多用すると複雑な回路ではだんだんわからなくなってくるので、できるだけ少なくすべきです。また、 assignment() の中での順序も考慮せねばなりません。
 簡単なシステムだったらCで設計するよりも直接HDLで設計した方が簡単です。
 しかし、その難関を越えてCによるデジタル回路設計をマスターすると、複雑なシステムでは HDLで直接設計するのに比べて一桁アップの生産性を得ることができるでしょう。
 一度だまされたと思ってチャレンジしてみてください。驚くような成果を発揮できることと思います。

【SystemC はプログラミング言語か?】

 EDAツールベンダーを中心に SystemC というC++クラス・ライブラリーを用いたC++言語で デジタル回路を記述する手法がかなり盛んになってきています。
 それに対する私の意見は、SystemC はあまりにHDLくさく、Cで問題になる記述順序は気にしなくても よい代わりに、記述の仕方はほとんどHDLと同じです。いわばC++コンパイラーでコンパイルできる 新しいHDLの提案と考えた方がいいでしょう。
 従って、あまりプログラミング言語的な発想で記述は困難です。メリットとしてはシミュレーション速度が C++であるため速いということだけです。(噂によるとクラスライブラリーが重いのでHDLで設計した 場合と大差がないという話を聞いたことがあります。真偽のほどはわかりません。)
 Cで詳細仕様設計をして仕様段階でシミュレーションしてシステムの妥当性を検証するという目的には 適さないでしょう。従って、私の目的はCでの詳細仕様設計なので、SystemC はお奨めしません。

【Cと verilog のコード量の差】

 YasC の手法を用いると、非常にコンパクトに設計できます。そしてCは verilog に比べて格段に記述力が 優れています。そして、ビヘイビア記述を混ぜることもできるので、より簡素に記述が可能です。 (verilog の仕様はなぜあんなにダサイのでしょうね。)
 私の経験では YasC を verilog に変換すると、コード量は3〜4倍に増加します。
 Cはいかに効率よく記述できるか、それによってもわかるかと思います。(SystemC ではそんなに効率よく 記述することはできません。)
 最近では規格書をCで記述することがはやっています。例えば MPEG の規格書等はCで記述されています。 これはCは仕様を論理的に記述するのに適しているからです。Cのような構造型プログラミング指向言語は 仕様記述に適しています。
 設計仕様書もCで書いてしまえば後は verilog に変換するのは簡単です。
 でも、本当は YasC から verilog に自動変換するツールが欲しくて仕方ありません。そんなところに パワーをかけるのはばからしいからです。
 今後はツールを少しずつ作っていこうかと思っています。

【HDL は手書き回路図よりも回路規模が大きいか】

 verilog 等の HDL で記述すると、時々昔ながらの手書き回路図で設計するよりも回路規模が増えるのでは ないかという声を聞きます。
 私の経験ではそんなことはありません。 職人芸的な非同期回路よりも同期回路の方が回路規模が増えるというのは事実です。 でもそれは HDL とは次元の違う話です。通常 HDL からネットリストに変換するコンパイラー (Synopsys 社の Design Compiler が有名です。)は強力な論理圧縮機能を持っており、人間のわざでは到底 不可能な論理圧縮をしてくれます。従って HDL で記述した方が小さくなると思います。
 ただしそれはアルゴリズムが同じ場合であって、回路規模を小さくするこつは、小さくできるアルゴリズムを 使うことです。コンパイラーはアルゴリズムまで圧縮する機能はありません。 そこで、Cでいろいろアルゴリズムを検討して、その後 HDL に変換するといういうことは回路規模縮小に 大いなる期待ができます。皆さんもいろいろ試してみてください。
 それから、余談ですが、HDL を小さな回路規模の回路に変換するにはちょっとしたこつがあります。 それは、ビヘイビア記述するよりも、低レベルの記述をしたほうが小さくなります。 例えばテーブル変換ロジックを作る場合は、case文で記述するよりも PLA(Programable Logic Array) のように AND-OR ロジックで記述する方が小さくなります。 大きなテーブルを作る場合は試してみてください。
(もちろん手で作るのではなく、プログラムを組んで自動発生させてください。理由は手で記述したな場合は チェックにすごくパワーがかかるからです。)
 それから、理解していただいていると思いますが、YasC で設計したからといって HDL で直接設計するよりも 回路規模が増えることはほとんどありません。それよりもアルゴリズム検討を容易にできることによって、 飛躍的に小さな回路規模の回路を設計することが可能です。


 半導体回路・電子回路・電子機器設計のご用命は 有限会社安田電子設計事務所へ!!
Home  技術紹介  サービス案内  会社概要  お問い合わせ  
Copyright(C) 2010 Yasuda Electronics Design Office All Rights Reserved.