2015-05-07 4 views
-1
class data_s; 
    int c=5; 
endclass 

class config_c; 
    data_s format[]; 
    rand int num_supp = 5; 

    function new(); 
    format = new[num_supp]; 
    foreach(format[i]) 
     format[i] = new(); 
    endfunction 
endclass 

class packet; 
    rand int nsid; 
    rand int a; 
    rand int b; 
endclass 

    program p; 
    packet p = new; 
    config_c conf = new; 

    initial begin 
     p.randomize() with {nsid < (conf.num.supp + 1); 
         nsid > 0; 
         if(a < conf.format[nsid - 1].c) 
         b=0; 
         else 
         b=1; 
        } 
    end 
endprogram 

В этом коде, я получаю фатальную ошибку, потому что nsid не в диапазоне num_supp и поэтому, если условие он пытается получить доступ к объекту, который не создается (например, формат [32 «hb235_44d5]).рандомизации Заказать в SystemVerilog

«решить nsid before b» также не работает.

Я могу использовать это условие, вне функции рандомизации, и это может сработать, но что может быть решением этой проблемы в функции рандомизации?

+0

Все еще есть много ошибок. Вы посмотрели мой ответ и сравнили различия? –

+0

@ dave_59: Да, я нашел ошибки. Но что более важно, я получил свой ответ. Большое спасибо. –

ответ

4

Проблема SystemVerilog не позволяет использовать выражение со случайной переменной как индекс массива. Вы должны указать свое ограничение в виде цикла foreach. Также - решение перед директивой не изменяет пространство решения, просто распределение значений, выбранных в качестве решений.

class data_s; 
    bit [31:0] c=5; 
endclass 

class Config; 
    data_s format[]; 
    rand int num_supp = 5; 

    function new(); 
    format = new[num_supp]; 
    foreach(format[i]) 
     format[i] = new(); 
    endfunction 
endclass 

class packet; 
    rand bit [31:0] nsid; 
    rand bit [31:0] a,b; 
endclass 

module top; 

    packet p = new; 

    // Some other stuff 
Config conf=new(); 
initial begin 
    p.randomize() with {nsid < (conf.num_supp + 1); 
         foreach (conf.format[i]) 
       i == (nsid -1) -> 
         if(a < conf.format[i].c) 
         b==0; 
         else 
         b==1; 
         }; 
    $display("%p",p); 
    end 

endmodule