2016-04-06 3 views
2

Ich versuche, eine Schnittstelle an ein Modul übergeben, das ein Array von Schnittstellen ist.Systemverilog -> Übergeben von Parametern von einer Schnittstelle, die eine andere Schnittstelle instanziiert

interface front_port #(parameter DATA_WIDTH = 4); 
     logic [DATA_WIDTH - 1 : 0] data; 
     logic       acknowledge; 

     modport f_interface(input data, output acknowledge); 
endinterface 

interface front_interface #(parameter NO_OF_IN_PORTS = 3); 
     front_port front_ports[NO_OF_IN_PORTS](); 
endinterface 

module A #(parameter NO_OF_IN_PORTS = 3) 
(
    interface front_port; 
); 

module testbench; 
    font_interface #(.NO_OF_IN_PORTS(3)) my_front_interface(); 

    A #(.NO_OF_IN_PORTS(3)) (.front_port(my_front_interface)); 
endmodule 

Also, meine Frage ist, können die Array-Elemente von my_front_interface unterschiedliche Werte von DATA_WIDTH. Wenn das so ist, wie? In dem Code vor allem der Array-Elementen von my_front_interface definiert den Standard DATA_WIDTH haben von 4.en

Dank

+0

Sie sind sicher, über die Verwendung von geschachtelte Module? Beim Instanziieren des Moduls 'A' ist das Eingabeargument' my_front_interface' vom Typ 'front_interface', aber die Instanz' my_front_interface' ist vom Typ 'front_interface'. Die Moduldeklaration könnte wie folgt aussehen:' modul A ... (front_interface fr_if) '. – sharvil111

+0

