2016-10-20 5 views
0

Lieblings In meinem Testfall generieren verwenden, schreibe ich ein Programm wie unter“Wie in Gabelblock in System Verilog

define NUM_TEST 10 
program test(); 
    bit [31:0] a[NUM_TEST]; 
    bit [31:0] b[`NUM_TEST]; 
    .... 
    initial begin 
    ..... 
    fork 
     aaa (a[0], b[0]); 
     aaa (a[1], b[1]); 
     ................ 
     aaa (a[9], b[9]); 
    join 
    ..... 
    end 
    task aaa (bit [31:0] a, bit [31:0] b); 
    ..... 
    endtask 
endmodule 

Wie Sie sehen, ich nenne Aufgabe aaa mit NUM_TEST Zeit (ich will alle excuted Aufgaben die gleiche Zeit) gibt es eine Möglichkeit, meinen Code zu reduzieren, wie:

**fork 
     genvar k; 
     generate 
     (for k=0; k<NUM_TEST; k++) 
      aaa(a[k], b[k]); 
     endgenerate 
    join** 

(natürlich obigen Code ist falsch Syntax);

FYI:. ich will nicht, wie verwenden:

fork 
     for (int i=0; i<`NUM_TEST; i++) 
     aaa(a[i], b[i]); 
    join 

-> das ist falsch für meine Idee, weil Aufgabe in Reihenfolge ausgeführt wird, nicht zur gleichen Zeit. .

Bitte helfen Sie mir :(

+0

Oh, es falsche Syntax erhalten, wenn ich diese Frage vorlegen Mein alter Code ist: –

Antwort

3

Was Sie wollen, ist eine Kombination aus fork/join_none und wait fork

module test; 
`define NUM_TEST 10 
program test(); 
    bit [31:0] a[`NUM_TEST]; 
    bit [31:0] b[`NUM_TEST]; 
    .... 

initial begin 
    ..... 
     for (int i=0; i<`NUM_TEST; i++) 
     fork 
      automatic int j = i;   
      aaa(a[j], b[j]); 
     join_none 
     wait fork; 
    .... 
    end 
+0

Vielen Dank für Ihre Antwort: Ich möchte nach ** warten Fork ** fragen. Es wird warten, bis die Aufgabe für alle Forks abgeschlossen ist. In diesem Fall möchte ich nur warten, bis alle Aufgaben aaa() beendet sind. Wenn ich also einen anderen Fork-Join habe - kein Block, wartet es auch auf diese Aufgabe? –

+0

Sie können die 'for' Schleife bis zum' wait fork; 'in eine andere Aufgabe zu mak Vergewissern Sie sich, dass die 'wait fork' nur die 'aaa()' Threads abwartet. – AldoT

+0

@ThinhNguyenQuoc, 'wait fork' wartet auf alle untergeordneten Prozesse des Prozesses, der die Anweisung' wait fork' ausführt. Verwechseln Sie das nicht mit dem Aufruf von "task" oder "function", da dies keinen eigenen Prozess erzeugt. Untergeordnete Prozesse werden nur durch Anweisungen im 'fork'-Block erstellt. Es ist einfach so, dass Ihre Fork-Anweisung Taskaufruf ist, aber jede Prozeduranweisung innerhalb einer Verzweigung erstellt einen Prozess. Also @ AldoTs Rat ist nicht korrekt. –