2016-04-06 28 views
2

インターフェイスの配列であるモジュールにインターフェイスを渡そうとしています。systemverilog - >別のインターフェイスをインスタンス化するインターフェイスからパラメータを渡す

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 

だから、私の質問は、my_front_interfaceの配列要素は、DATA_WIDTHの異なる値を持つことができます。もしそうなら、どうですか? my_front_interfaceのすべての配列要素の上に定義されたコードでは私のコメントから、次の4

おかげ

+0

をあなたが使用について確信していますネストされたモジュール?モジュールAをインスタンス化するとき、入力引数は 'front_interface'型の' my_front_interface'ですが、 'my_front_interface'インスタンスは' front_interface'型です。モジュール宣言は 'module A ...(front_interface fr_if) '。 – sharvil111

+0

変数 'DATA_WIDTH'では、単純にインスタンスの配列を作成するのではなく、さまざまなデータ幅パラメータで複数のインスタンスを作成するための' generate'ブロックが必要です。 [このリンク](http://www.asic-world.com/verilog/verilog2k2.html)と[この質問]を参照してください(http://stackoverflow.com/questions/17734329/system-verilog-parameters-in- generate-block)のブロック例を示しています。 – sharvil111

+0

ありがとうございました。その場合、生成されたインスタンスにさまざまなデータ幅のパラメータをfront_interfaceに割り当てるにはどうすればいいですか? –

答えて

3

のデフォルトDATA_WIDTHを持って、多くのコンパイルエラー与えられたコードでがあるようです。しかし、私は自分の理解に従って解決しようとしました。

変化DATA_WIDTHインスタンスを作成するためには、インタフェースfront_interfaceは様々なインスタンスでDATA_WIDTHについての情報を取得する必要があります。したがって、〜front_interfaceエンティティの配列を追加することにより、が追加されます。そのアレイのサイズは、NO_OF_IN_PORTSパラメータによって決定される。

さらに、あなたは複数のインスタンスfront_portを作成するためのgenerateブロックを使用する必要があります。各インスタンスは要素をfront_interfaceエンティティのパラメータ配列からピックアップします。

私はDATA_WIDTHのデフォルト値をオーバーライドし、独自のデータ幅でインスタンスを作成します次のコードを作成しました。

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 

出力

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 

エンティティのパラメータの配列を渡すためthis page参照。また、SystemVerilog IEEE 1800-2012セクション27はgenerateブロックに役立ちます。

+0

それは私の問題を解決します。どうもありがとうございます。 –

+0

モジュールAのfront_interface(fi_if)にアクセスするのに苦労しています。構文は何ですか? ** fi_if.MULTIPLE_INSTANCES.UNIQUE_DATA_WIDTH [0]ではありません.front_ports.data **? –

+0

ああはい。 [Section 2.5 Sutherland Paper](http://www.sutherland-hdl.com/papers/2006-SNUG-Boston_standard_gotchas_paper.pdf)で議論されている無名生成ブロックスコープについては、** gotchaがあるようです。 'begin:MULTIPLE_INSTANCES ..end'を削除し、' testbench'から 'my_front_interface.UNIQUE_DATA_WIDTH [i] .front_ports.DATA_WIDTH'を使用してください。モジュールAからのアクセスのために、 'fi_if.UNIQUE_DATA_WIDTH [i] .front_ports.DATA_WIDTH'はうまくいくはずですが、**なぜ動作していないのか混乱しています**。 – sharvil111

0

はい、DATA_WIDTHごとにデフォルトでは4ビットでdataが作成されます。

以下のコードを出力して確認してください。 (コードでは、2つのインタフェース配列は、異なるパラメータ値で、f & f5は、物事をより明確にするために、front_interfaceでインスタンス化されている

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 

とコードの出力:。

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

'front_port 'のインスタンスの数は、パラメータNUM_OF_IN_PORTSによって制御されます。 – rahulcodesinverilog

+0

はい、まさしく私がやったことです。 'front_port#(5)f5 [NO_OF_IN_PORTS - 1:0]()'は、パラメータ 'NO_OF_IN_PORTS'に応じてfront_portのインスタンスを作成します。 –

+0

my_front_interfaceの配列**要素**は、DATA_WIDTHの値が異なりますか? OPsの質問によると?私は、これがDAAT_WIDTH(4)と同じ値のインスタンスの配列を作成すると思います。次に、DATA_WIDTH(5)を使用して別のインスタンスのインスタンスを作成し直しました。 OPの目的は、異なるデータ幅を持つインスタンスの単一の配列を持つことです。 – rahulcodesinverilog

関連する問題