2017-01-30 177 views
0

我正在熟悉Verilog做小練習,現在我正嘗試實現線性反饋移位寄存器。簡單Verilog for循環中的錯誤

我想裏面的觸發器鏈模型使用一個for循環總是堵,但iverilog不斷給我的錯誤寄存器``我「」在LFSR未知其中「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錯誤。

申報i設定爲如以下的for碼塊之外的整數:

integer i; 
+0

確實如此。很奇怪我讀的Verilog教程沒有告訴我這麼做。這是編譯器依賴的東西嗎? – Jersey

+0

@Jersey我不確定這是否依賴於編譯器。但是爲了我對Verilog的理解,爲了不發生奇怪或神祕的錯誤或錯誤,最好儘可能指定每個寄存器,線路或變量。 –

+1

它不依賴於編譯器:您確實需要在'for'循環中聲明循環變量。 –

1

需要聲明循環變量的for循環中,作爲另一種答案已表示。但是,這並不需要在always區塊之外。相反,如果(且僅當)標籤 a begin ... end塊,您可以在其中聲明循環變量。這個declcartion必須是第一個塊內。這具有更好的封裝的優點:

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