2017-01-30 20 views
0

小さな練習をしているVerilogに慣れてきていますが、今では線形フィードバックシフトレジスタを実装しようとしています。単純なVerilog forループのエラー

forループを使ってalwaysブロック内にflipflopチェーンをモデル化しようとしていますが、iverilogはエラーを受け取り続けますlfsrに「i」は不明です。 "i"は反復変数です。 lfsrは私のモジュールです。

always @(posedge clk or negedge res_n) begin 
    if(res_n == 0) begin 
     // ... implement reset 
    end 

    else begin 
     flops[0] <= input_wire; 
     for (i = 0; i <= width-2; i = i+1) begin 
      flops[i+1] <= flops[i]; 
     end 
    end 

end 

誰かが私を助けてくれますか?

ありがとうございました。

答えて

1

最初に変数iを宣言するか、または指定のないレジスタとみなされます。これにより、コンパイラはunknown registerエラーを返します。あなたが別の答えが述べたように、ループの中にループ変数を宣言する必要が

integer i; 
+0

それは確かにそれでした。私が読んだVerilogチュートリアルでは、そうするように言わなかったのは不思議です。これはコンパイラに依存しているのでしょうか? – Jersey

+0

@Jerseyコンパイラに依存しているかどうかはわかりません。しかし、Verilogの私の理解のために、不思議で不思議なエラーやバグを作らないためには、すべてのレジスタ、ワイヤ、または変数を可能な限り指定する方がよいでしょう。 –

+1

コンパイラに依存しません。ループ変数を 'for'ループで宣言する必要があります。 –

1

:私はforコードブロック外の整数として、以下のよう

宣言。しかし、これはブロックalwaysの外側にある必要はありません。代わりに、ラベルbegin ... endブロックの場合は、その内部にループ変数を宣言することができます。この宣言はブロック内の最初のものでなければなりません。これはより良いカプセル化の利点を持っています:

always @(posedge clk or negedge res_n) begin 
    if(res_n == 0) begin 
     // ... implement reset 
    end 

    else begin : SOME_NAME 
//     ^
//     | 
//    this is a label 

     integer i;  // declaring i here results in better encapsulation 
         // the declaration HAS to be before "imperative" (ie executable) code 

     flops[0] <= input_wire; 
     for (i = 0; i <= width-2; i = i+1) begin 
      flops[i+1] <= flops[i]; 
     end 
    end 

end