In Bezug auf die Variable 'DATA_WIDTH' brauchen Sie nicht einfach ein Array von Instanzen zu erstellen, sondern einen' generate' Block, um mehrere Instanzen mit variierenden Datenbreiten zu erstellen. Siehe [diesen Link] (http://www.asic-world.com/verilog/verilog2k2.html) und [diese Frage] (http://stackoverflow.com/questions/17734329/system-verilog-parameters-in- generate-block) für 'generate' Blockbeispiel. – sharvil111

+0

Ok. Vielen Dank. Wenn das der Fall ist, wie ordne ich die erzeugten Instanzen mit variierendem Datenbreitenparameter Front_interface zu? –

Antwort

3

Nach meinen Kommentaren, scheint es viele Kompilierungsfehlern im angegebenen Code. Dennoch habe ich versucht, sie nach meinem Verständnis zu lösen.

Um unterschiedlicheDATA_WIDTH Instanzen zu erstellen, muss die Schnittstelle front_interface Informationen über DATA_WIDTH in verschiedenen Instanzen erhalten. So, Hinzufügen eines Arrays von Parametern zu front_interface Einheit. Die Größe dieses Arrays wird durch NO_OF_IN_PORTS Parameter bestimmt.

Weiter müssen Sie generate Block zum Erstellen mehrere Instanzen von front_port verwenden. Jede Instanz nimmt ein Element aus dem Parameterarray der front_interface Entität auf.

Ich habe folgenden Code erstellt, die die Standardwerte überschreiben von DATA_WIDTH und erzeugen Instanzen mit einzigartigen Datenbreiten.

interface front_port #(parameter DATA_WIDTH = 4); 
    logic [DATA_WIDTH - 1 : 0] data; 
    logic       acknowledge; 

    modport f_interface(input data, output acknowledge); 

    initial 
    begin : DEBUG_DISPLAY 
     $display("DATA_WIDTH for %m is %0d",DATA_WIDTH); 
    end 
endinterface 

// Use array DATA_WIDTH here, for varying data widths. 
interface front_interface #(parameter NO_OF_IN_PORTS = 3, int DATA_WIDTH[NO_OF_IN_PORTS] = '{1,2,3}); 
    genvar i; 
    generate // generate block for multiple instances 
    begin : MULTIPLE_INSTANCES 
     for(i=0;i<NO_OF_IN_PORTS;i++) 
     begin : UNIQUE_DATA_WIDTH 
      // Pick up each element from array to create varying DATA_WIDTH instances 
      front_port #(.DATA_WIDTH(DATA_WIDTH[i])) front_ports(); 
     end 
    end 
    endgenerate 
endinterface 

module A #(parameter NO_OF_IN_PORTS = 3) 
      (front_interface fi_if); 
endmodule 

module testbench; 

    // Override DATA_WIDTH here for different instances 
    front_interface #(.NO_OF_IN_PORTS(3), .DATA_WIDTH('{4,5,6})) my_front_interface(); 

    A #(.NO_OF_IN_PORTS(3)) a1(my_front_interface); 

endmodule 

Output:

DATA_WIDTH for testbench.my_front_interface.MULTIPLE_INSTANCES.UNIQUE_DATA_WIDTH[0].front_ports.DEBUG_DISPLAY is 4 
DATA_WIDTH for testbench.my_front_interface.MULTIPLE_INSTANCES.UNIQUE_DATA_WIDTH[1].front_ports.DEBUG_DISPLAY is 5 
DATA_WIDTH for testbench.my_front_interface.MULTIPLE_INSTANCES.UNIQUE_DATA_WIDTH[2].front_ports.DEBUG_DISPLAY is 6 

Siehe this page für in einer Entität Array von Parametern übergeben. Auch SystemVerilog IEEE 1800-2012 Abschnitt 27 ist hilfreich für generate Blöcke.

+0

Das löst mein Problem. Ich danke dir sehr. –

+0

Ich habe Schwierigkeiten, auf das Front-Interface (fi_if) in Modul A zuzugreifen. Was ist die Syntax? Sollte es nicht ** fi_if.MULTIPLE_INSTANCES.UNIQUE_DATA_WIDTH [0] .front_ports.data ** sein? –

+0

Oh ja. Es scheint einen ** gotcha für unbenannten generate block scope ** zu geben, der in [Section 2.5 Sutherland Paper] (http://www.sutherland-hdl.com/papers/2006-SNUG-Boston_standard_gotchas_paper.pdf) diskutiert wird. Entfernen Sie 'begin: MULTIPLE_INSTANCES ..end' und verwenden Sie' my_front_interface.UNIQUE_DATA_WIDTH [i] .front_ports.DATA_WIDTH' von 'testbench'. Für den Zugriff von Modul A sollte 'fi_if.UNIQUE_DATA_WIDTH [i] .front_ports.DATA_WIDTH' funktionieren, aber ich bin verwirrt, warum es ** nicht funktioniert **. – sharvil111

0

Ja, es wird data nur gemäß DATA_WIDTH erstellt, standardmäßig 4 Bit.

Überprüfen Sie den folgenden Code mit seiner Ausgabe. (Im Code-2-Schnittstelle Arrays mit unterschiedlichen Parameterwerten werden f & f5 in den front_interface instanziiert, um die Dinge klarer zu machen

interface front_port #(parameter DATA_WIDTH = 4); 
    logic [DATA_WIDTH - 1 : 0] data; 
    logic acknowledge; 

    modport f_interface(input data, output acknowledge); 
endinterface 

interface front_interface #(parameter NO_OF_IN_PORTS = 3); 
    // To create array of front_port 
    front_port f[NO_OF_IN_PORTS - 1 : 0](); // data should be 4 bits wide 
    front_port #(5) f5[NO_OF_IN_PORTS - 1 : 0](); // data should be 5 bits wide 
endinterface 

module A #(parameter NO_OF_IN_PORTS = 3) (front_interface x); 
    initial 
    begin 
     $display ("Size of x.f[%0d].data = %0d", 0, $size(x.f[0].data)); 
     $display ("Size of x.f[%0d].data = %0d", 1, $size(x.f[1].data)); 
     $display ("Size of x.f[%0d].data = %0d", 2, $size(x.f[2].data)); 

     $display ("Size of x.f5[%0d].data = %0d", 0, $size(x.f5[0].data)); 
     $display ("Size of x.f5[%0d].data = %0d", 1, $size(x.f5[1].data)); 
     $display ("Size of x.f5[%0d].data = %0d", 2, $size(x.f5[2].data)); 
    end 
endmodule 


module testbench(); 
    front_interface #(3) my_front_interface(); 

    A #(3) (my_front_interface); 
endmodule 

und den Ausgang des Code:.

Size of x.f[0].data = 4 
Size of x.f[1].data = 4 
Size of x.f[2].data = 4 
Size of x.f5[0].data = 5 
Size of x.f5[1].data = 5 
Size of x.f5[2].data = 5 
+0

Die Anzahl der Instanzen von 'front_port' soll durch den Parameter NUM_OF_IN_PORTS gesteuert werden. – rahulcodesinverilog

+0

Ja, genau das habe ich getan. 'Front_Port # (5) f5 [NO_OF_IN_PORTS - 1: 0]()' erzeugt Instanzen von Front_Port, abhängig vom Parameter 'NO_OF_IN_PORTS' –

+0

Haben die Array ** Elemente ** von my_front_interface unterschiedliche Werte von DATA_WIDTH ?? Wie pro OPs Frage? Ich denke, dies wird ein Array von Instanzen mit dem gleichen Wert von DAAT_WIDTH (4) erstellen. Dann haben Sie mit DATA_WIDTH (5) wieder ein anderes Array von Instanzen angelegt. Die Absicht von OP besteht darin, ein einzelnes Array von Instanzen mit unterschiedlicher Datenbreite zu haben. – rahulcodesinverilog

Verwandte Themen