目次
Verilog HDLの言語の曖昧性について
ビヘイビア記述だと論理合成できない… とかそういうことではなくて、IEEE Standard Verilog® Hardware Description Languageに書かれている、Verilog HDLの規約の解釈の仕方により、シミュレータだったり、論理合成ツールの実装に違いが見られるところを幾つか発見したので、まとめて見ます。原因はVerilogの言語仕様に於いて曖昧なところがあるからなんですが、それを回避してどのツールでも正しくデザインを認識してもらうことを目的とします。
検証済みでわかっていることを書いていますが、間違っていることがあれば指摘してください。
`default_nettypeの挙動について
Verilog HDLでは、モジュールの外に `default_nettype noneと書くと、それ以降のすべてのモジュールにおいて、暗黙のwireを禁止し、エラーを出すようになります。それにより、あまやって信号名を間違えて、未定義のwireと認識され、意図しない回路が生成されることを防止することができます。
以下のサンプルは、D-FFのモジュールです。なんの意味もないwireを経由したり、あと、これは今回の`default_nettypeの挙動を見るためにあえて誤った記述(oud_dataが暗黙のwireにより1bitのwireと解釈されるため)をしています。
`default_nettype none module d_ff #( parameter N = 8 )( input iCLOCK, input inRESET, input [N-1:0] iD, input [N-1:0] oD ); reg [N-1:0] b_data; always@(posedge iCLOCK or negedge inRESET)begin if(!inRESET)begin b_data <= {N{1'b0}}; end else begin b_data <= iD; end end /*****************************/ assign out_data = b_data; assign oD = out_data; endmodule `default_nettype wire
なお、他人が作ったファイルで、あえて暗黙のwireを使用して書かれているファイルがあるかもしれないので(言語仕様上許されるがあえて暗黙のwireで書きたくない)、フィアルの最後に `default_nettype wire と指定して、暗黙のwireを許可(つまりデフォルトの状態)するようにしたほうが良いです。
`default_nettype noneの効果
始めに書いたように、上のモジュールでは、1つ(または複数)のエラーが出ます。`default_nettype noneにより、wire宣言されていないout_dataがあるからです。このように、意図しないミスを防ぐことができ便利です。
`default_nettype none をコメントアウトしている時、本来期待するデザインは、parameterで与えられるベクタ幅のd-ffですが、out_dataがwire宣言されずにassignされていることにより、暗黙の1bit wireと解釈されてしまいます。`default_nettype noneがない場合、はこのように期待するデザインでないのにエラーを防げません。
`default_nettype noneでinput/output宣言も適用されるか
`default_nettype noneを宣言することで、エラーを未然に防げるのですが、ここからが問題で、`default_nettype noneでどこまで適用させるかというのがシミュレータによって、実装が異なるようです。
input/outputにおいても、wire宣言の省略をエラーと捉えるか、捉えないかがシミュレータ・合成ツール依存になっています。
ツール | バージョン | 挙動 | 備考 |
---|---|---|---|
Veritak Basic | 3.84D Build May.23.2011 | エラー・警告なし | 作者に問い合わせたところ次期バージョンでエラーにするのと事 |
Riviera-PRO(Windows 64bit) | 2013.02.81.4877 | エラー・警告なし | Aldec社に問い合わせたところ、`default_nettype はターミナルリストのみ適用されるもので、port宣言においては適用されないとのこと認識しているとのこと。 |
ModelSim-SE(Windows 64bit) | 10.1d | エラー | |
VCS | わすれた | エラーなし/警告?? | |
PlanAhead(Windows 64bit) | 14.1 | エラー無し・警告なし | |
QuartusII Web Edition(32bit) | 11.1 SP1 | エラー無し |
ということで、上に上げたVerilogファイルでは、ModelSimにおいて、エラーが出ることになります。
IEEE Standard Verilog® Hardware Description Languageの、12.3.3 Port declarationsでは、input/output/inoutの後に[net_type]と明確に書かれているため、やはりポート宣言におても`default_nettype noneの効果は有効ではないかと思うのだけど、多くのツールではport directionは無視しているようです。
というわけで、`default_nettype noneにした状態で、全てのツールで問題なくデザインを通すためには、以下のようにport directionでもwireの宣言を省略しないほうが良いかと思います。
`default_nettype none module d_ff #( parameter N = 8 )( input wire iCLOCK, input wire inRESET, input wire [N-1:0] iD, input wire [N-1:0] oD ); ... endmodule `default_nettype wire
wire/reg宣言の位置について
どうやら、wire/reg宣言をする前(Verilogファイル上)にその信号にassignしたり、その信号を用いようとした時、ツールによってerrorとなったりならなかったりするようです。
ツール | バージョン | 挙動 | 備考 |
---|---|---|---|
Veritak Basic | 3.84D Build May.23.2011 | エラーなし | Lintオプションで警告あり |
Riviera-PRO(Windows 64bit) | 2013.02.81.4877 | エラーなし | |
ModelSim-SE(Windows 64bit) | 10.1d | エラー | |
QuestaSim(Windows 64bit) | 10.1d | エラー | |
VCS | わすれた | エラー | |
PlanAhead(Windows 64bit) | 14.1 | エラー | |
QuartusII Web Edition(32bit) | 11.1 SP1 | エラーなし |
VeritakとQuartusII意外は全てエラーになるようです。
2次元アレイを持つ組み合わせ回路のalways
2次アレイを含む組み合わせ回路をalways @*を用いて表現する場合、Xilinxのツールでおかしな解釈があったのでメモ。
always @* begin if(b_ctrl_mem_valid[0])begin irq_valid = 1'b1; end else if(b_ctrl_mem_valid[1])begin irq_valid = 1'b1; end else begin irq_valid = 1'b0; end end
上記のようなコードは、Xilinxのツールではエラー(エラーコード20391)となる。どうやらalways @*では2次元配列を認識しないらしい。解決策としては以下のように普通にセンシティビティリストに全て書くしか無いとのこと。なお、Virtex-6 および Spartan-6 デバイスではこの問題は起きないとのこと。まぁ、基本的にメモリ宣言したものを組み合わせ回路に入れるのは気持ち悪いのであまり推奨されない書き方だとは思います。
always@ (b_ctrl_mem_valid[0], b_ctrl_mem_valid[1]) begin if(b_ctrl_mem_valid[0])begin irq_valid = 1'b1; end else if(b_ctrl_mem_valid[1])begin irq_valid = 1'b1; end else begin irq_valid = 1'b0; end end
ツール | バージョン | 挙動 | 備考 |
---|---|---|---|
Veritak Basic | 3.84D Build May.23.2011 | エラー・警告なし | |
Riviera-PRO(Windows 64bit) | 2013.02.81.4877 | エラー・警告なし | |
ModelSim-SE(Windows 64bit) | 10.1d | エラー・警告なし | |
VCS | わすれた | エラー・警告なし | |
PlanAhead(Windows 64bit) | 14.1 | エラー | |
QuartusII Web Edition(32bit) | 11.1 SP1 | エラー・警告なし |