シーケンスとプロパティで内部変数を宣言できます。これらは入力引数を持つこともできます。私があなたの問題にアプローチする方法は次のとおりです。
まず、パターンの 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_out
pattern
チェックの正確な条件が何であるか(正確に開始および停止したいとき)がわからないので、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
ている間に後続のパターンの発生をチェックし、 になったら一致を停止する必要があります。tx
1
0
ここで詳細を自分でいじる必要がありますが、あなたの質問はほとんど答えられたと思います。アサーション コンストラクト内で内部変数を使用する方法を確認できます。
PS 必要に応じて、完全なコード (テスト ハーネスを含む) はこちら: http://www.edaplayground.com/x/4my