generate → for → always の順に入れ子にしなければならないらしい。
正しいコード:
module main; reg[7:0] a = 0; reg clk; always #1 clk = ~($time & 1); always @(posedge clk) a[0] <= 1; genvar i; generate for (i=0; i<7; i=i+1) begin : my_block always @(posedge clk) begin a[i+1] <= a[i]; end end endgenerate initial $monitor ("Time = %d a = %b",$time,a); initial #20 $finish; endmodule
実行結果:
mint@ubuntu:~/Desktop/verilog$ iverilog -o genvar1 genvar1.v mint@ubuntu:~/Desktop/verilog$ ./genvar1 Time = 0 a = 00000000 Time = 2 a = 00000001 Time = 4 a = 00000011 Time = 6 a = 00000111 Time = 8 a = 00001111 Time = 10 a = 00011111 Time = 12 a = 00111111 Time = 14 a = 01111111 Time = 16 a = 11111111 Time = 18 a = 11111111
正しくないコード1 (generate→always→forのパターン):
module main; reg[7:0] a = 0; reg clk; always #1 clk = ~($time & 1); always @(posedge clk) a[0] <= 1; genvar i; generate always @(posedge clk) begin for (i=0; i<7; i=i+1) begin : my_block a[i+1] <= a[i]; end end endgenerate initial $monitor ("Time = %d a = %b",$time,a); initial #20 $finish; endmodule
出力結果:
mint@ubuntu:~/Desktop/verilog$ iverilog -o genvar2 genvar2.v genvar2.v:14: register ``i'' unknown in main. Elaboration failed mint@ubuntu:~/Desktop/verilog$
正しくないコード2 (always→generate→forのパターン):
module main; reg[7:0] a = 0; reg clk; always #1 clk = ~($time & 1); always @(posedge clk) a[0] <= 1; always @(posedge clk) begin genvar i; generate for (i=0; i<7; i=i+1) begin : my_block a[i+1] <= a[i]; end endgenerate end initial $monitor ("Time = %d a = %b",$time,a); initial #20 $finish; endmodule
出力結果:
mint@ubuntu:~/Desktop/verilog$ iverilog -o genvar3 genvar3.v genvar3.v:12: syntax error genvar3.v:12: error: malformed statement genvar3.v:13: syntax error genvar3.v:14: Syntax in assignment statement l-value. genvar3.v:14: syntax error genvar3.v:14: error: malformed statement genvar3.v:14: syntax error genvar3.v:15: Syntax in assignment statement l-value. genvar3.v:17: syntax error genvar3.v:21: error: invalid module item. mint@ubuntu:~/Desktop/verilog$
エラーメッセージがわかりにくいんじゃーーーー!
とりあえず、初心を忘れないためにメモしておいた。