2012-03-05 66 views
9

我正試圖在Verilog中創建一個多級比較器,我無法弄清楚如何在單個生成循環中增加多個genvars。我想以下幾點:增加Verilog中的多個Genvars生成語句

genvar i,j; 
//Level 1 
generate 
    j=0; 
    for (i=0;i<128;i=i+1) 
    begin: level1Comp 
    assign ci1[i] = minw(tc[j],tc[j+1]); 
    j = j+2; 
    end 
endgenerate 

並獲得以下錯誤:

Error-[SE] Syntax error 
    Following verilog source has syntax error : 
    "encoder.v", 322: token is '=' 
    j=0; 

任何人都知道如何在同一個生成的語句增加多個genvars?或者至少獲得相同的功能?

回答

5

假設ci1tc一半的深度,你想,說ci1[0] = min(tc[0], tc[1])ci[1] = min(tc[2], tc[3])等,下面應該工作:

module st_genvar(); 

    int ci1 [0:127]; 
    int tc [0:255]; 

    function int minw(int i1, int i2); 
     if(i1 < i2) 
     minw = i1; 
     else 
     minw = i2; 
    endfunction 

    genvar i; 
    //Level 1 
    generate 
     for (i=0;i<128;i=i+1) 
     begin: level1Comp 
      assign ci1[i] = minw(tc[i*2],tc[i*2+1]); 
     end 
    endgenerate 

endmodule 
11

Anyone know how to increment multiple genvars in the same generate statement?

這是不允許的,因爲產生的for循環創建一個隱含localparam語句用於循環變量,並僅根據該localparam詳細說明循環中的項目。這意味着如果genvar被聲明爲localparam,循環內的任何項必須在循環外有效。

genvar i,j; 
//Level 1 
generate 
    j=0; 
    for (i=0;i<128;i=i+1) 
    begin: level1Comp 
    assign ci1[i] = minw(tc[j],tc[j+1]); 
    j = j+2; 
    end 
endgenerate 

成爲

//Done for each value of i 
genvar j; 
localparam integer i = i_for_each_iteration; 

j=0; //Not valid outside a procedural context so modelsim complains 
assign ci1[i] = minw(tc[j],tc[j+1]); 
j = j+2; //Also not valid outside a procedural context 

在這種情況下,你可以創建依賴於使用內循環的明確參數genvar一個「常量」值。

genvar i; 
//Level 1 
generate 
    for (i=0;i<128;i=i+1) 
    begin: level1Comp 
    localparam integer j = i*2; 
    assign ci1[i] = minw(tc[j],tc[j+1]); 
    end 
endgenerate 
+0

很有趣! localparam是否在硬件中創造了一些東西? – Adam 2012-03-26 14:26:05

+1

不。Localparams是用於設計細化的常量。 – 2012-03-27 04:02:45