2

n ビット幅の信号のパス遅延をモデル化しようとしています。次のように、個々のビットごとに遅延を明示的に定義すると、これをうまく行うことができます (n=3):

specify
    (in_data[0] => delayed_data[0]) = 5;
    (in_data[1] => delayed_data[1]) = 2;
    (in_data[2] => delayed_data[2]) = 1;
endspecify 

ただし、in_data が n ビット幅の場合、in_data の各ビットにランダムな遅延を指定できるようにしたいと考えています。私の考えは次のようなものでした:

for (n=0;n<DATA_WIDTH-1;n=n+1)
begin
    specify
       (in_data[n] => delayed_data[n]) = {$random};
    endspecify
end

これは私にエラーを与えます:「'specify'の近く:構文エラー、予期しない指定」

また、指定ブロック内に for ループを配置してみました。これにより、次のエラーが発生しました: 「'begin' 付近: 構文エラー、予期しない開始、終了指定が必要です」

これを正しく行う方法についてのヒントをいただければ幸いです

4

1 に答える 1

3

Doulos Verilog リファレンス ガイド(84 ページ)によると、specify ブロックはmoduleとタグ内でのみ発生し、他のタグ内では発生しendmoduleません。

このVerilogリファレンスWebサイトによると:

Specify ブロックは、モジュール全体の遅延を定義するように設計されています。指定で始まり、endspecify キーワードで終わります。ブロック内でユーザーが指定できるのは、specparam 宣言、パス宣言、またはシステム タイミング チェックです。

これは、specify ブロック内で for ループが許可されていないことを意味しているようです。

したがって、言語の制限により、すべての値を 1 つずつ書き出す必要があると思われます。


モジュールを再構成して、1 ビットの入力から 1 ビットの出力にするというアイデアも考えられます。次に、各指定ブロックには指定する遅延が 1 つだけあり、それぞれにランダムな値を割り当てることができます。これらのモジュールをブロック内に生成するgenerateと、各ビットの遅延を手動で指定する必要がなくなります。

ただし、これはより面倒/厄介な場合があります。

于 2013-09-03T16:46:42.680 に答える