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;
これを、プロジェクトに何らかの形で追加すればよいのです。

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でも提供していきたいと思います。
| 固定リンク


コメント