7

インターフェイスを関数またはタスクに渡す合成可能な方法はありますか? 私のユースケースは次のとおりです。いくつかの関数を含むパッケージがあります(ただし、それが役立つ場合はそれらをタスクに変換できます:))、これらはすべてモジュールで使用される可能性があり、モジュールのポートにアクセスする必要がある場合があります。通常、すべてのポートを にグループinterface化し、それをモジュールに追加して、それをvirtual関数に渡します。ただし、私の合成ツールのマニュアルには、virtualサポートされていないと記載されています。

何か不足していますか?signalVHDL の引数と同様に、合成用のタスクにポートを提供する方法が必要ですか?

いくつかのコード例:

module mymod (
    input logic clk,
    input logic rst,
    input uint16_t adr,
    input bit cyc,
    input uint32_t dat_m,
    input bit stb,
    input bit we,
    output bit ack,
    output uint32_t dat_s
    );

    always_comb begin
        mypack::do_something(a, b, c, adr, cyc, dat_m, stb, we, ack, dat_s);
endmodule

理想的には、タスクmypack::do_somethingはポートをポートとして使用できます。つまり、ポートの変更を待機したり、ポートに値を書き込んだりできます。signal基本的に、VHDL で(variableまたは引数ではなく) 引数として渡すことで実現するのと同じですconstant

4

2 に答える 2

2

通常、インターフェイス定義自体でインターフェイス固有の関数を宣言します。こうすることで、タスクまたは関数の宣言のスコープ内にインターフェイス ポートが既に含まれています。

interface int1(ports...);
  function func1(args...);
  // Do stuff with ports and args
  endfunction
endinterface

module mod1(input wire clk,interface intf);
...
  always @(posedge clk)
    intf.func1(module_specific_data); 
...
endmodule
于 2013-01-21T23:20:39.753 に答える
2

残念ながら、関数またはタスクのポート リストを介して渡されるインターフェイスは仮想でなければならないようです。

SystemVerilog IEEE Std 1800-2009 は、関数ポート リストは data_type でなければならないと述べています。関数を宣言する構文については、セクション 13.4、付録 A.2.6、および構文 13-2 を参照してください。また、data_type の定義については、A.2.2.1 を参照してください。IEEE Std 1800-2005 もチェックしましたが、明確に綴られていないだけで、同じ制限があるようです。セクション 12.3 および 1800-2005 の付属書 A を参照してください。

インターフェイスを使用する場合は、インターフェイスで変換関数を使用して構造体を作成してみてください (必要な場合がありpackedます。IEEE Std 1800-2009 セクション 13.4、脚注 #12 を参照してください)。

interface myif ( /* ... */);
/* signal list */
function mypack::var_list_s toStruct();
   /* make translation */
endfunction : toStruct
endinterface : myif

module mymod(myif my_if);
always_comb
   mypack::do_something(my_if.toStruct(), my_if.ack, my_if.dat_s);
endmodule : mymod

または、いつでも`include "myports"どこでも必要な方法でクラシックを実行できます。

于 2013-01-24T19:07:55.417 に答える