function_coverage не показывает правильный результат

Я разработал простой тестовый стенд uvm для проверки простого сумматора. Я также использовал функциональное покрытие для мониторинга покрытия. Сумматор 8 бит с входами a а также b и вывод c, что составляет 9 бит.

Я разработал транзакцию с 8 битами rand logic за a а также b, По порядку, я запустил это с repeat(100) и это будет случайным образом и диски a а также b в DUT. Наилучший случай для функционального покрытия для этого сценария - (100/256)*100%, т.е. около 40%, при условии, что никакое значение не будет повторяться. Я выбираю покрытие в моем табло и получаю результат покрытия в env.

Вот мои фрагменты кода

// monitor class
  covergroup cg;
    a : coverpoint sb_item.a;
    b : coverpoint sb_item.b;
  endgroup
  ...
  function void write(input input_seq_item i);
    sb_item = i;
    if(sb_item.c == sb_item.a + sb_item.b)
      begin
        `uvm_info("SB","OK!",UVM_LOW)
        cg.sample();
      end
      else
        `uvm_error("SB",$sformatf("ERROR! %b + %b = %b", sb_item.a, sb_item.b, sb_item.c), UVM_LOW)
  endfunction

  // env class
  ...
  task run_phase(uvm_phase phase);
    sb.cg.stop();
    phase.raise_objection(this);
    sb.cg.start();
    seq.start(sqr);
    phase.drop_objection(this);
    sb.cg.stop();
    `uvm_info("env",$sformatf("The coverage collected is %f",sb.cg.a.get_coverage()),UVM_LOW);
  endtask
  ...

Когда я запускаю код, я получаю покрытие около 81. Результаты показаны ниже

# KERNEL: UVM_INFO /home/runner/monitor.sv(56) @ 996: uvm_test_top.env.sb [SB] OK!
# KERNEL: UVM_INFO /home/runner/env.sv(34) @ 996: uvm_test_top.env [env] The coverage collected is 85.937500
# KERNEL: UVM_INFO /home/build/vlib1/vlib/uvm-1.2/src/base/uvm_objection.svh(1271) @ 996: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase
# KERNEL: UVM_INFO /home/build/vlib1/vlib/uvm-1.2/src/base/uvm_report_server.svh(855) @ 996: reporter [UVM/REPORT/SERVER] 
# KERNEL: --- UVM Report Summary ---
# KERNEL: 
# KERNEL: ** Report counts by severity
# KERNEL: UVM_INFO :  204
# KERNEL: UVM_WARNING :    0
# KERNEL: UVM_ERROR :    0
# KERNEL: UVM_FATAL :    0
# KERNEL: ** Report counts by id
# KERNEL: [Driver]   100
# KERNEL: [RNTST]     1
# KERNEL: [SB]   100
# KERNEL: [TEST_DONE]     1
# KERNEL: [UVM/RELNOTES]     1
# KERNEL: [env]     1
# KERNEL: 
# RUNTIME: Info: RUNTIME_0068 uvm_root.svh (521): $finish called.
# KERNEL: Time: 996 ns,  Iteration: 61,  Instance: /top,  Process: @INITIAL#14_0@.
# KERNEL: stopped at time: 996 ns
# VSIM: Simulation has finished. There are no more test vectors to simulate.
exit
# FCOVER: Covergroup Coverage data has been saved to "fcover.acdb" database.
# VSIM: Simulation has finished.

Кто-нибудь может объяснить, какую ошибку я здесь делаю? Является ли охват совокупным по всем прогонам?

1 ответ

Решение

Будет ли охват кумулятивным по всем прогонам, зависит от того, что вы анализируете. Полагаю, вы анализируете только одну симуляцию. Ваши расчеты верны, максимальное покрытие, которое вы можете получить за тест, составляет около 40% (в основном 40% на каждую точку покрытия, усредненное вместе), но это вряд ли будет достигнуто.

Кроме того, на что нужно обратить внимание (кроме процента), это то, что на самом деле создаются бункеры. Я не думаю, что вы получаете корзину для каждого значения a или же b, но что некоторые из них могут быть объединены (т.е. a в [ 0..3 ] будет одна корзина и так далее, оставляя вас с 256/4 корзинами вместо 256). Каждая точка покрытия имеет опцию под названием auto_bin_max, чье значение по умолчанию равно 64. Если вы установите его равным 256 или явно объявите (диапазон) корзину для каждого значения, которое a или же b может принять, вы получите процент покрытия, который вы ожидаете.

Как примечание, вы обычно не создаете корзину для каждого значения элемента данных, так как это не имеет смысла. В типичном устройстве существует так много значений, которые могут принимать элементы данных, что вы не можете проверить их все. Однако, что бы вы ни делали, это объявляли бункеры для более "интересных" ситуаций. В вашем случае интересные ценности 0, 8'hff и все что между Что также особенно интересно, это пересечение a а также b и проверка комбинаций, особенно в случае, когда a а также b оба 8'hff (поскольку именно здесь ваш результат будет переполнен на 8 бит и выведет перенос.

Другие вопросы по тегам