「入門Verilog HDL記述」 の 一例について
「入門Verilog HDL記述」を読みながらVerilog を勉強中なのですが、周りに聞ける人がいないので、質問させてください。
(ちなみに VHDL は習得しているつもりです。)
いろいろ疑問点があるので、分けて何点か質問させていただきました。
改訂版 入門Verilog HDL記述の240ページのリスト II.5に
generate ブロックと if 分についての以下のようなコードがありますが、
これは期待通りには動かないと思うのですが。。。
module sel2to1_2(
input sel,
input [3:0] d0, d1,
output [3:0] dout
);
parameter sel_type = 1;
generate
if(sel_type == 1)
begin: sel_always
reg [3:0] dout;
always @* begin
if(sel)
dout <= d1;
else
dout <= d0;
end
end
else if(sel_type == 2)
begin: sel_cond
wire [3:0] dout;
assign dout = (sel == 1) ? d1 : d0;
end
endgenerate
endmodule
ModelSimでシミュレーションしてみましたが、generate文の中の
reg [3:0] dout は generate 文の中のスコープでのみ定義されているらしく、
output [3:0] dout とは別の信号らしいです。よってoutputには何も代入されず。
試しに、xilinx の ISE でコンパイルしてみたが、やっぱり output には
なにも接続されず、セレクタなんて生成されませんでした。
そもそも
module sel2to1_2(
input sel,
input [3:0] d0, d1,
output [3:0] dout
);
reg [3:0] dout;
みたいに書くと、2回宣言されているとなってエラーになります。
よって、参照ソースコードみたいに reg と wire を切り替えるような書き方はそもそもできないのでは?
皆さんどう思われますか?
(インデントがうまくいかず、読みづらくてすいません。)