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 Basic3.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 Basic3.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 デバイスではこの問題は起きないとのこと。まぁ、基本的にメモリ宣言したものを組み合わせ回路に入れるのは気持ち悪いのであまり推奨されない書き方だとは思います。

Source : XST - 「ERROR:Xst:1468 - "file.v" line xx: Unexpected event in always block sensitivity list」というエラー メッセージが表示される

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 Basic3.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エラー・警告なし