Jump to content

    
Sign in to follow this  
Kopart

SV: exclude some enum states from coverage (coverpoint/ignore_bins)

Recommended Posts

Есть в модуле enum input в зависимости от состояния которого формируются другие внутренние сигналы.

В текущем тесте используются не все состояния этого enum.

Поэтому в отчете по покрытию есть непокрытые code lines с неиспользуемыми состояниями этого enum.

Попробовал через covergroup-->coverpoint-->ignore_bins переопределить несуществующие состояния enum для исключения их из общего отчета по покрытию.

 

В VCS вижу, что эти состояния исключаются для созданной covergroup (отчет group), но в общем отчете по покрытию все также code lines в этом модуле считаются непокрытыми и неисключенными.

 

У кого-то получалось красиво исключать из покрытия неиспользуемые состояния?

Share this post


Link to post
Share on other sites

Пробовали поиграться с "covergroup instance specific options" - weight, per_instance?

 

Вот тут есть интересная фраза на 31 стр.:

"Illegal bins can be used to remove unused or illegal values from the overall

coverage calculation."

 

Походу Вам достаточно заменить ignore_bins на illegal_bins, чтобы убрать ненужные состояния этого enum'а из общего отчета по покрытию.

Share this post


Link to post
Share on other sites
Походу Вам достаточно заменить ignore_bins на illegal_bins, чтобы убрать ненужные состояния этого enum'а из общего отчета по покрытию.

Проверял. Всё также.

covergroup cg (ref  type_enum  test);
  option.per_instance = 0;
  cvp: coverpoint test {
    illegal_bins ignore0 = {A};
    illegal_bins ignore1 = {B};
  }
endgroup
cg cg_inst = new(enum_input);

always @(posedge clk) begin
    cg_inst.sample();
end

 

в общем отчете по Branches все без изменений

178            unique case (enum_input)
                      -1-  
179                A:   reg = 0;
                   ==>
180                B:   reg = 1;
                   ==>
181                C:   reg = 2;
                   ==>
182         default:   reg = 3;
                  ==>

Branches: 
-1-    Status    Tests
A    Not Covered    
B    Not Covered    
С    Covered    T1
default    Covered    T1

 

хотя во вкладке groups

Excluded/Illegal bins 
NAME       COUNT           
auto_A    0    Illegal
auto_B    0    Illegal
ignore1    0    Illegal
ignore0    0    Illegal

Share this post


Link to post
Share on other sites
Остается только вариант с

option.weight и type_option.weight.

Проверил и всё также без изменений.

Покрытие по бранчам показывает, что эти case не покрыты.

Также проверил нет ли влияния условия семплирования - заменив always_comb на always_ff

 

Share this post


Link to post
Share on other sites
В VCS вижу, что эти состояния исключаются для созданной covergroup (отчет group), но в общем отчете по покрытию все также code lines в этом модуле считаются непокрытыми и неисключенными.

 

У кого-то получалось красиво исключать из покрытия неиспользуемые состояния?

ЕМНИП, я убирал такое постпроцессингом, объявляя линии кода, которые нужно исключить из анализа

 

Share this post


Link to post
Share on other sites
ЕМНИП, я убирал такое постпроцессингом, объявляя линии кода, которые нужно исключить из анализа

Вот как раз хотелось избежать этого неуниверсального exlude, хоть и с контрольной суммой по исходнику.

Пришлось городить ifdef для некоторых состояний типа enum.

 

Еще интересный момент - при указании параметра исключается из coverage константные присвоения.

