Advertisement
petrdynin

Lesson_6_task_03_row_testbench

Jan 19th, 2024 (edited)
84
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.         for(int i = 64; i<172; i++) begin
  37.             @(posedge clk);
  38.             begin
  39.                 a <= 255;
  40.                 b <= i;
  41.             end
  42.         end
  43.  
  44.         for(int i = 172; i<256; i++) begin
  45.             @(posedge clk);
  46.             begin
  47.                 a <= i;
  48.                 b <= 0;
  49.             end
  50.         end
  51.  
  52.         for(int i = 0; i<41; i++) begin
  53.             @(posedge clk);
  54.             begin
  55.                 a <= 100+2*i;
  56.                 b <= 173+2*i;
  57.             end
  58.         end
  59.  
  60.         for(int i = 0; i<48; i++) begin
  61.             @(posedge clk);
  62.             begin
  63.                 a <= 2 + i;
  64.                 b <= 50 + i;
  65.             end
  66.         end
  67.  
  68.         @(posedge clk);
  69.         a <= 1;
  70.         b <= 1;  
  71.  
  72.         @(posedge clk);
  73.         a <= 9;
  74.         b <= 1;  
  75.  
  76.        @(posedge clk);
  77.         a <= 1;
  78.         b <= 0;  
  79.  
  80.         @(posedge clk);
  81.         a <= 0;
  82.         b <= 1;
  83.  
  84.         @(posedge clk);
  85.         a <= 9;
  86.         b <= 0;
  87.  
  88.         @(posedge clk);
  89.         a <= 0;
  90.         b <= 0;
  91.  
  92.          @(posedge clk);
  93.         a <= 9;
  94.         b <= 255;
  95.  
  96.         @(posedge clk);
  97.         a <= 180;
  98.         b <= 255;
  99.  
  100.         @(posedge clk);
  101.         a <= 255;
  102.         b <= 255;
  103.        
  104.         @(posedge clk);
  105.         ->> user_done;
  106.     end
  107.  
  108.     // TODO:
  109.     // Анализируйте эту модель.
  110.     // Особое внимание уделите перекрестному покрытию.
  111.     covergroup sum_cg @(posedge clk);
  112.  
  113.         // Обычные coverpoint.
  114.  
  115.         // Интервалы для a (массивы).
  116.         a_i_cp: coverpoint a {
  117.             bins low  [] = {[0:63]};
  118.             bins mid  [] = {[64:171]};
  119.             bins high [] = {[172:255]};
  120.         }
  121.  
  122.         // Интервалы для а (единичное попадание дает 100%).
  123.         a_in_cp: coverpoint a {
  124.             bins low  = {[0:63]};
  125.             bins mid  = {[64:171]};
  126.             bins high = {[172:255]};
  127.         }
  128.  
  129.         // Интервалы для b.
  130.         b_i_cp: coverpoint b {
  131.             bins low  [] = {[0:63]};
  132.             bins mid  [] = {[64:171]};
  133.             bins high [] = {[172:255]};
  134.         }
  135.  
  136.         // Специалльные значения для a.
  137.         a_s_cp: coverpoint a {
  138.             bins one       = {1};
  139.             bins magics [] = {1, 9, 180};
  140.             bins zero      = {0};
  141.             bins max       = {255};
  142.         }
  143.  
  144.         // Специальные значения для b.
  145.         b_s_cp: coverpoint b {
  146.             bins one  = {1};
  147.             bins zero = {0};
  148.             bins max  = {255};
  149.         }
  150.  
  151.         // Перекрестное покрытие.
  152.  
  153.         // Этот cross создает пересечение всех bins из a_s_cp и a_s_cp.
  154.         cross_1: cross a_s_cp, b_i_cp {
  155.             // Этот фильтр исключает (ignore) все пересечения, в которых есть b - low и b - high.
  156.             ignore_bins a_l_h = binsof(b_i_cp.low) || binsof(b_i_cp.high);
  157.             // А что исключает этот?
  158.             ignore_bins a_m_b_m = binsof(a_s_cp.one);
  159.             // А этот?
  160.             ignore_bins a_mag_b_m = binsof(a_s_cp.magics) && binsof(b_i_cp.mid);
  161.         }
  162.  
  163.         // Этот cross создает пересечение всех bins из a_i_cp и b_s_cp.
  164.         cross_2: cross a_i_cp, b_s_cp {
  165.             // Этот фильтр исключает все пересечения, в которых есть a - low и a - mid.
  166.             ignore_bins a_low_high = binsof(a_i_cp.low) || binsof(a_i_cp.mid);
  167.             // А что исключает этот?
  168.             ignore_bins a_mid_b_low = binsof(a_i_cp.high) && binsof(b_s_cp.max);
  169.         }
  170.  
  171.         // Этот cross создает пересечение всех bins из a_i_cp и b_s_cp.
  172.         cross_3: cross a_s_cp, b_s_cp {
  173.             // Такой фильтр означает, что в пересечении участвуют только bins, которые привязаны к 1.
  174.             bins ones     = binsof(a_s_cp.one) && binsof(b_s_cp.one);
  175.             // А такой фильтр выбирает два варианта: a - 0 и b - max, a - max и b - 0
  176.             // Для удобства восприятия разбит на 2 строки
  177.             bins zero_max = binsof(a_s_cp.zero) && binsof(b_s_cp.max ) ||
  178.                             binsof(a_s_cp.max ) && binsof(b_s_cp.zero);
  179.             // А что выбирает такой фильтр?
  180.             bins two_max  = binsof(a_s_cp.max ) && binsof(b_s_cp.max);
  181.             // А что исключает этот?
  182.             ignore_bins max_one = binsof(a_s_cp.max ) && binsof(b_s_cp.one);
  183.         }
  184.  
  185.         // Да, тройное перекрестное покрытие тоже возможно.
  186.         // Этот cross создает пересечение всех bins из a_in_cp, a_s_cp и b_s_cp.
  187.         // Попробуйте разобраться (GUI в помощь).
  188.         cross_4: cross a_in_cp, a_s_cp, b_s_cp{
  189.             ignore_bins a_magics_zero = binsof(a_s_cp.magics) || binsof(a_s_cp.zero);
  190.             ignore_bins a_low         = binsof(a_in_cp.mid);
  191.             ignore_bins b_one_zero    = binsof(b_s_cp.one);
  192.             ignore_bins a_high_one    = binsof(a_in_cp.high) && binsof(a_s_cp.one);
  193.             ignore_bins a_low_max     = binsof(a_in_cp.low) && binsof(a_s_cp.max);
  194.         }
  195.     endgroup
  196.  
  197.     sum_cg cg = new();
  198.  
  199. endmodule
  200.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement