пропонується аналіз тестопригодності програмного коду дискретного косинусного перетворення з Xilinx бібліотеки. Було виконано побудову транзакційної моделі, підрахунок характеристик тестопригодності (), визначення критичних точок. Потім у Відповідно до числом і типами компонентів було розроблено функціональне покриття, фрагмент якого представлений лістингом 2.
Лістинг 2.
c0: coverpoint xin
{
bins minus_big = {[128:235]};
bins minus_sm = {[236:255]};
bins plus_big = {[21:127]};
bins plus_sm = {[1:20]};
bins zero = {0};
}
c1: coverpoint dct_2d
{
bins minus_big = {[128:235]};
bins minus_sm = {[236:255]};
bins plus_big = {[21:127]};
bins plus_sm = {[1:20]};
bins zero = {0};
bins zero2 = (0 => 0);
}
endgroup
Для критичних точок, визначених в результаті аналізу тестопригодності транзакційного графа розроблена ассерціонная модель перевірки основних характеристик дискретного косинусного перетворення. Істотний фрагмент коду механізму ассерція представлений лістингом 3.
Лістинг 3.
sequence first (reg [7:0] a, reg [7:0] b);
reg [7:0] d;
(! RST, d = a)
# # 7 (b == d);
endsequence
property f (a, b);
@ (posedge CLK)
// disable iff (RST | | $ isunknown (a)) first (a, b);
! RST | => first (a, b);
endproperty
odin: assert property (f (xin, xa7_in))
// $ display ("Very good");
else $ error ("The end, xin =% B, xa7_in =% b ", $ past (xin, 7), xa7_in);
У результаті проведеної верифікації дискретного косинусного перетворення в середовищі Questa, Mentor Graphics були знайдені неточності у восьми рядках вихідного коду HDL-моделі:
// add_sub1a <= xa7_reg + xa0_reg ;//
Подальше виправлення помилок призвело до появи виправленого фрагмента коду, який показаний в лістингу 4.
Лістинг 4.
add_sub1a <= ({xa7_reg [8], xa7_reg} + {Xa0_reg [8], xa0_reg});
add_sub2a <= ({xa6_reg [8], xa6_reg} + {Xa1_reg [8], xa1_reg});
add_sub3a <= ({xa5_reg [8], xa5_reg} + {Xa2_reg [8], xa2_reg});
add_sub4a <= ({xa4_reg [8], xa4_reg} + {Xa3_reg [8], xa3_reg});
end
else if (toggleA == 1'b0)
begin
add_sub1a <= ({xa7_reg [8], xa7_reg} - {Xa0_reg [8], xa0_reg});
add_sub2a <= ({xa6_reg [8], xa6_reg} - {Xa1_reg [8], xa1_reg});
add_sub3a <= ({xa5_reg [8], xa5_reg} - {Xa2_reg [8], xa2_reg});
add_sub4a <= ({xa4_reg [8], xa4_reg} - {Xa3_reg [8], xa3_reg});