2016-08-07 27 views
0

Gibt es eine Möglichkeit zu fragen, ob die Simulation unter @(posedge clk) Ereignis neben der Verwendung eines benannten Ereignisses ist, die zur gleichen Zeit ausgelöst wird?Synchronisieren mit posegege of clock

Mit folgendem Code, kann ich sicherstellen, dass ich nur am posedge eine Uhr Sachen tun:

module tb; 

    bit clk; 
    always #2 clk = ~clk; 

    event pos_clk; 


    always @(posedge clk) 
    -> pos_clk; 

    initial begin 
    // stuff happens 
    @(posedge clk); 
    $display("[%0d] @(posedge clk)", $time()); 

    // control is passed asynchronously to some task 
    // - since it's already at a posedge, it doesn't need to wait 
    some_task(); 

    // other stuff happens 
    #1; 
    $display("[%0d] #1", $time()); 

    // control is passed asynchronously to some task 
    // - since it's not at a posedge, it needs to catch the next one 
    some_task(); 

    $finish(); 
    end 

    task some_task(); 
    wait (pos_clk.triggered); 
    $display("[%0d] wait (pos_clk.triggered)", $time()); 
    // do relevant stuff 
    endtask 
endmodule 

Gibt es irgendeine andere Weise, die ich dies ohne das zusätzliche genannte Ereignis tun könnte?

Antwort

2

Dies ist, was das ##0 Konstrukt hat (Abschnitt 14.11 Zyklus Verzögerung Siehe: ## der 1800-2012 LRM). Sie haben einen Standardtaktblock zu definieren, was bedeutet, dass Ihre Aufgabe innerhalb eines definiert wird module oder interface

module tb; 

    bit clk; 
    always #2 clk = ~clk; 

    default clocking cb @(posedge clk) 
    endclocking 

    initial begin 
    // stuff happens 
    @(cb) // when using clocking blocks, only use the clocking event 
    $display("[%0d] @(posedge clk)", $time()); 

    // control is passed asynchronously to some task 
    // - since it's already at a posedge, it doesn't need to wait 
    some_task(); 

    // other stuff happens 
    #1; 
    $display("[%0d] #1", $time()); 

    // control is passed asynchronously to some task 
    // - since it's not at a posedge, it needs to catch the next one 
    some_task(); 

    $finish(); 
    end 

    task some_task(); 
    ##0; 
    $display("[%0d] wait (pos_clk.triggered)", $time()); 
    // do relevant stuff 
    endtask 
endmodule 

Mein Rat wäre, auch nicht zu tun und einen Weg finden, um die Aktivierung von some_task synchron zu halten .

+0

Ich möchte die Synchronisation innerhalb einer Klasse durchführen, so dass eine Standardtaktung nicht funktioniert. Was ich im Grunde wollte, war, dass ein Fahrer einen Gegenstand nur an einem Posege bekam. Ich habe Probleme beim Ausführen von virtuellen Sequenzen bemerkt, die an mehreren Uhren arbeiten. Ich denke, die einzige Möglichkeit ist dann, etwas zu tun wie: auf die Uhr warten, prüfen, ob der Gegenstand verfügbar ist, wenn nicht, mach weiter, wenn ja, fang an zu fahren. Dies widerspricht der gesamten TLM-Philosophie, transaktionsgesteuert zu sein (d. H. Mit get_next_item()), aber gleichzeitig lebt der Treiber in beiden Welten (RTL und TLM) und muss beide Aspekte abstimmen. –

+0

Auch wenn ich 'some_task()' synchron ausgelöst habe, möchte ich vielleicht eine Programm-Assertion schreiben, um diese Vorbedingung zu überprüfen (diese Ausführung hat tatsächlich bei einem posedge begonnen). –

+0

Ich halte es immer noch für eine schlechte Methode, Sync- und Async-Verhalten in derselben Prozedur zu mischen. Aber ich denke nicht, dass Sie eine andere Wahl haben als das, was Sie ursprünglich gepostet haben. –