0

長さ x の配列があります。特定のテストベンチの信号出力は、0:x-1 からのそれぞれの順序で配列内の各値になります。

特に私の問題では、配列はフィルター係数であり、テストベンチはインパルス応答です。係数はテストごとに変化するため、テストはセルフチェックである必要があります。これには動的な長さのシーケンスが必要です。

私が望むシーケンスは次のようになります。

always @(posedge clk) begin
  assert_sequence : assert property (    
        (data_out == array_1[0])
    |=> (data_out == array_1[1])
    |=> (data_out == array_1[2]) 
    |=> (data_out == array_1[3]) 
    |=> (data_out == array_1[4]) 
    |=> (data_out == 0) ) 
      $info("Seen the sequence");
    else
      $error("Sequence was incorrect");  
  end

これを動的に行うことは可能ですか? genvar for ループを試しましたが、エラーがスローされます。フォーラムを検索しましたが、私の要件を満たすものは見つかりませんでした。

おそらく、このようなものは正しい答えを与えることができますか?

    always @(posedge clk) begin
  assert_sequence : assert property (    
        (data_out == array1[0][0])

  for(genvar i = 1; i < 5, i++) begin
    |=> (data_out == array1[i])
  end

    |=> (data_out == 0) ) 
      $info("Seen the sequence");
    else
      $error("Sequence was incorrect");  
  end
4

2 に答える 2

1

前述のように、SVA はおそらくここでは自然な選択ではありません。しかし、確かに興味深い問題なので、少し考えてみました。

再帰プロパティを使用してみましたか? 次のようなもの:

property check_sequence(coefficients);
  (data_out == coefficients[0]) ##0
    ((coefficients.size() == 1) or 
     (##1 check_sequence(coefficients[1:coefficient.size()]));
endproperty

assert_label: check_sequence(array_1);

まだトリガーが必要です-元のqでは指定されていません。

それが最も効率的または読みやすいソリューションであるかどうかは別の問題です。

于 2020-05-22T01:09:50.460 に答える