11

SystemVerilog は、一般的なコード部分 (関数、型、定数など) の名前空間を提供するパッケージを追加しました。ただし、パッケージはインスタンス化されていないため、パラメーター化できず、パラメーター化されたメンバーの扱いには問題があります。実際には、カスタム型にはフィールド幅などを指示するいくつかのパラメーターがあることが非常に多いため、これはかなり制限的であることがわかりました。

私は通常、デフォルト値のパラメーターを使用し、一部のアプリケーションのパッケージ ソース コードを変更する必要があることを理解することでこれに対処しますが、これは非常に間違っているように思えます。しかし、これをよりきれいに処理する方法をまだ見つけていません。例えば:

package my_pkg;
    parameter ADDR_MSB = 7;
    parameter DATA_MSB = 31;

    typedef struct {
        logic [ADDR_MSB:0] address;
        logic [DATA_MSB:0] data;
    } simple_struct_t;

endpackage

これに対処するよりクリーンな方法を見つけた人はいますか?パッケージはコードをより安全に再利用できるようにする SV への非常に強力な追加機能であると考えているため、ぜひお聞きしたいのですが、この制限はかなり厳しいものです。

4

7 に答える 7

4

いくつかの考えがあります。まず、構造体ではなくクラスを使用してデータをモデル化することに傾倒します。クラスは、パラメーター化、動的割り当て、ランダム化、カバーグループの組み込みなどを行うことができます。パックされた構造体が必要な場合にのみ構造体を使用します。パックされた構造体は、通常のベクトルのように割り当ててから、名前付きフィールドを使用してデータにアクセスできるため、優れています。非常に素晴らしい。:)

第 2 に、パッケージ パラメータを再定義できたとしても、シミュレーションではパッケージの「インスタンス」は 1 つしかありません。モジュールやクラスのように、異なるパラメーター値を持つ複数の特殊化を行うことはできません。そのため、パラメーターを廃止し、代わりにマクロを使用することが実行可能な解決策であるように思えます。私はマクロを使用するのは好きではありませんが、マクロを使用すると、ソース コードを変更せずに新しい値で再コンパイルできます。

于 2010-10-23T00:17:23.620 に答える
3

ええ、同意します。これは、パッケージに欠けている機能です。

ここで唾を吐くだけですが、パラメーターをsecodパッケージに抽象化し、コンパイル時に適切なパラメーターを使用してパッケージを調整できます。それがあなたが本当に望んでいることではないことはわかっていますが、それはあなたを近づけるかもしれません.

プロジェクトでこれに直面した場合、各構成を表す複数のパッケージになってしまうと思います。

于 2010-10-17T00:18:57.877 に答える
3

パラメータ化されたマクロを使用して、特定の幅を持つ型に名前を付けることができます。

`define SIMPLE_STRUCT(NAME) \
   simple_struct_t_``NAME``

`define SIMPLE_STRUCT_DEF(NAME, ADDR_MSB, DATA_MSB) \
 typedef struct { \
        logic [ADDR_MSB``:0] address; \
        logic [DATA_MSB:0] data; \
    } `SIMPLE_STRUCT(NAME)

次に、コードのどこかで、必要な構造を定義できます。

`SIMPLE_STRUCT_DEF(narrow, 7, 31)
`SIMPLE_STRUCT_DEF(wide, 15, 63)

そして、名前だけを使用して、必要な場所で使用します。

`SIMPLE_STRUCT(narrow) narrow1, narrow2;
narrow1.data = 0;
narrow2 = narrow1;
...
于 2013-08-31T21:53:34.237 に答える
2

これは、パッケージに何を入れたいかによって、当てはまる場合と当てはまらない場合がありますが、インターフェイスはパラメーター化でき、ツールがサポートしている場合は合成可能です。

http://www.doulos.com/knowhow/sysverilog/tutorial/interfaces/に例があります。

于 2011-03-19T18:53:27.763 に答える
1

同じ質問があり、同僚が次のことを提案しました。

//defines.sv:

`ifndef MY_DEFINES
  `define MY_DEFINES
     `define TYPEDEF_VECTOR_T typedef logic [WIDTH-1:0] vector_t;
`endif

//mod_sub.sv:

`include "defines.sv"
module mod_sub #(parameter WIDTH = 32);
...
   `TYPEDEF_VECTOR_T
   vector_t some_reg;
...
endmodule

//mod_top.sv:

module mod_top;

   mod_sub #(.WIDTH(8))  mod_sub8;
   mod_sub #(.WIDTH(64)) mod_sub64;

endmodule

System Verilog パッケージはどのモジュールよりも前に作成されるため、コンパイル時にパラメーターによって内容を変更することはできません。

于 2013-07-18T14:45:24.300 に答える
0

私はそれが欠けている機能だとは言いません。あなたがやろうとしていることは、何十年もの間、Verilogのマクロで行われてきました。問題は、パッケージ間の衝突を避けるために、名前を付ける方法をかなりユニークにする必要があることです。それは良くありませんが、それは機能します。

パラメータは少し異なります。これらは、インスタンスごとにカスタマイズするためのものです(VHDLジェネリックのように)。ロジック用のモジュール、またはテストベンチ用のクラスのいずれか。それらに対する私の唯一の批判は、それらを使い始めると、それらは階層全体に伝播する傾向があり、構文は正確にコンパクトではないということです。ただし、非常に強力で、コードの再利用に最適です。

于 2010-11-08T13:36:28.510 に答える
0

これが非常に古い投稿であることは知っていますが、かなり長い間この問題に苦労してきました。適切な解決策を見つけたと思いますが、現在、これが正常に合成できるかどうかを確認するためのツールセットを持っていません.

http://www.sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdfのセクション 5.6.7 を参照してください。

静的関数でパラメーター化された静的クラスを使用することにより、各データ型のさまざまなパラメーター化をその場で呼び出し、インスタンス化ごとにそれらを一意に保つことができます。

これが実行可能なソリューションであることを誰でも確認できますか? ありがとう!

于 2014-09-03T19:55:36.840 に答える