Advertisement
petrdynin

Untitled

Jan 21st, 2024
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module testbench;
  2.  
  3.     // Тактовый сигнал и сигнал сброса
  4.     logic clk;
  5.     logic aresetn;
  6.  
  7.     // Остальные сигналы
  8.     logic [7:0] a;
  9.     logic [7:0] b;
  10.     logic [7:0] c;
  11.  
  12.     sum DUT(
  13.         .clk     ( clk     ),
  14.         .aresetn ( aresetn ),
  15.         .a       ( a       ),
  16.         .b       ( b       ),
  17.         .c       ( c       )
  18.     );
  19.  
  20.     `include "generator.svh"
  21.  
  22.     // TODO:
  23.     // В ходе тестирования на порты 'a' и 'b'
  24.     // подаются некоторые значения. Проанализируйте
  25.     // модель покрытия и результаты сбора покрытия
  26.     // (используйте GUI).
  27.     // Добавьте генерацию недостающих входных значений
  28.     // и добейтесь покрытия в 100%.
  29.  
  30.     initial begin
  31.         @done;
  32.         // TODO:
  33.         // Добавьте недостающие входные воздействия здесь.
  34.         // ...
  35.  
  36.        
  37.         //@(posedge clk);
  38.         a <= 1;
  39.         b <= 1;  
  40.        
  41.          @(posedge clk);
  42.         a <= 9;
  43.         b <= 1;  
  44.  
  45.         @(posedge clk);
  46.         a <= 0;
  47.         b <= 1;
  48.  
  49.         @(posedge clk);
  50.         a <= 9;
  51.         b <= 0;
  52.  
  53.         @(posedge clk);
  54.         a <= 0;
  55.         b <= 0;
  56.  
  57.          @(posedge clk);
  58.         a <= 9;
  59.         b <= 255;
  60.  
  61.         @(posedge clk);
  62.         a <= 180;
  63.         b <= 255;
  64.  
  65.         @(posedge clk);
  66.         a <= 255;
  67.         b <= 255;
  68.  
  69.  
  70.  
  71.     for(int i = 0; i<36; i++) begin
  72.             @(posedge clk);
  73.             begin
  74.                 a <= 100+2*i;
  75.                 b <= 173+2*i;
  76.             end
  77.         end  
  78.  
  79.     for(int i = 0; i<14; i++) begin
  80.             @(posedge clk);
  81.             begin
  82.                 a <= 2 + i;
  83.                 b <= 50 + i;
  84.             end
  85.         end
  86.    
  87.  
  88.     for(int i = 0; i < 5; i++) begin
  89.             @(posedge clk);
  90.             begin
  91.                 a <= 16 + i;
  92.                 b <= 245 + 2*i;
  93.             end
  94.         end
  95.  
  96.      for(int i = 21; i < 50; i++) begin
  97.             @(posedge clk);
  98.                 a <= i;
  99.         end
  100.  
  101.  
  102.     for(int i = 64; i<172; i++) begin
  103.             @(posedge clk);
  104.             begin
  105.                 a <= 255;
  106.                 b <= i;
  107.             end
  108.         end
  109.  
  110.         for(int i = 172; i<256; i++) begin
  111.             @(posedge clk);
  112.             begin
  113.                 a <= i;
  114.                 b <= 0;
  115.             end
  116.         end
  117.  
  118.  
  119.        
  120.  
  121.         @(posedge clk);
  122.         ->> user_done;
  123.     end
  124.  
  125.     // TODO:
  126.     // Анализируйте эту модель.
  127.     // Особое внимание уделите перекрестному покрытию.
  128.     covergroup sum_cg @(posedge clk);
  129.  
  130.         // Обычные coverpoint.
  131.  
  132.         // Интервалы для a (массивы).
  133.         a_i_cp: coverpoint a {
  134.             bins low  [] = {[0:63]};
  135.             bins mid  [] = {[64:171]};
  136.             bins high [] = {[172:255]};
  137.         }
  138.  
  139.         // Интервалы для а (единичное попадание дает 100%).
  140.         a_in_cp: coverpoint a {
  141.             bins low  = {[0:63]};
  142.             bins mid  = {[64:171]};
  143.             bins high = {[172:255]};
  144.         }
  145.  
  146.         // Интервалы для b.
  147.         b_i_cp: coverpoint b {
  148.             bins low  [] = {[0:63]};
  149.             bins mid  [] = {[64:171]};
  150.             bins high [] = {[172:255]};
  151.         }
  152.  
  153.         // Специалльные значения для a.
  154.         a_s_cp: coverpoint a {
  155.             bins one       = {1};
  156.             bins magics [] = {1, 9, 180};
  157.             bins zero      = {0};
  158.             bins max       = {255};
  159.         }
  160.  
  161.         // Специальные значения для b.
  162.         b_s_cp: coverpoint b {
  163.             bins one  = {1};
  164.             bins zero = {0};
  165.             bins max  = {255};
  166.         }
  167.  
  168.         // Перекрестное покрытие.
  169.  
  170.         // Этот cross создает пересечение всех bins из a_s_cp и a_s_cp.
  171.         cross_1: cross a_s_cp, b_i_cp {
  172.             // Этот фильтр исключает (ignore) все пересечения, в которых есть b - low и b - high.
  173.             ignore_bins a_l_h = binsof(b_i_cp.low) || binsof(b_i_cp.high);
  174.             // А что исключает этот?
  175.             ignore_bins a_m_b_m = binsof(a_s_cp.one);
  176.             // А этот?
  177.             ignore_bins a_mag_b_m = binsof(a_s_cp.magics) && binsof(b_i_cp.mid);
  178.         }
  179.  
  180.         // Этот cross создает пересечение всех bins из a_i_cp и b_s_cp.
  181.         cross_2: cross a_i_cp, b_s_cp {
  182.             // Этот фильтр исключает все пересечения, в которых есть a - low и a - mid.
  183.             ignore_bins a_low_high = binsof(a_i_cp.low) || binsof(a_i_cp.mid);
  184.             // А что исключает этот?
  185.             ignore_bins a_mid_b_low = binsof(a_i_cp.high) && binsof(b_s_cp.max);
  186.         }
  187.  
  188.         // Этот cross создает пересечение всех bins из a_i_cp и b_s_cp.
  189.         cross_3: cross a_s_cp, b_s_cp {
  190.             // Такой фильтр означает, что в пересечении участвуют только bins, которые привязаны к 1.
  191.             bins ones     = binsof(a_s_cp.one) && binsof(b_s_cp.one);
  192.             // А такой фильтр выбирает два варианта: a - 0 и b - max, a - max и b - 0
  193.             // Для удобства восприятия разбит на 2 строки
  194.             bins zero_max = binsof(a_s_cp.zero) && binsof(b_s_cp.max ) ||
  195.                             binsof(a_s_cp.max ) && binsof(b_s_cp.zero);
  196.             // А что выбирает такой фильтр?
  197.             bins two_max  = binsof(a_s_cp.max ) && binsof(b_s_cp.max);
  198.             // А что исключает этот?
  199.             ignore_bins max_one = binsof(a_s_cp.max ) && binsof(b_s_cp.one);
  200.         }
  201.  
  202.         // Да, тройное перекрестное покрытие тоже возможно.
  203.         // Этот cross создает пересечение всех bins из a_in_cp, a_s_cp и b_s_cp.
  204.         // Попробуйте разобраться (GUI в помощь).
  205.         cross_4: cross a_in_cp, a_s_cp, b_s_cp{
  206.             ignore_bins a_magics_zero = binsof(a_s_cp.magics) || binsof(a_s_cp.zero);
  207.             ignore_bins a_low         = binsof(a_in_cp.mid);
  208.             ignore_bins b_one_zero    = binsof(b_s_cp.one);
  209.             ignore_bins a_high_one    = binsof(a_in_cp.high) && binsof(a_s_cp.one);
  210.             ignore_bins a_low_max     = binsof(a_in_cp.low) && binsof(a_s_cp.max);
  211.         }
  212.     endgroup
  213.  
  214.     sum_cg cg = new();
  215.  
  216. endmodule
  217.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement