2020年9月5日土曜日

verilog : Vivado で SVA(アサーション) を試す 2

目的:

Vivado で SVA を使用した時の 波形表示 や 発火回数 表示 ができるようにする。

概要:

一案として、アサーション記述に Pass/Fail 時の処理を記述し、波形表示を行った。
また、シミュレーション終了時に 発火回数 と FAIL 回数の表示を行った。
Vivado で SVA(アサーション) を試す」のサンプルを修正して確認を行った。

波形表示:

少し面倒ではあるが、アサーション記述に以下の様な処理を記述することで波形に表示できることを確認した。(「Vivado で SVA(アサーション) を試す」の sva_1.sv を修正)
// -----------------------------------------------------
//   Sample module
//
//   Module Name : sva_1
//   Version     : 0.00
// -----------------------------------------------------

module sva_1 ( clk, clr, start, en, outpls) ;
  input clk ;
  input clr ;
  input start ;
  input en ;
  input outpls ;

  // internal signal declaration ---------
  logic [15:0] a_test1_fire ;
  logic [15:0] a_test1_pass = 0 ;
  logic [15:0] a_test1_fail = 0 ;

  assign a_test1_fire = a_test1_pass + a_test1_fail ;

  // sequence description ----------------
  sequence S1 ;
    outpls[*4] ##1 !outpls[*5] ;
  endsequence

  // property description ---------------
  property p_test1 ;
    @(posedge clk ) disable iff(clr)
      $rose(start) |-> ##1 S1[*6] ;
  endproperty

  // assertion description
//  a_test1 : assert property ( p_test1 ) $display("a_test1 : OK") ;
  a_test1 : assert property ( p_test1 ) begin
              a_test1_pass = a_test1_pass + 1 ;
              $display("a_test1 : OK") ;
            end
            else begin
              a_test1_fail = a_test1_fail + 1 ;
              $display("a_test1 : FALE") ;
            end
  endmodule
発火回数、PASS回数、FAIL回数 の変数(信号)を定義し、アサーション記述で PASS回数、FAIL回数をカウントし、「OK」,「FAIL」の画面表示を行う。
発火回数は、PASS回数 + FAIL 回数 とする。
シミュレーション実行後、各回数の変数(信号) が波形で表示でき、値の変化点が PASS, FAIL の ポイント となる。
sva_2.sv も同様に修正する。

終了時の発火等回数の表示:

テストパターンの終了時、各アサーションの発火等の回数を $display で表示する。
// +-------------------------------------------------------------------------+
// | test pattern                                                            |
// |                                                                         |
// |   test name : test_1                                                    |
// +-------------------------------------------------------------------------+
//

initial begin
  #200
  // H:4clk,L:5clk  x 5cycle -----
  @(posedge clk) #1
      pls_start    = 1'b1  ;
      h_width      = 8'd4  ;
      l_width      = 8'd5  ;
      pls_num      = 8'h5  ;
  @(posedge clk) #1
      pls_start    = 1'b0  ;
  @(negedge i_plsgen.plsen)
  #100
  // H:4clk,L:5clk  x 6cycle -----
  @(posedge clk) #1
      pls_start    = 1'b1  ;
      h_width      = 8'd4  ;
      l_width      = 8'd5  ;
      pls_num      = 8'h6  ;
  @(posedge clk) #1
      pls_start    = 1'b0  ;
  @(negedge i_plsgen.plsen)
  #100
  // H:4clk,L:5clk  x 7cycle -----
  @(posedge clk) #1
      pls_start    = 1'b1  ;
      h_width      = 8'd4  ;
      l_width      = 8'd5  ;
      pls_num      = 8'h7  ;
  @(posedge clk) #1
      pls_start    = 1'b0  ;

  @(negedge i_plsgen.plsen)
  #100

  // test end -------------------
  $display ("") ;
  $display ("---- assertion result ------") ;
  $display ("[SVA] a_test1 : fire = %d , FAIL = %d",
                testbench.i_plsgen.i_sva_1.a_test1_fire,
                testbench.i_plsgen.i_sva_1.a_test1_fail ) ;
  $display ("[SVA] a_test2 : fire = %d , FAIL = %d",
                testbench.i_plsgen.i_sva_2.a_test2_fire,
                testbench.i_plsgen.i_sva_2.a_test2_fail ) ;

  $finish ;
  end
終了時に $display で表示する為、最後までシミュレーションが実行されないと回数表示はされない。

出力結果:

 実行結果の波形を以下に示す。
 発火 (PASS, FAIL) したタイミングが波形で判る。

実行結果の LOG を以下に示す。
****** xsim v2020.1 (64-bit)
  **** SW Build 2902540 on Wed May 27 19:54:35 MDT 2020
  **** IP Build 2902112 on Wed May 27 22:43:36 MDT 2020
    ** Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.

source xsim.dir/test_1/xsim_script.tcl
# xsim {test_1} -autoloadwcfg -runall
Vivado Simulator 2020.1
Time resolution is 1 ps
run -all

Time: 1140 ns Started: 220 ns Scope: /testbench/i_plsgen/i_sva_1 File: /mnt/d/UserData/hobby/logic/study/test3/assertion/sva_1.sv Line:36
a_test1 : FALE

Time: 2340 ns Started: 1260 ns Scope: /testbench/i_plsgen/i_sva_1 File: /mnt/d/UserData/hobby/logic/study/test3/assertion/sva_1.sv Line:36
a_test1 : OK

Time: 2360 ns Started: 1260 ns Scope: /testbench/i_plsgen/i_sva_2 File: /mnt/d/UserData/hobby/logic/study/test3/assertion/sva_2.sv Line:36
a_test2 : OK

Time: 3560 ns Started: 2480 ns Scope: /testbench/i_plsgen/i_sva_1 File: /mnt/d/UserData/hobby/logic/study/test3/assertion/sva_1.sv Line:36
a_test1 : OK

Time: 3580 ns Started: 2480 ns Scope: /testbench/i_plsgen/i_sva_2 File: /mnt/d/UserData/hobby/logic/study/test3/assertion/sva_2.sv Line:36
a_test2 : FALE

---- assertion result ------
[SVA] a_test1 : fire =     3 , FAIL =     1
[SVA] a_test2 : fire =     2 , FAIL =     1
$finish called at time : 3841 ns : File "/mnt/d/UserData/hobby/logic/study/test3/testbench/tp.sv" Line 52
exit
INFO: [Common 17-206] Exiting xsim at Fri Sep  4 01:02:27 2020...
~
~

最後に発火回数 と FAIL 回数 が表示されている。

0 件のコメント:

コメントを投稿