2016-06-29 21 views
2

Ich versuche, 3 verschiedene Variablen in System Verilog aber zyklisch randomisieren. Was ich meine ist, ich habe die folgenden drei VariablenZyklische Randomisierung für eine Gruppe von Variablen in SystemVerilog

rand int a; 
rand int b; 
rand int c; 

constraint c_a{ 
    a inside {1,2};  
} 
constraint c_b{ 
    b inside {1,2,3,4,5,6}; 
} 
constraint c_c{ 
    c inside {1,2,3} 
} 

Mit den oben genannten Einschränkungen gibt es insgesamt 36 Kombinationen aller drei Variablen (2x6x3).

Aber wenn wir eine Schleife von 36, laufen in etwa so:

repeat(36) begin 
    this.randomize(a,b,c); 
    $display("%d %d %d", a,b,c); 
end 

wir alle möglichen Kombinationen schlagen wont wie einige Kombinationen wiederholt werden könnte. Daher suche ich nach einer Möglichkeit, all diese Kombinationen zu treffen, indem ich die Schleife genau 36 Mal durchführe.

Ich schrieb einen Brute-Force-Weg diese Variable, indem er erklärt einen anderen Rand zu tun, jede Kombination zu vertreten und mit RANDC auf es etwa so:

int a; 
int b; 
int c; 
randc int k; 

constraint c_k{ 
    k inside {[1:36]}; 
} 

repeat(36) begin 
    this.randomize(k); 
    // randomizing variable 'a' to one of the 2 values. 
    if(k<9) 
    a = 1; 
    else 
    a = 2; 
    // randomizing variable 'b' to one of the 6 values. 
    case(k) 
    1,2,3,19,20,21 : b = 1; 
    4,5,6,22,23,24 : b = 2; 
    7,8,9,25,26,27 : b = 3; 
    // 
    // finishing the sequence 
    // 
    endcase 

    case(k) 
    // similar case statement for the final variable 
    endcase 

    $display("%d, %d, %d", a,b,c); 
end 

Die obige Art und Weise funktioniert gut, aber mir schien es, Art eine hektische Art (die auch nicht für große Kombinationen angewendet werden kann) und sich fragen, ob es eine elegantere Methode gibt, dies zu erreichen.

Danke für Ihre Hilfe.

Antwort

4

Was Sie tun können, ist Ihre Variablen in eine gepackte Struktur verketten und daraus eine Variable Randc machen.

module top; 
class A; 
    typedef struct packed { 
    bit [1:0] a; 
    bit [2:0] b; 
    bit [1:0] c; 
    } abc_t; 
randc abc_t k; 
constraint c_a{ 
    k.a inside {1,2};  
} 
constraint c_b{ 
    k.b inside {1,2,3,4,5,6}; 
} 
constraint c_c{ 
    k.c inside {1,2,3}; 
} 
endclass 
    A h = new; 
    initial 
    repeat(40) begin 
     h.randomize(); 
     $display("%0p",h.k); 
    end 
endmodule 

Beachten Sie, dass die Gesamtzahl der Bits für eine randc Variable erlaubt durch den Simulator

+0

Dank Dave begrenzt werden. Während ich dies ausprobierte, fand ich, dass der Simulator, den ich verwende, bis zu 32 Bits oder nur 1 'int' Typ erlaubt. Dies scheint klein zu sein. Ich verstehe, warum Sie die Datentypen von 'int' (in meinem Beispiel) in 'bit' geändert haben. – user3547407

+2

Denken Sie daran, was Sie mit _6-Bits_ der zyklischen Zufälligkeit zu tun hatten. Sie mussten im Wesentlichen alle möglichen Lösungen abbilden und eine davon zufällig auswählen. Ein Constraint-Solver muss etwas Ähnliches tun, und das Problem wächst exponentiell mit der Anzahl der Bits. Jeder andere Ansatz zu diesem Problem muss die genaue Anzahl der möglichen Lösungen kennen, und das wird sehr schwierig, da die Einschränkungen komplexer werden. –