« GM計数管 | トップページ | 究極のRX62Nボードの基板が製造完了 »

2011.04.07

Spartan-6サンプルデザインをVerilog化

全国1000万人のVerilogユーザの皆様、たいへんお待たせしました。
特電Spartan-6ボードのサンプルデザインをVerilog化しました。

いままでVHDLで書いていたものをVerilogに書きなおす作業をしたわけですが、NGCで書かれたVHDLの下位モジュールをどうやってVerilogで書いた上位モジュールにつなぐかという点でハマりました。

XILINXのデザインでは、普通、IPコアをネットリストで提供するときにはNGCで提供します。VHDLのデザインの場合は、上位のモジュールに
component xxx is port (
 ・・・
);
end component;
と書いておけば、コンパイラは下位のモジュールの入出力ポートの仕様を知ることができるので、下位モジュールがネットリストで提供されていても、うまくつなげることができました。

しかし、Verilogではそういう下位モジュールを定義する記述がなく、いきなり
 ddr2main inst_ddr2main(
  .reset_ip(1'b0),
  .clk_ip(dramclk),
  .clkn_ip(dramclkn),
  .ddr2_ras_op(DDR2_RAS),
 ・・・
のようにインスタンシエートするわけです。
プロジェクトに下位モジュールがVerilogのファイルとして登録されていればいいのですが、下位モジュールがNGCだったりVHDLだとすると、上位モジュールからは下位モジュールの仕様を知ることができないので、論理合成ツールが「そんなモジュールのポート知らないよ」とエラーを返すわけです。
そのため、簡単にはつながりませんでした。

これを解決するためのやりかたは、
① 入出力ポートのみを記述したmodule文を作り、別のファイルにして保存する。
② そのファイルをプロジェクトに追加する。

とやります。

つまり、下記のような記述をします。C言語でいえばヘッダファイルのようなものを作ります。
module submodule ( signal_A_ip, bus_B_ip, signal_C_op);
 input signal_A_ip;
 input [15:0] bus_B_ip;
 output signal_C_op;
end module;

これを、プロジェクトに何らかの形で追加すればよいのです。
Verilogproject

ezusbfx2_ctrlモジュールのVerilogの定義はこちらです。
「ezusbfx2_ctrl.v」をダウンロード

module文だけで中身がないファイルですが、これを追加しておけば、NGCは自動的に読み込まれます。
(注意しなければならないのは、入出力信号にバスを使う場合は、その幅を正しく合わせておかないとSynthesizeは通っても、Place and Routeでエラーとなることです。こうなると発見が難しい)

そのほか、Verilog化していていくつかハマった点があります。
① reg と witeの使い分け
 下位モジュールの出力を取り出す用途で使う場合は、regでもwireでもいけてしまう場合がある。

② <= と =の使い分け
・alwaysの中では <= を使う (=を使うとVHDLでのVariableと一緒でバグの温床になる)
 ・alwaysの外では assign ○○○ = △△△ ; とやる。

VerilogとVHDLを比べて見ると、信号の宣言がどこにでもおけて気軽だったり、(others => を書かなくてもよいので楽だったりするのですが、厳密でないのが気になって仕方がないので、やはり私はVHDLのほうが好きです。

Verilogデザインは、Spartan-6評価ボードのサンプルデザインの中に入れておきました。
http://www.tokudenkairo.co.jp/sp6/download.html

これからいろんなサンプルデザインをVerilogでも提供していきたいと思います。

|

« GM計数管 | トップページ | 究極のRX62Nボードの基板が製造完了 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« GM計数管 | トップページ | 究極のRX62Nボードの基板が製造完了 »