Только это это не работает для десятичного числа с SV приведением разрядности (PARAM'(1)).

Share this post


Link to post
Share on other sites

Решил еще раз проверить на простом примере без UVM и с одним DUT - covergroup_exlude.zip

Результат всё тот же. :smile3046:

В отчете по covergroups показывает, что и заданный и автосгенеренный bin должны быть исключены, но общем отчете по branches/toggles это не учитывается.

 

Причем это и в VCS и Questasim так происходит :maniac: .

 

Кто-то можете перепроверить на VCS?

Share this post


Link to post
Share on other sites
...

 

Кто-то можете перепроверить на VCS?

При таком описании coverpoint конструкция illegal_bins действительно не срабатывает.

У меня такая версия - для точек покрытия (coverpoint) создаются списки ожидаемых значений (EXPECTED). Если явно не задать диапазон значений, то в этот список попадут все возможные значения без учета illegal_bins/ignore_bins.

 

Добавил в Ваш пример:

//dut.sv
...
covergroup cg ();
  option.per_instance = 0;
  cvp: coverpoint sel {
      bins sel_bin[] = {[A:C]};
        illegal_bins exlude_C = {C};
  }
endgroup
...

 

При таком описании значение C не попадает в список EXPECTED - получаем покрытие 100%.

 

P.S. В примере не хватает скрипта для запуска симуляции. Вот вариант tcl для VCS:

vcs_run.tcl:

#!/usr/bin/tclsh

set VLOG_SIM_OPT        {-sverilog -timescale=1ns/1ns}
set VLOG_CMD            "exec vlogan ${VLOG_SIM_OPT}"
eval ${VLOG_CMD}         dut.sv
eval ${VLOG_CMD}         tb.sv
eval                     "exec vcs -lca -cm line+cond+fsm+tgl+path+assert -debug_all tb -R -l vcs.log"
#eval                     "dve -cov -covdir simv.vdb"
eval                    "urg -lca -dir simv.db"

Share this post


Link to post
Share on other sites
При таком описании coverpoint конструкция illegal_bins действительно не срабатывает.

У меня такая версия - для точек покрытия (coverpoint) создаются списки ожидаемых значений (EXPECTED). Если явно не задать диапазон значений, то в этот список попадут все возможные значения без учета illegal_bins/ignore_bins.

А у вас это исправило проблему?

 

Проверил с вашими параметрами запуска. (Version K-2015.09-SP2-1).

У меня ничего не исправилось :smile3046:

 

Все также ветка С не исключена

post-2972-1475488403_thumb.png

 

Хотя должна быть.

post-2972-1475488406_thumb.png

Share this post


Link to post
Share on other sites

Существуют разные метрики покрытия (ссылка).

Ваш пример я дополнил, чтобы сделать покрытие комбинационной логики (Combinational Logic Coverage) - 100%.

Если речь идет о покрытии строк кода (Line Coverage) (1-й скриншот), то тут нет никаких illegal_bins/ignore_bins - есть только строки кода. Этот отчет показывает, какие строки исполнялись в процессе моделирования, а какие - нет.

Пусть состояние C и неправильное, но оно описано у Вас в коде, а значит должно быть проверено. Или:

...
    case (sel)
      A:        out <= 4'h0;
      B:        out <= 4'h1;
//      C:        out <= 4'h2;
      default:  out <= 4'hF;
    endcase
...

Share this post


Link to post
Share on other sites
Если речь идет о покрытии строк кода (Line Coverage) (1-й скриншот), то тут нет никаких illegal_bins/ignore_bins - есть только строки кода. Этот отчет показывает, какие строки исполнялись в процессе моделирования, а какие - нет.

Пусть состояние C и неправильное, но оно описано у Вас в коде, а значит должно быть проверено. Или:

Не совсем правильно привел screenshot из отчета по Line Coverage.

Тем самым хотел отобразить, что в код добавлена логика и ничего не поменялось.

 

Меня в частности интересует отчет по Branch Coverage для которого illegal bin должен применяться.

post-2972-1475497807_thumb.png

Но как видно он не учитывается и подобно должно исключаться для отчета Toggle Coverage для сигнала sel

 

Share this post


Link to post
Share on other sites
...

Но как видно он не учитывается и подобно должно исключаться для отчета Toggle Coverage для сигнала sel

Для корректировки отчетов Toggle и Branch у Synopsys отдельный инструмент.

 

1) Запускаем в графическом режиме DVE для просмотра отчетов:

$ dve -cov -covdir simv.vdb

2) Там находим ненужную ветку и отключаем:

 

sshot_2.png

 

3) Дальше выгружаем все исключения в файл *.el:

testtt.el:

CHECKSUM: "4091565883 3988933883"
MODULE: dut
Branch 0 "2970113050" "(~rst_n)" (3) "(~rst_n) 0,C "

 

4) Генерим отчет с учетом исключений:

$ urg -lca -dir ./simv.vdb -elfile testtt.el

 

и получаем:

 

sshot_1.png

 

 

Share this post


Link to post
Share on other sites
Для корректировки отчетов Toggle и Branch у Synopsys отдельный инструмент.

Так вот с этого всё и началось. :smile3009:

Думал, что через illegal_bins/ignore_bins можно избежать задания exlude правил. :cranky:

Что задать во сразу всех блоках где используется enum, а не добавляя "портянку" правил для каждого модуля :crying:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this