2016-08-19 1 views
1

Ich bin neu im Systemverilog und versuche, eine Systemverilog-Testbench zu erstellen. Ich habe einen Prüfling, der über einen Multiplexer mit einem von zwei externen Modulen verbunden werden sollte. Ich möchte die Verbindung während der Simulation wechseln und ich möchte Systemverilog-Schnittstellen für die Verbindung zwischen dem DUT und dem Multiplexer sowie die Verbindung zwischen Multiplexer und den beiden externen Modulen verwenden. Die Signale in der Schnittstelle sind bidirektional.SystemVerilog Schnittstellenmultiplexer

Ich habe Schwierigkeiten beim Schreiben des Multiplexers. Ich bekomme einen Fehler für die aktuelle Implementierung, dass die LHS des Ausdrucks keine Verbindung sein kann. Wenn ich den Typ in der Schnittstelle zu Logik ändere, bekomme ich einen Fehler, dass dies bei bidirektionalen Signalen nicht möglich ist. Ich habe versucht, google, aber ich habe keine Tutorials zum Verbinden von Schnittstelle zu Schnittstelle gefunden. Ist das nicht möglich? Oder gibt es eine bessere Art zu tun, was ich versuche zu tun?

Bisher habe ich folgendes:

interface flash_connect_interface; 
    wire interface_f_cle; 
    wire interface_f_ale; 
endinterface: flash_connect_interface 


module flash_connect_testbench_top;  
[...] 
    // Interfaces 
    flash_connect_interface flash_connect_interface_i0(); 
    flash_connect_interface flash_connect_interface_i1(); 
    flash_connect_interface flash_connect_interface_i2(); 

    // Connecting DUT to interface 
    flash_connect flash_connect_i0( 
    .flash_connect_interface_i(flash_connect_interface_i0), 
); 

    // Multiplexer 
    flash_connect_mux mux1(
    .flash_connect_interface_i_0(flash_connect_interface_i0), 
    .flash_connect_interface_i_1(flash_connect_interface_i1), 
    .flash_connect_interface_i_2(flash_connect_interface_i2), 
    .select(sel) 
); 

    nand_model nand_model0 (
     .Cle  (flash_connect_interface_i1.interface_f_cle), 
     .Ale  (flash_connect_interface_i1.interface_f_ale), 
     ); 

    nand_model nand_model1 (
     .Cle  (flash_connect_interface_i2.interface_f_cle), 
     .Ale  (flash_connect_interface_i2.interface_f_ale), 
     ); 
[...] 
endmodule // end testbench_top 



module flash_connect_mux(
    flash_connect_interface flash_connect_interface_i_0, 
    flash_connect_interface flash_connect_interface_i_1, 
    flash_connect_interface flash_connect_interface_i_2, 
    input select 
); 

    always_comb begin 
    // *** Here is the problem *** 
    if (select == 1'b0) flash_connect_interface_i_1 = flash_connect_interface_i_0;  
    else flash_connect_interface_i_2 = flash_connect_interface_i_0; 
    end 

endmodule 

Antwort

1

Die Schnittstellen in diesem Fall bündeln nur von Drähten. Es scheint nichts mit Ihrem Code zu tun zu haben. Wenn Sie jedoch versuchen, die Schnittstelle basierend auf dem Auswahlsignal direkt zuzuweisen, funktioniert es nicht. Sie müssen alle Drähte basierend auf dem Auswahlsignal einzeln zuweisen. Es gibt nichts besonderes zu Mux-Schnittstellen.

Der folgende Code führt das Muxing durch.

interface flash_connect_interface; 
    wire interface_f_cle; 
    wire interface_f_ale; 
endinterface: flash_connect_interface 

module nand_model (inout Cle , inout Ale) ; // Sample nand model 

reg r = 1; 
assign Cle = r?1:1'bz; 
assign Ale = r?1:1'bz; 

endmodule 

module flash_connect_mux (flash_connect_interface flash_connect_interface_i_0 , flash_connect_interface flash_connect_interface_i_1 , flash_connect_interface 

flash_connect_interface_i_2 ,input [3:0] select) ; 
    // Interconnect interface assignment 
    assign flash_connect_interface_i_0.interface_f_cle = (select== 0) ? flash_connect_interface_i_1.interface_f_cle : flash_connect_interface_i_2.interface_f_cle; 
    assign flash_connect_interface_i_0.interface_f_ale = (select== 0) ? flash_connect_interface_i_1.interface_f_ale : flash_connect_interface_i_2.interface_f_ale; 
endmodule 

    module flash_connect (flash_connect_interface flash_connect_interface_i) ; 

     //check flash_connect_interface_i.interface_f_cle ; 
     //check flash_connect_interface_i.interface_f_ale ; 
    endmodule 

module flash_connect_testbench_top; 

reg [3:0] select ; 
    // Interfaces 
    flash_connect_interface flash_connect_interface_i0(); 
    flash_connect_interface flash_connect_interface_i1(); 
    flash_connect_interface flash_connect_interface_i2(); 

    // Connecting DUT to interface 
    flash_connect flash_connect_i0(
    .flash_connect_interface_i(flash_connect_interface_i0) 
); 

    // Multiplexer 
    flash_connect_mux mux1(
    .flash_connect_interface_i_0(flash_connect_interface_i0), 
    .flash_connect_interface_i_1(flash_connect_interface_i1), 
    .flash_connect_interface_i_2(flash_connect_interface_i2), 
    .select(select) 
); 

    nand_model nand_model0 (
     .Cle  (flash_connect_interface_i1.interface_f_cle), 
     .Ale  (flash_connect_interface_i1.interface_f_ale) 
     ); 

    nand_model nand_model1 (
     .Cle  (flash_connect_interface_i2.interface_f_cle), 
     .Ale  (flash_connect_interface_i2.interface_f_ale) 
     ); 

endmodule // end testbench_top 

Link-Tutorial Schnittstelle - https://www.doulos.com/knowhow/sysverilog/tutorial/interfaces/

+0

Vielen Dank für Ihren Kommentar, aber sich leider der Code spielt keine vollständig tun, was ich will: alle Signale bidicrectional sind. In meiner Simulation kann ich folgendes sehen: Für select = 0 werden alle Änderungen an flash_connect_interface_i_1.interface_f_cle an flash_connect_interface_i_0.interface_f_cle übergeben. Aber nicht umgekehrt, die Verbindung ist nicht mehr bidirektional. – Antonio

+0

Im Falle von bidirektionalen Signalen gibt es allgemein qualifizierende Signale, die zum Auslösen der Änderung der Busrichtung verwendet werden. Wir könnten das im Modell auch dazu verwenden, ähnliche Dinge zu tun. –

+0

Meinen Sie, diese Funktionalität in den Multiplexer zu integrieren? Etwas wie: if (dir = 0) assign interface_i_1.interface_f_cle = interface_i_0.interface_f_cle sonst assign interface_i_0.interface_f_cle = interface_i_1.interface_f_cle – Antonio

Verwandte Themen