0

テキスト マクロを使用してパラメータを定義したいのMYTYPEですが、その値はテキスト マクロによって渡されます。

`define MY_FEATURE(nam,def) parameter nam=def;

その後

`MY_FEATURE(MYTYPE, 1)

しかし、値は、他のテキスト マクロによって定義されたものによって混合されます。

`MY_FEATURE(NEWTYPE, 2)
`MY_FEATURE(MYTYPE, NEWTYPE)

後者のケースは、defindefine MY_FEATUREに指示ドットを追加しない限り機能しません。

この 2 つの異なるケースを区別し、マクロが定義されている場合にのみマクロを自動的に展開する必要があるため、このコードを思いつきましたが、エラーが発生しました。

`define yea 1
`define nop 0
`define MY_FEATURE(nam,def) `ifdef def parameter nam=`def; `else parameter nam=2; `endif

module test;

  `MY_FEATURE(MYTYPE,yea)
  initial begin
    $display("%d",MYTYPE);
  end
endmodule

上記のコードは機能し、1出力として a を提供します。しかし、私が書くなら

`MY_FEATURE(MYTYPE,10)

他のケースでは、実際の数値をパラメーターに割り当てる必要があるため、取得します

 `ifdef without a macro name - ignored.

私の望ましい結果はMYTYPE10として割り当てられています.これを達成する方法はありますか? ありがとう。

コードはここにあり ます http://www.edaplayground.com/x/6Jha

4

1 に答える 1

1

あなたはそれを考えすぎていると思います。`defineディレクティブ式を作成します。ディレクティブをパラメーターとして別のディレクティブに渡すときに、それを として渡すことができます`yea

以下に例を示します。

`define yea 1
`define nop 0
`define MY_FEATURE(nam,def) parameter nam=def;

module test;
  `MY_FEATURE(MYTYPE,`yea)
  `MY_FEATURE(MYTYPE2,10)
  `MY_FEATURE(MYTYPE3,MYTYPE+MYTYPE2)
  initial begin
    $display("%d %d %d",MYTYPE, MYTYPE2, MYTYPE3); // displays: 1 10 11
  end
endmodule

http://www.edaplayground.com/x/5Pgf


Verilog-AMS (Verilog-A のスーパーセット) は、Verilog (IEEE Std 1364) から派生した独自の言語です。説明書通り。これは、MY_FEATURE新しいディレクティブを作成しないことを意味します。パラメータを作成します。ディレクティブとパラメーターはどちらもシミュレーションでは定数として扱われますが、コンパイルでは異なる動作をします。Verilog (および Verilog 派生言語)の`define/関係は、 C の/parameters関係と同等です。C とは異なり、a の値にアクセスするにはプレフィックスが必要です。#defineconst`define`

ディレクティブもパラメーターも、数値で始めることはできません。最初の文字は、アルファまたはアンダースコア (aka [a-zA-Z_]) でなければなりません。10ディレクティブを使用することはできず、使用しようとしても不正な構文です。コンパイルが不正な構文ディレクティブ名から回復する方法はありません。`yeaこれは、代わりに渡すことを提案した方法ですyea

誰かが素晴らしいモデルを作成した場合、同様に素晴らしいドキュメントやサポートを受ける方法が付属するはずです。

于 2016-05-04T20:58:00.580 に答える