2016-11-30 82 views
0

我目前正試圖編譯一個使用兩個while循環的移位器。 For-loops,shift功能和日誌功能是不可能的。但是,當我嘗試編譯它時,它會在指定的行處拋出「具有非恆定循環條件的循環」錯誤。該線的邊際條件是i < j,其中j是N-1,N是參數。我的問題是,由於N是一個參數,爲什麼即使在編譯時它也不是常量,因此被認爲是一個恆定的循環條件?While循環與非恆定循環條件,但使用參數

下面是代碼:

module shifter(input logic [0:0] SW0, SW1, SW2, SW3, SW4, SW5, SW6, SW7, SW8, SW9, SW10, 
       input logic [0:0] KEY0, KEY1, 
        output logic [0:0] LEDG0, LEDG1, LEDG2, LEDG3, LEDG4, LEDG5, LEDG6, LEDG7); 
parameter N=8;   

//receive input from switches 

logic [7:0] bits = '0; 
logic [7:0] out = '0; 
logic [0:0] move = '0; 
logic [2:0] shift = '0; 
logic next = 1; 

always_comb 
    begin 
    bits[7] = SW7[0]; 
    bits[6] = SW6[0]; 
    bits[5] = SW5[0]; 
    bits[4] = SW4[0]; 
    bits[3] = SW3[0]; 
    bits[2] = SW2[0]; 
    bits[1] = SW1[0]; 
    bits[0] = SW0[0]; 
    shift[2] = SW10[0]; 
    shift[1] = SW9[0]; 
    shift[0] = SW8[0]; 
    end 

logic i = 0;  
logic k = 0; 
logic [31:0] j = N - 1; 

[email protected](negedge KEY0) 
    begin 
     k <= shift[2:0]; 
     do 
     begin 
      move <= bits[0]; 
      do 
       begin 
       bits[i] <= bits[next]; 
       i <= i + 1;  
       next <= i + 1; 
       end  
      while (i < j); //<-------indicated line 
      bits[7] <= move; 
      k <= k - 1; 
     end 
     while(k > 0); 
     out <= bits; 
    end 

always_comb 
    begin 
     LEDG0 = out[0]; 
     LEDG1 = out[1]; 
     LEDG2 = out[2]; 
     LEDG3 = out[3]; 
     LEDG4 = out[4]; 
     LEDG5 = out[5]; 
     LEDG6 = out[6]; 
     LEDG7 = out[7]; 
    end 

endmodule 
+0

嘗試'我<(N-1)'而不是'我 noobuntu

+0

@noobuntu我試過了,它拋出了另一個錯誤,說「循環必須在5000次迭代內終止」 – user7231602

+0

這通常是用for-循環。爲什麼認爲這是不可能的? – toolic

回答

1

的問題不在於j,你可以很容易地解決這個問題,通過改變其聲明的參數:

parameter j = N -1; 

真正的問題是i和您正在使用非阻止分配到i。所以while進入無限循環,因爲(i<j)從來沒有機會改變 - 它總是0.

您將需要一個不同的方法來解決這個問題。

0

幾個問題:

  1. iknext被定義爲單位。他們的價值不能超過一個。聲明爲:

    parameter j = N - 1; 
    bit [$clog2(N):0] next = 1; 
    bit [$clog2(N):0] i = 0; 
    logic [2:0] k = 0; 
    
  2. 當您指定iknext你需要使用阻塞賦值(=)。非阻塞(<=)推遲更新;每個循環將評估i<j,k>0,i + 1;與他們的前negedge KEY0價值。

  3. 阻塞賦值也應該在你的任務用於movebits出於同樣的原因爲iknext

  4. inext需要設置爲0和1,每個迴路k

  5. bits被分配兩個不同的總是塊,因此它不能合成。

  6. k環不能靜態UNROLL這也意味着它不會合成

可以通過從[email protected](negedge KEY0)的循環邏輯移入的底部解決分2,3,4,和5 always_comb已經指定bits。然後將非阻塞更改爲阻止已移動的邏輯。

據我所知,並不是每個合成器都支持while循環。即使您的合成器支持while循環,它也必須靜態展開;所有可綜合循環的要求。

我猜這是一個任務,你的老師要求你做一個沒有for-loops的移位器。有一種方法可以在沒有任何循環的情況下完成這項任務,並且可以減少比目前少得多的代碼和變量。我不會給你代碼,因爲我認爲這是作業。我會建議考慮和比較的概念:

  • 降檔(>>)和算術降檔(>>>)運營商
  • 部分選擇解決

    • case語句(+:),也可以被稱作範圍切片

    您可能還需要對位級聯(例如:{a,b})讀取並複製器(例如:{4{1'b1}})。