1

たとえば、シリアル出力 s_out= 1011101110111011 (LSB ファースト) でチェックする必要があるパターン pt=1101 があります。Alwaysブロックを使用せずにSVAのみを使用して「s_out」の「pt」をチェックしようとしています。注: pt と s_out は両方とも可変長です。

pt と s_out の長さに対して 2 つのカウンターを使用しようとしていますが、SVA でそれらを使用する方法がわかりません。

どんな提案でも非常に役に立ちます。ありがとう、ススン

4

1 に答える 1

2

シーケンスとプロパティで内部変数を宣言できます。これらは入力引数を持つこともできます。私があなたの問題にアプローチする方法は次のとおりです。

まず、パターンの 1 回の一致を処理するシーケンスを作成します。このシーケンスは、長さとともにパターンを引数として受け取ります。

sequence pattern_in_output(pattern, int unsigned len);
  int unsigned count = 0;
  (
    s_out == pattern[count],
    $display("time = ", $time, " count = ", count),
    count += 1
  ) [*len];
endsequence

pattern引数が型指定されていないことに注意してください。また、どのように機能するかを確認できるように、いくつかのデバッグ プリントも残しました。このシーケンスが開始されると、 の適切なビットに一致するlenサイクルがチェックされます。s_outpattern

チェックの正確な条件が何であるか(正確に開始および停止したいとき)がわからないので、tx現在送信しているかどうかを示す信号があると仮定しました(1送信していることを意味するので、チェック、0そうでないことを意味するため、チェックなし)。

プロパティは次のようになります。

assert property (
  @(posedge clk)

  // check first group
  $rose(tx) |-> pattern_in_output(pt, 4)

  // if 'tx' is still high, need to check for another occurence
  // - repeat this forever
  ##1 tx |-> pattern_in_output(pt, 4)

  // this line causes and internal error
  //##1 tx |-> pattern_in_output(pt, 4) [+] or !tx

  // this prints when the property exits
  ##0 (1, $display("exited at ", $time))
);

の立ち上がりエッジのチェックを開始しtxます。以前に定義したシーケンスの一致を探します。その後、まだ送信中である可能性があり、パターンの 2 回目の発生を確認する必要があります。この 2 回目の発生後txも が1である場合は、3 回目などを確認する必要があります。

ここで、回答の半分を残してしまったことをお詫びしなければなりません。私は EDAPlayground でこの例を実行していましたが、これを機能させることができませんでした (シミュレーターの内部エラーが発生し続けました)。この行##1 tx |-> pattern_in_output(pt, 4)は、2 回目のオカレンスのみをチェックします。その下にある (コメントアウトされている) は、静止し##1 tx |-> pattern_in_output(pt, 4) [+] or !txている間に後続のパターンの発生をチェックし、 になったら一致を停止する必要があります。tx10

ここで詳細を自分でいじる必要がありますが、あなたの質問はほとんど答えられたと思います。アサーション コンストラクト内で内部変数を使用する方法を確認できます。

PS 必要に応じて、完全なコード (テスト ハーネスを含む) はこちら: http://www.edaplayground.com/x/4my

于 2014-09-16T20:30:32.870 に答える