2011-04-09 257 views
0

雖然變量'j'不是genvar變量,但genvar中有以下verilog代碼。當我檢查語法(使用Xilinx)時,我在'if'語句的行上收到錯誤「if if語句中的非法條件表達式」。將「j」更改爲genvar變量不能解決問題,我該如何正確讀取「j」?謝謝你的幫助。Verilog'if'語句使用變量

genvar i; 

generate 
integer j=0; 

    for(i=0; (i<10); i=i+1) begin: gen_columns 
     if (j==0) begin 
      //some code 
     end 
assign j=j+1; 
    end 

endgenerate 

回答

1

的生成塊需要時闡述的設計加以解決,以標準的Verilog模塊的項目(模擬開始之前)。在你的例子中,該工具試圖將if (j==0)評估爲一個常量,並且不能這樣做。

從你的例子中不清楚你想要做什麼。下面是對我工作的一對夫婦的例子:

wire [9:0] w; 
genvar i; 

generate 
    for(i=0; (i<10); i=i+1) begin: gen_columns 
     if (i==0) begin 
      assign w[i] = 1'b0; 
     end else begin 
      assign w[i] = 1'b1; 
     end 
    end 
endgenerate 

initial begin 
    $display ("%x", w); 
    $finish; 
end 

此代碼遍歷總線的位並分配取決於位不同的值。輸出是3fe

reg clk; 
integer j [0:1]; 
genvar i; 

generate 
    for(i=0; (i<2); i=i+1) begin: gen_columns 
     always @(posedge clk) begin 
      if (j[i]==0) begin 
       j[i] <= j[i] + 1; 
      end 
     end 
    end 
endgenerate 

initial clk = 1'b0; 
always #1 clk = ~clk; 

initial begin 
    $monitor ("%d: j[0]: %d, j[1]: %d", $time, j[0], j[1]); 
    repeat (2) @(posedge clk); 
    j[0] = 0; 
    j[1] = 0; 
    repeat (2) @(posedge clk); 
    $finish; 
end 

此代碼爲j[0]j[1]創建相同邏輯遞增他們是否是零。輸出是:

0: j[0]:   x, j[1]:   x 
3: j[0]:   0, j[1]:   0 
5: j[0]:   1, j[1]:   1 

我的第二種情況和你的例子之間的區別是,if語句和賦值被放置在一個always塊。設計完成後,該工具將用兩個始終代替生成塊,其中一個爲i=0,另一個爲i=1

樣式說明:雖然從多個總是更新變量的變量是合法的verilog,但它並不被認爲是好的做法。它可能會合成爲乘法驅動信號,並可能在仿真中引入競爭條件。在我的第二個例子中,如果作業是j = j + 1(不含[i]),那麼j將被分配到多個始終塊中。

1

從上面的代碼片段中,我無法弄清楚你想要建立什麼類型的硬件。

for循環:以Verilog for循環主要用於

- iterating over a set of bits for an operation (XORing, demux, et cetera) 
- creating multiple instances of a structure using generate statements 

直從Verilog的LRM用於生成 - 環:

甲生成迴路允許一個或多個變量聲明,模塊,用戶定義的基元,使用for循環多次實例化門基元,連續分配,初始塊和總是要實例化的塊 。在生成for循環中使用的索引循環變量應聲明爲genvar。 for循環中的兩個genvar賦值應分配給同一個 genvar,它是循環索引變量。 for循環中的第一個genvar賦值不應該引用右邊的循環索引變量 。

在你的代碼,什麼是j的目的是什麼?在Verilog中,分配變量然後在同一過程塊中將其用作控制邏輯的做法很糟糕。很可能你需要在生成循環之外的另一個j的程序塊。我不知道代碼中j的用途,但可能類似於以下內容?

// continuously increment counter each clock cycle 
// asynchronous reset capability 
integer j; 
always @(posedge clock, posedge reset) 
    if (reset) j <= 0; 
    else j <= j + 1;