2

requestreqが でアサートされreq_id、対応rspするものが でアサートされるプロトコルがあるとしrsp_idます。これらは故障している可能性があります。req特定の IDreq_idrsp同じ ID の間の clks またはレイテンシーの数をカバーしたいと考えています。私はこのようなものを試しました。これは正しい方法ですか?他に効率的な方法はありますか?

covergroup cg with function sample(int a);
  coverpoint a {
  a1: bins short_latency = {[0:10]};
  a2: bins med_latency = {[11:100]};
  a3: bins long_latency = {[101:1000]};
  }
endgroup
// Somewhere in code
cg cg_inst = new();

sequence s;
  int lat;
  int id;
  @(posedge clk) disable iff (~rst)
    (req, id = req_id, lat = 0) |-> ##[1:$] ((1'b1, lat++) and (rsp && rsp_id == id, cg_inst.sample(lat)));
endsequence
4

3 に答える 3

2

|->プロパティ内でのみ許可されているシーケンス内で演算子を使用しようとしています。

rspの後に 1 サイクルしか来ない場合req、このコードは機能するはずです。

property trans;
    int lat, id;

    (req, id = req_id, lat = 0) |=> (1, lat++) [*0:$] ##1 rsp && rsp_id == id
      ##0 (1, $display("lat = %0d", lat));
endproperty

後の要素##0はデバッグ用です。本番コードでは省略できます。

ただし、このようにアサーションとカバレッジを混在させるつもりはありません。含意演算子が変数フローの問題を引き起こす可能性がある (つまり、lat適切に更新されない) ことがわかったからです。リクエスト後に一致するレスポンスがあったことをカバーするプロパティが必要です。

property cov_trans;
    int lat, id;

    (req, id = req_id, lat = 0) ##1 (1, lat++) [*0:$] ##1 rsp && rsp_id == id
      ##0 (1, $display("cov_lat = %0d", lat));
endproperty

cover property (cov_trans);

##1リクエストとレスポンスを分離していたことに注意してください。

于 2016-06-26T10:07:55.650 に答える
0

基本的にあなたの考えは正しいですが、条件が真の場合、シーケンスの右側が1回評価されるように見えるため、latは1回だけインクリメントされます。

レイテンシをカウントするには、ループ メカニズムが必要です。

以下はサンプルの動作例です。[1:$]、##1 などは、信号がどれだけ近く生成されているかに基づいて変更できます。

property ps;
  int lat;
  int id;
  @(posedge clk)
     disable iff (~rst)
        (req, id = req_id, lat = 0) |=> (1'b1, lat++)[*1:$] ##1 (rsp && rsp_id == id, cg_inst.sample(lat));
endproperty

assert property (ps);
于 2016-06-26T02:07:33.153 に答える