СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №5/2013
(при последовательном переборе), а в приведённых примерах циклов требу ется в 6,3 раза больше. Например, пара a = 10, b = 8 была сгенерирована 14 раз, а пара a = 5, b = 1 – только один раз. В следующем примере будет показано, как решить данную задачу средствами пакета CoveragePkg . И НТЕЛЛЕКТУАЛЬНОЕ ПОКРЫТИЕ В листинге 3 приведена программа тестирования, выполняющая интел лектуальное покрытие ( intelligent co verage ) [2]. Её выполнение показывает, что для перебора всех пар случайных чисел a , b требуется ровно 256 итера ций цикла генерации. Это достигается использованием метода RandCovPoint (строка 29), который возвращает псев дослучайно выбранное значение типа integer_vector (в данном примере мас сив из пары чисел) из псевдослучайно выбранной корзины. При этом для псевдослучайного генератора значе ний используются только те корзины, которые не достигли заданного про цента от цели покрытия AtLeast (по умолчанию, 100%). Покрытие всех зна чений числа a достигается за первые 52 цикла, покрытие всех значений чис ла b – за первые 38 циклов. Отметим, что инициализация на чального значения псевдослучайного генератора в точке покрытия Cov CrossAB выполняется с помощьюмето да InitSeed (строка 23 в листинге 3). Для этого метода аргументом является строка :testbench(tb3): CovCrossAB Эта строка возвращается атрибу том 'instance_name для переменной CovCrossAB, который указывает путь в дереве иерархии проекта к этой пе ременной. Такой способ настрой ки генераторов псевдослучайных чи сел позволяет задавать уникальные начальные значения для каждого ге нератора. Заметим, что пакет RandomPkg и де кларируемый в нём защищённый тип RandomPType в листинге 3 явно не ис пользуются. Но в защищённом типе CovPType пакета CoveragePkg имеется внутренняя переменная RV защищён ного типа RandomPType , и доступ к ней осуществляется вызовом соответству ющих методов. З АКЛЮЧЕНИЕ Приведённые примеры только ил люстрируют возможности методоло гии OS VVM, не исчерпывая всех воз можностей пакетов CoveragePkg и RandomPkg . Не были рассмотрены, например, способы задания требуе мых распределений генерируемых псевдослучайных чисел, что может быть выполнено с помощью пакета RandomPkg , который поддерживает ге нерацию случайных чисел в различ ных форматах, с различными распре делениями и ограничениями. Л ИТЕРАТУРА 1. Авдеев Н.А., Бибило П.Н. Средства VHDL для функциональной верификации цифро вых систем // Современная электрони ка. – 2013. –№ 3. 2. http://osvvm.org/about os vvm. 3. Хаханов В.И., Хаханова И.В., Литвино ва Е.И., Гузь О.А. Проектирование и вери фикация цифровых систем на кристал лах. Verilog & SystemVerilog. – Харьков : ХНУРЭ, 2010. 4. Spear C., Tumbush G. SystemVerilog for Veri fication. A Guide to Learning the Testbench Language Features, Springer, 2012. 5. IEEE Standard VHDL Language Reference Manual, IEEE Std 1076 2008. ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ 70 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 5 2013 Листинг 3. Программа, выполняющая интеллектуальное покрытие 1 library ieee; use ieee.std_logic_1164.all; 2 use ieee.numeric_std.all; use work.CoveragePkg.all; 3 entity testbench is 4 end; 5 architecture tb3 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 shared variable CovA, CovB, CovCrossAB : CovPType; 13 begin 14 DUV : mult port map (a => a, b => b, d => d); 15 RandomGenProc1 : process 16 variable RndA, RndB : integer; 17 variable i, a_i, b_i : natural := 0; 18 variable CovACovered : boolean := false; 19 variable CovBCovered : boolean := false; 20 variable CovCrossABCovered : boolean := false; 21 begin 22 инициализация генератора псевдослучайных чисел 23 CovCrossAB.InitSeed(CovCrossAB'instance_name); 24 создание корзин для a, b, (a, b) 25 CovA.AddBins(GenBin(0, 15)); 26 CovB.AddBins(GenBin(0, 15)); 27 CovCrossAB.AddCross(GenBin(0, 15), GenBin(0, 15)); 28 MainCovLoop : while not CovCrossABCovered loop 29 (RndA, RndB) := CovCrossAB.RandCovPoint; 30 a <= std_logic_vector(to_unsigned(RndA, 4)); 31 b <= std_logic_vector(to_unsigned(RndB, 4)); 32 wait for 10 ns; 33 a_i := to_integer(unsigned(a)); CovA.ICover(a_i); 34 b_i := to_integer(unsigned(b)); CovB.ICover(b_i); 35 CovCrossAB.ICover((a_i, b_i)); 36 i := i+1; 37 CovACovered := CovA.IsCovered; 38 CovBCovered := CovB.IsCovered; 39 CovCrossABCovered := CovCrossAB.IsCovered; 40 end loop; 41 CovA.WriteBin; CovB.WriteBin; CovCrossAB.WriteBin; 42 wait for 10 ns; wait; 43 end process; 44 end architecture tb3;
RkJQdWJsaXNoZXIy MTQ4NjUy