СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №5/2013

ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ включая граничные значения 0.0 и 1.0). Далее будем говорить о числах a , b . Для генерациичисла a процедуре uni form требуется задать начальные значе ния, например SeedA1 , SeedA2 ; результа томвыполненияпроцедурыбудет псев дослучайное число RndValA и новые значения SeedA1 , SeedA2 . В строке 31 пе ременная RndValA умножается на 16.0, и спомощьюфункции ieee.math_real.trunc производится округление результата вниз доближайшегоцелого (отбрасыва ние дробнойчасти). Затемвыполняется преобразование вещественного числа в целое число RndA , чтобыв итоге полу чить целые числа из диапазона [0, 15]. В строке 32 значение RndA с помощью функции to_unsigned пакета numeric_std преобразуется в вектор с требуемым числом разрядов (4), который назна чается сигналу a , подаваемому на вход тестируемого компонента mult . Аналогичным образом, в строках 33–35 всё повторяется для получения второго псевдослучайного числа b . Та кие пары псевдослучайных чисел a , b генерируются в цикле while до тех пор, пока не будут получены все пары a , b . Поскольку неизвестно заранее, сколь ко циклов генерации псевдослучай ных чисел потребуется для перебора всех возможных пар, в строке 43 зада но большое число (1 000 000) итера ций цикла по переменной i , что бы цикл MainCovLoop не стал беско нечным. При выполнении условия i = 1 000 000 происходит выход из цик ла MainCovLoop по команде exit . Поясним операторы, предназначен ные для проверки того, что все возмож ные пары a , b сгенерированыиподают ся на вход mult . Для этого необходимо собирать статистику поданных зна чений чисел a , b . В строке 13 деклари руются переменные CovA и CovB , пред ставляющие собой массивы из 16 ну левых элементов. Каждый элемент массивов представляет собой корзину для одного определённого значения числа а или b соответственно. Значе ние элемента массива CovA будет соот ветствовать числу выпадений значения числа a , равного номеру элемента. На пример, число выпадений значения a = 5 будет храниться в элементе 5 мас сива CovA , и если значение 5 выпадет 12 раз, то CovA(5) = 12. Переменные CovA , CovB имеют тип integer_vector , ко торый введён стандартом VHDL 2008. Перекрёстное покрытие . В строке 14 декларируется переменная Cov CrossAB , предназначенная для хране 67 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 5 2013 Листинг 1. Тестирующая программа, использующая традиционные средства VHDL 1 library ieee; use ieee.std_logic_1164.all; 2 use ieee.math_real.all; use ieee.numeric_std.all; 3 entity testbench is 4 end; 5 architecture tb1 of testbench is 6 component mult 7 port (a, b : in std_logic_vector (4 downto 1); 8 d : out std_logic_vector (8 downto 1)); 9 end component; 10 signal a, b : std_logic_vector (4 downto 1); 11 signal d : std_logic_vector (8 downto 1); 12 создание массивов (корзин) для a, b и пар (a,b) 13 shared variable CovA, CovB : integer_vector (0 to 15) := (others => 0); 14 shared variable CovCrossAB : integer_vector (0 to 255) := (others => 0); 15 begin 16 DUV : mult port map (a => a, b => b, d => d); 17 RandomGenProc1 : process 18 variable RndValA, RndValB : real; 19 variable RndA, RndB : integer; 20 Начальные значения генератора 21 variable SeedA1 : positive := 7; 22 variable SeedA2 : positive := 1; 23 variable SeedB1 : positive := 4; 24 variable SeedB2 : positive := 2; 25 variable i, a_i, b_i : natural := 0; 26 variable CovACovered, CovBCovered : boolean := false; 27 variable CovCrossABCovered : boolean := false; 28 begin 29 MainCovLoop : while not CovCrossABCovered loop 30 uniform(SeedA1, SeedA2, RndValA); генерация a 31 RndA := integer(trunc(RndValA*16.0)); 32 a <= std_logic_vector(to_unsigned(RndA, 4)); 33 uniform(SeedB1, SeedB2, RndValB); генерация b 34 RndB := integer(trunc(RndValB*16.0)); 35 b <= std_logic_vector(to_unsigned(RndB, 4)); 36 wait for 10 ns; 37 a_i := to_integer(unsigned(a)); 38 b_i := to_integer(unsigned(b)); 39 CovA(a_i) := CovA(a_i) + 1 ; 40 CovB(b_i) := CovB(b_i) + 1 ; 41 CovCrossAB(b_i*16+a_i) := CovCrossAB(b_i*16+a_i) + 1; 42 i := i+1; 43 if i = 1000000 then exit; end if; 44 CovACovered := true; 45 for j in 0 to 15 loop проверка покрытия a 46 if CovA(j)=0 then CovACovered := false; end if; 47 end loop; 48 CovBCovered := true; 49 for j in 0 to 15 loop проверка покрытия b 50 if CovB(j)=0 then CovBCovered := false; end if; 51 end loop; 52 CovCrossABCovered := true; 53 for j in 0 to 255 loop проверка покрытия пар a,b 54 if CovCrossAB(j)=0 then CovCrossABCovered := false; 55 end if; 56 end loop; 57 end loop; 58 wait for 10 ns; wait; 59 end process; 60 end architecture tb1;

RkJQdWJsaXNoZXIy MTQ4NjUy