FC2カウンター FPGAの部屋 2007年01月12日
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Verilogの疑問

いまVerilogの勉強をしながらVHDLをVerilogに書き直している。Verilogを書いていると疑問がわきあがってきた。
VHDLだとfor generateやfor loopで使用する変数?iは定義されforの中だけでローカルに使用される(私はそういう解釈だった)。
例えばこんな感じ。(前にprocess文はあります)

for i in 0 to DDR_DQS_DM_WIDTH-1 loop
 dqs_reset_1d(i) <= dqs_reset;
 dqs_enable_1d(i) <= dqs_enable;
end loop;
for i in 0 to DDR_DATA_WIDTH-1 loop
 dqs_enable_2d(i) <= dqs_enable_1d(i/8);
 dqs_reset_2d_dqtri(i) <= dqs_reset_1d(i/8);
end loop;


でもVerilogはiを使うとしたら最初にinteger i;として宣言するようだ。そうするとfor(;;)を2つ以上変数iを使用するともしかするとだめなのか?
自動的にコピーを作ってくれれば大丈夫だとは思うが。。。どうなんだろう。

for (i=0; i<=DDR_DQS_DM_WIDTH-1; i=i+1) begin
 dqs_reset_1d[i] <= dqs_reset;
 dqs_enable_1d[i] <= dqs_enable;
end
for (i=0; i<=DDR_DATA_WIDTH-1; i=i+1) begin
 dqs_enable_2d[i] <= dqs_enable_1d[i/8];
 dqs_reset_2d_dqtri[i] <= dqs_reset_1d[i/8];
end


C言語だと逐次実行なのでiを使いまわしても問題ないがVerilogだと同時実行だから問題があるのかも???
そういえばgenvar i;も2回目のgenerate文の中で宣言すると怒られるのでgenerate文の中でローカルに使用されているのではないらしい。ということはこっちも同じiを使ってはだめなのか?
いずれにせよ。シミュレーションできればわかることだが。。。

2007/02/15: always @の中の i はローカル変数として定義して、genvarはそれぞれにユニークな数にすることがわかった。詳しくは、Verilog2001版DDR SDRAMコントローラのバグ参照。
  1. 2007年01月12日 05:44 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:0