0

Ich bin neu im System Verilog und UVM, und ich habe bereits diesen Thread gesehen:Erzwingen mehrere Drähte in Ausführung SV/UVM

Regex in SV or UVM

Ich kann nicht überall ein gutes Beispiel finden auf Welche Art von Syntax sollte ich verwenden, um mehrere Drähte in einem Entwurf mit regulären Ausdrücken/Platzhaltern zu erzwingen.

Zum Beispiel:

Lassen Sie uns sagen, ich habe ein Modul namens my_fifo, die in den Entwurf mehrfach instanziert:

top.dut.my_fifo_in 
top.dut.master.my_fifo_a 
top.dut.slave.axi.my_fifo_out 

und der Block my_fifo enthält einen Draht genannt:

wire force_me_to_1 = 1'b0; 

Ich möchte diese Leitung in allen Instanzen erzwingen, die mit "my_fifo" beginnen. So etwas wie (entschuldigen Sie mich für die Syntax, es ist nur meine Absichten für die Klärung):

force "*my_fifo*.force_me_to_1" = 1'b1; 

Und es wird, dass Draht 1 in allen oben genannten Fällen machen.

+0

Es gibt keine Möglichkeit von außerhalb des Moduls in der Sprache zu tun. – Serge

+0

Ich stimme zu. Ich habe mich gefragt, ob 'uvm_hdl_force' eine Wildcard nehmen könnte, aber es sieht nicht so aus. –

+0

Vielen Dank für die Antworten. Was meinen Sie mit außerhalb des Moduls? Meinst du, dass es nicht als Teil der Schnittstelle zu einem DUT getan werden kann? Was ist mit der Verwendung von Assign anstelle von Kraft? Und zuletzt - was würden Sie stattdessen vorschlagen? – EEliaz

Antwort

3

Es gibt zwei Möglichkeiten, sich dem zu nähern, was Sie tun möchten: Verwenden Sie den VPI oder verwenden Sie die Befehlszeilenschnittstelle Ihres Tools.

Beide Ansätze beinhalten das Schreiben eines Algorithmus, der über alle Instanzen im gesamten Entwurf iteriert und die Namen auswählt, die Ihrem regulären Ausdruck entsprechen. Sobald Sie eine ausgewählte Instanz haben, können Sie den individuellen Befehl force entweder mit einem VPI-Aufruf in C oder einem Werkzeugbefehl (normalerweise Tcl) anwenden. Erklären, wie man das macht, ist ein zu weites Thema in diesem Forum.

Beide Ansätze erfordern, dass Sie bestimmte Werkzeugoptimierungen aktivieren, die die Signalnamen beibehalten, die Sie erzwingen möchten. Das könnte eine schwere Leistungsstrafe sein. Sie sollten also Alternativen zu Ihrem Ansatz untersuchen.

1

Es gibt keinen direkten Weg, um zu tun, was Sie wollen, aber es gibt einige Tricks, die Sie in Ihrem Fall erkunden könnten.

Angeblich soll die irgendwo in einem Top-Instanz, die Sie ein Flag definieren, sagen force_me

module tb_top; 
    bit force_me = 0; 
    ... 
endmodule 

in Ihrem Modul Sie so etwas wie das fließende schreiben:

module my_fifo; 

    logic force_me_to_1; 

    always @(tb_top.force_me) begin 
     if (tb_top.force_me) 
      force force_me_to_1 = 1; 
     else 
      release force_me_to_1; 
    end 
    .. 
endmodule 

jetzt in der Testbench Sie sollte in der Lage sein zu sagen

tb_top.force_me = 1; 
... 
tb_top.force_me = 0; 

Dies sollte das Signal in allen Instanzen des Moduls 'my_fifo' erzwingen (von innerhalb des Moduls :-))

+0

Danke für die Antwort. Ich werde versuchen, einen Testfall davon zu machen, aber vielleicht können Sie schneller antworten, was passiert, wenn das Bit "tb_top.force_me" nicht definiert wird? – EEliaz

+0

@EEliaz es Sie nicht definieren, das Schema wird nicht funktionieren. Sie werden eine undefinierte Variable haben. Ich bin nicht sicher, aber Verilog könnte versuchen, in diesem Fall automatisch eine Ein-Bit-Variable für Sie zu definieren, siehe 'default_nettype-Direktive. Aber das wäre eine schlechte Übung. – Serge

Verwandte Themen