2012-03-05 33 views
9

Tôi đang cố gắng tạo một trình so sánh nhiều giai đoạn trong verilog và tôi không thể tìm ra cách tăng nhiều gen trong một vòng lặp tạo đơn. Tôi đang cố gắng như sau:Tăng nhiều Gen trong Tuyên bố Tạo Verilog

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 

Và nhận được lỗi sau:

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

Bất cứ ai cũng biết làm thế nào để tăng nhiều genvars trong tạo ra tuyên bố tương tự? Hoặc ít nhất có được chức năng tương đương?

Trả lời

5

Giả sử rằng ci1 có một nửa độ sâu của tc và bạn muốn, nói ci1[0] = min(tc[0], tc[1]), ci[1] = min(tc[2], tc[3]) vv, sau đây nên làm việc:

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?

này không được phép vì một tạo cho vòng lặp tạo ra một tiềm ẩn tuyên bố localparam cho biến vòng lặp và xây dựng các mục trong vòng lặp chỉ dựa trên localparam đó. Điều này có nghĩa là bất kỳ mục nào bên trong vòng lặp phải hợp lệ bên ngoài vòng lặp nếu genvar được khai báo là 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 

trở thành

//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 

Trong trường hợp này bạn có thể tạo ra một giá trị 'liên tục' phụ thuộc vào genvar sử dụng một tham số rõ ràng bên trong vòng lặp.

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

rất thú vị! Liệu localparam tạo ra một cái gì đó trong phần cứng? – Adam

+1

No. Localparams là các hằng số được sử dụng để thiết kế. –

Các vấn đề liên quan