СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №5/2013
ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ Type , которые декларируются в стро ке 14. В строках 24–26 для каждой пе ременной создаются корзины с по мощью функции GenBin (0, 15), кото рые посредством вызова метода Add Bins добавляются в соответствующую переменную. Параметры 0, 15 функ ции GenBin задают интервал собирае мых значений. Всего создаётся 16 кор зин – для каждого значения числа (от 0 до 15). По умолчанию, значение поля AtLeast принимается равным 1. Это означает, что в результате моделиро вания хотя бы одно значение должно попасть в каждую корзину, чтобы точ ка покрытия считалась проверенной (покрытой). Для создания перекрёст ных корзин в строке 26 используется метод AddCross . Следует отметить, что методы AddBins , AddCross и функция GenBin являются перегруженными и позволяют создавать корзины с раз личными значениями параметров кор зин ( BinVal , AtLeast , Weight , Action ). В строках 34–36 листинга 2 для сбо ра значений чисел используется пере груженный метод ICover , который уве личивает текущее число попаданий Count значения числа в соответствую щей корзине. Если, например, при мо делировании число a = 5 повторится 17 раз, то число попаданий в корзину, собирающей числа 5, будет равно Count = 17. Заметим, что в листинге 1 элементы массива целых чисел CovA эквивалентны полю Count в записи CovBinBaseType . В строках 39–41 с помощью метода IsCovered определяются флаги CovA Covered , CovBCovered , CovCrossABCo vered , которые, как и в предыдущем примере, обозначают, покрыты или нет соответствующие точки покрытия. Метод IsCovered возвращает значение true , если достигнуто требуемое по крытие всех корзин. Все корзины считаются покрытыми, если для каж дой из них число попавших в нее чи сел ( Count ) не менее значения цели ( AtLeast ). По умолчанию, для корзин целью является 1, т.е. считается, что корзина заполнена, если в неё попало хотя бы одно число. В строке 43 с помощью метода Write Bin выводятся на консоль отчёты о за полнениикорзин соответствующих то чек покрытия. Метод WriteBin является перегруженным и может выводить от чёт вфайл, чтоможноиспользовать для статистическойобработкиданных. Так же естьметоды WriteCovDb и ReadCovDb , позволяющие сохранять в файл и чи тать из файла базу данных точки по крытия. Это даёт возможность собирать суммарное покрытие по разным сеан саммоделирования. Фрагмент отчёта о заполнении точки покрытия CovA для программылистинга 2, выдаваемыйме тодом WriteBin , приведён ниже: WriteBin: # %% Bin:(0) Count = 96 # %% Bin:(1) Count = 110 . . . пропущены строки # %% Bin:(14) Count = 95 # %% Bin:(15) Count = 92 В пакете RandomPkg для псевдослу чайного генератора используется стан дартная функция ieee.math_real.uni form и в листингах 1 и 2 используются одни и те же начальные значения гене раторов, поэтому результаты модели рования обеих программ одинаковы, т.е. покрытие точек CovA , CovB и Cov CrossAB достигается за 103, 68 и 1615 циклов генерации чисел соответствен но. Недостатком программ в листин гах 1 и 2 является избыточность цик лов генерации чисел, т.е. для покрытия 256 корзин достаточно 256 циклов 69 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 5 2013 Листинг 2. Использование пакетов RandomPkg , CoveragePkg 1 library ieee; use ieee.std_logic_1164.all; 2 use ieee.numeric_std.all; 3 use work.RandomPkg.all; use work.CoveragePkg.all; 4 entity testbench is 5 end; 6 architecture tb2 of testbench is 7 component mult 8 port (a, b : in std_logic_vector (4 downto 1); 9 d : out std_logic_vector (8 downto 1)); 10 end component; 11 signal a, b : std_logic_vector (4 downto 1); 12 signal d : std_logic_vector (8 downto 1); 13 shared variable RndA, RndB : RandomPType; 14 shared variable CovA, CovB, CovCrossAB : CovPType; 15 begin 16 DUV : mult port map (a => a, b => b, d => d); 17 RandomGenProc1 : process 18 variable i, a_i, b_i : natural := 0; 19 variable CovACovered : boolean := false; 20 variable CovBCovered : boolean := false; 21 variable CovCrossABCovered : boolean := false; 22 begin 23 создание корзин для a, b, (a, b) 24 CovA.AddBins(GenBin(0, 15)); 25 CovB.AddBins(GenBin(0, 15)); 26 CovCrossAB.AddCross(GenBin(0, 15), GenBin(0, 15)); 27 инициализация начальных значений генераторов 28 RndA.InitSeed(IV => (7, 1)); 29 RndB.InitSeed(IV => (4, 2)); 30 MainCovLoop : while not CovCrossABCovered loop 31 a <= RndA.RandSlv(0, 15, 4); 32 b <= RndB.RandSlv(0, 15, 4); 33 wait for 10 ns; 34 a_i := to_integer(unsigned(a)); CovA.ICover(a_i); 35 b_i := to_integer(unsigned(b)); CovB.ICover(b_i); 36 CovCrossAB.ICover((a_i, b_i)); 37 i := i+1; 38 if i = 1000000 then exit; end if; 39 CovACovered := CovA.IsCovered; 40 CovBCovered := CovB.IsCovered; 41 CovCrossABCovered := CovCrossAB.IsCovered; 42 end loop; 43 CovA.WriteBin; CovB.WriteBin; CovCrossAB.WriteBin; 44 wait for 10 ns; wait; 45 end process; 46 end architecture tb2;
RkJQdWJsaXNoZXIy MTQ4NjUy