<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://simhard.com/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://simhard.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Open_Source_VHDL_Verification_Methodology%2F%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B</id>
		<title>Open Source VHDL Verification Methodology/Примеры - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://simhard.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Open_Source_VHDL_Verification_Methodology%2F%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B"/>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=Open_Source_VHDL_Verification_Methodology/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B&amp;action=history"/>
		<updated>2026-06-21T13:37:09Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.21.3</generator>

	<entry>
		<id>http://simhard.com/wiki/index.php?title=Open_Source_VHDL_Verification_Methodology/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B&amp;diff=1137&amp;oldid=prev</id>
		<title>ANA: Новая страница: «{{OS-VVM TOC}} __TOC__  == FIFO ==  {{Файл|fifo.vhd|&lt;source lang=&quot;vhdl&quot;&gt; --##################################################################### --# (c) Aldec...»</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=Open_Source_VHDL_Verification_Methodology/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B&amp;diff=1137&amp;oldid=prev"/>
				<updated>2012-11-09T21:43:35Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «{{OS-VVM TOC}} __TOC__  == FIFO ==  {{Файл|fifo.vhd|&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt; --##################################################################### --# (c) Aldec...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{OS-VVM TOC}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== FIFO ==&lt;br /&gt;
&lt;br /&gt;
{{Файл|fifo.vhd|&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
--#####################################################################&lt;br /&gt;
--# (c) Aldec, Inc.&lt;br /&gt;
--# All rights reserved.&lt;br /&gt;
--#&lt;br /&gt;
--# FIFO example with Randomization and Coverage Packages&lt;br /&gt;
--# Date Modified: Dec-20-2011&lt;br /&gt;
--#&lt;br /&gt;
--#  Verbatim copies of this source file may be used and&lt;br /&gt;
--#  distributed without restriction.&lt;br /&gt;
--#####################################################################&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.std_logic_1164.all;&lt;br /&gt;
use IEEE.std_logic_unsigned.all;&lt;br /&gt;
use IEEE.numeric_std.all;&lt;br /&gt;
&lt;br /&gt;
entity fifo is&lt;br /&gt;
	generic&lt;br /&gt;
		(&lt;br /&gt;
		data_width  : integer := 8;&lt;br /&gt;
		fifo_depth  : integer := 128&lt;br /&gt;
	);&lt;br /&gt;
	port&lt;br /&gt;
		(&lt;br /&gt;
		rst       : in std_logic;&lt;br /&gt;
		wr_en     : in std_logic;&lt;br /&gt;
		wr_clk    : in std_logic;&lt;br /&gt;
		wr_data   : in std_logic_vector( data_width-1 downto 0 );&lt;br /&gt;
		rd_en     : in std_logic;&lt;br /&gt;
		rd_clk    : in std_logic;&lt;br /&gt;
		rd_data   : out std_logic_vector( data_width-1 downto 0 );&lt;br /&gt;
		empty     : out std_logic;&lt;br /&gt;
		full      : out std_logic&lt;br /&gt;
	);&lt;br /&gt;
end entity;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
architecture behav of fifo is&lt;br /&gt;
	&lt;br /&gt;
	type memory_type is array ( 0 to fifo_depth-1 ) of std_logic_vector(wr_data'range);&lt;br /&gt;
	&lt;br /&gt;
	signal memory : memory_type;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	signal wr_ptr : integer := 0 ;--range memory'range(1);&lt;br /&gt;
	signal rd_ptr : integer := 0;--range memory'range(1);&lt;br /&gt;
	-- Used for PSL Checkers.&lt;br /&gt;
	-- signal wr_cnt : std_logic_vector(6 downto 0);&lt;br /&gt;
	--	signal rd_cnt : std_logic_vector(6 downto 0);&lt;br /&gt;
	&lt;br /&gt;
	signal empty_int    : std_logic;&lt;br /&gt;
	signal full_int     : std_logic;&lt;br /&gt;
	--signal full_delayed : std_logic;&lt;br /&gt;
	&lt;br /&gt;
begin&lt;br /&gt;
	&lt;br /&gt;
	process ( wr_clk, rst )&lt;br /&gt;
	begin&lt;br /&gt;
		&lt;br /&gt;
		if rising_edge(wr_clk) then&lt;br /&gt;
			&lt;br /&gt;
			if rst='1' then&lt;br /&gt;
				wr_ptr       &amp;lt;= 0;&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
			elsif wr_en='1' then&lt;br /&gt;
				&lt;br /&gt;
				if full_int ='0' then&lt;br /&gt;
					memory(wr_ptr) &amp;lt;= wr_data;&lt;br /&gt;
				end if;&lt;br /&gt;
				&lt;br /&gt;
				if full_int='0' then&lt;br /&gt;
					wr_ptr &amp;lt;= (wr_ptr+1) mod fifo_depth;&lt;br /&gt;
				end if;				&lt;br /&gt;
				&lt;br /&gt;
			end if;&lt;br /&gt;
			&lt;br /&gt;
		end if;&lt;br /&gt;
		&lt;br /&gt;
	end process;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	process ( rd_clk, rst )&lt;br /&gt;
	begin&lt;br /&gt;
		&lt;br /&gt;
		if rising_edge(rd_clk) then&lt;br /&gt;
			&lt;br /&gt;
			if rst='1' then&lt;br /&gt;
				rd_ptr &amp;lt;= 0;&lt;br /&gt;
			elsif rd_en='1' then&lt;br /&gt;
				&lt;br /&gt;
				if empty_int='0' then&lt;br /&gt;
					rd_ptr &amp;lt;= (rd_ptr+1) mod fifo_depth;&lt;br /&gt;
				end if;&lt;br /&gt;
				&lt;br /&gt;
			end if;&lt;br /&gt;
			&lt;br /&gt;
		end if;&lt;br /&gt;
		&lt;br /&gt;
	end process;&lt;br /&gt;
	&lt;br /&gt;
	rd_data &amp;lt;= memory(rd_ptr);&lt;br /&gt;
	&lt;br /&gt;
	empty_int &amp;lt;= '1' when rd_ptr=wr_ptr else '0';&lt;br /&gt;
	empty     &amp;lt;= empty_int;&lt;br /&gt;
	&lt;br /&gt;
	full_int  &amp;lt;= '1' when ((wr_ptr+1) mod fifo_depth)=rd_ptr else '0';&lt;br /&gt;
	&lt;br /&gt;
	full &amp;lt;= full_int;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
end architecture;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Файл|tb_top.vhd|&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
-- (c) Aldec, Inc.&lt;br /&gt;
-- All rights reserved.&lt;br /&gt;
--&lt;br /&gt;
-- FIFO example with Randomization and Coverage Packages&lt;br /&gt;
-- Date Modified: Dec-20-2011&lt;br /&gt;
--&lt;br /&gt;
--  Verbatim copies of this source file may be used and&lt;br /&gt;
--  distributed without restriction.&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
library ieee;&lt;br /&gt;
USE ieee.std_logic_1164.ALL;&lt;br /&gt;
--USE ieee.std_logic_unsigned.all;&lt;br /&gt;
USE ieee.numeric_std.ALL;&lt;br /&gt;
use ieee.math_real.all;&lt;br /&gt;
use std.textio.all;&lt;br /&gt;
&lt;br /&gt;
use work.RandomBasePkg.all ; &lt;br /&gt;
use work.RandomPkg.all ;&lt;br /&gt;
use work.CoveragePkg.all;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
entity tb_top is&lt;br /&gt;
	generic&lt;br /&gt;
		(&lt;br /&gt;
		log_file: string  := &amp;quot;res.log&amp;quot;;&lt;br /&gt;
		data_width  : integer := 8;&lt;br /&gt;
		clk_period : time := 40 ns;&lt;br /&gt;
		TimeOut : time := 200 us;&lt;br /&gt;
		fifo_dpth :integer := 128&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
end tb_top;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
architecture behavior of tb_top is&lt;br /&gt;
	&lt;br /&gt;
	file l_file: TEXT open write_mode is log_file;&lt;br /&gt;
	&lt;br /&gt;
	------- Component Declaration for the Unit Under Test (UUT)&lt;br /&gt;
	&lt;br /&gt;
	component fifo&lt;br /&gt;
		generic(&lt;br /&gt;
			data_width : INTEGER := 8;&lt;br /&gt;
			fifo_depth : INTEGER := 128&lt;br /&gt;
		);&lt;br /&gt;
		port(&lt;br /&gt;
			rst : in STD_LOGIC;&lt;br /&gt;
			wr_en : in STD_LOGIC;&lt;br /&gt;
			wr_clk : in STD_LOGIC;&lt;br /&gt;
			wr_data : in STD_LOGIC_VECTOR (data_width-1 downto 0);&lt;br /&gt;
			rd_en : in STD_LOGIC;&lt;br /&gt;
			rd_clk : in STD_LOGIC;&lt;br /&gt;
			rd_data : out STD_LOGIC_VECTOR (data_width-1 downto 0);&lt;br /&gt;
			empty : out STD_LOGIC;&lt;br /&gt;
			full : out STD_LOGIC&lt;br /&gt;
		);&lt;br /&gt;
	end component;&lt;br /&gt;
	&lt;br /&gt;
	----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
	&lt;br /&gt;
	--the number of coverage bins (coverage points)&lt;br /&gt;
	constant numcb : integer := 3;&lt;br /&gt;
	&lt;br /&gt;
	signal reset     :std_logic := '1';&lt;br /&gt;
	signal clk    :std_logic := '0';&lt;br /&gt;
	signal fifo_re   :std_logic ;   &lt;br /&gt;
	signal dataout   :std_logic_vector(data_width-1 downto 0);		&lt;br /&gt;
	signal end_sim   :std_logic  :='0';&lt;br /&gt;
	signal full      :std_logic;&lt;br /&gt;
	signal empty     :std_logic;&lt;br /&gt;
	signal burstnum :integer := 0;&lt;br /&gt;
	signal wordnum   :integer := 0;&lt;br /&gt;
	&lt;br /&gt;
	--new changes&lt;br /&gt;
	signal cnt      :unsigned (1 downto 0) := &amp;quot;00&amp;quot;;&lt;br /&gt;
	type state_type is (S_IDLE,S_DELAY,S_READ);  &lt;br /&gt;
	signal state: state_type; &lt;br /&gt;
	signal rd_clk   :std_logic;&lt;br /&gt;
	&lt;br /&gt;
	--coverage objects&lt;br /&gt;
	shared variable cp1_full : CovPType;&lt;br /&gt;
	shared variable cp2_empty : CovPType;&lt;br /&gt;
	shared variable cp3_cross_we_full    : CovPType;&lt;br /&gt;
	shared variable cp4_illegal_re_empty   : CovPType;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	type FifoWrInfType is record &lt;br /&gt;
		we     : std_logic ;&lt;br /&gt;
		datain   : std_logic_vector( data_width-1 downto 0 );&lt;br /&gt;
	end record;&lt;br /&gt;
	signal FifoWrInf : FifoWrInfType := (we =&amp;gt; '0', datain =&amp;gt; (others=&amp;gt;'0')) ;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	procedure GloablReset (signal reset : out std_logic ) is&lt;br /&gt;
	begin &lt;br /&gt;
		reset &amp;lt;='1' ;&lt;br /&gt;
		wait for 80 ns;&lt;br /&gt;
		reset &amp;lt;='0' ;&lt;br /&gt;
	end procedure;&lt;br /&gt;
	&lt;br /&gt;
	procedure FifoWriteWord (&lt;br /&gt;
		word : in std_logic_vector(data_width-1 downto 0);&lt;br /&gt;
		signal	FifoWrInf : out FifoWrInfType ) is &lt;br /&gt;
	begin		&lt;br /&gt;
		--setting the bus for fifo&lt;br /&gt;
		FifoWrInf.we &amp;lt;= '1';&lt;br /&gt;
		FifoWrInf.datain &amp;lt;= word;&lt;br /&gt;
		wait until rising_edge(clk);					&lt;br /&gt;
		--clearing write enable &lt;br /&gt;
		FifoWrInf.we &amp;lt;= '0';&lt;br /&gt;
		&lt;br /&gt;
	end procedure;&lt;br /&gt;
	&lt;br /&gt;
	procedure FifoRandBurstWrite( &lt;br /&gt;
		len : in integer;&lt;br /&gt;
		signal	FifoWrInf : out FifoWrInfType) is&lt;br /&gt;
		variable RV : RandomPType ;&lt;br /&gt;
		variable wordgen : std_logic_vector(data_width-1 downto 0);&lt;br /&gt;
	begin			&lt;br /&gt;
		--Sending len number of words to the fifo&lt;br /&gt;
		for i in 1 to len loop&lt;br /&gt;
			--Creating the random value to be sent to fifo&lt;br /&gt;
			wordgen := RV.RandSlv(0, 255, 8);&lt;br /&gt;
			--writing the word to fifo&lt;br /&gt;
			FifoWriteWord(wordgen, FifoWrInf);&lt;br /&gt;
		end loop;&lt;br /&gt;
	end procedure;	&lt;br /&gt;
	&lt;br /&gt;
	impure function getFC return Integer is&lt;br /&gt;
		--getFC function calculates the FC value as a persentage &lt;br /&gt;
		variable tmp : real;&lt;br /&gt;
	begin&lt;br /&gt;
		--the illegal bins are not taken into account&lt;br /&gt;
		tmp := (real(to_integer(cp1_full.IsCovered)+to_integer(cp2_empty.IsCovered)+to_integer(cp3_cross_we_full.IsCovered))/real(numcb)) * 100.0;&lt;br /&gt;
		return integer(tmp);&lt;br /&gt;
	end function getFC;&lt;br /&gt;
	&lt;br /&gt;
	--adjustknobs procedure analyzes all bins and adjuct the constraints for random data to improve the probability of hitting &lt;br /&gt;
	--uncovered bins&lt;br /&gt;
	procedure adjustknobs&lt;br /&gt;
		(	&lt;br /&gt;
		minlen : inout integer ;&lt;br /&gt;
		maxlen : inout integer ; &lt;br /&gt;
		mindelay: inout integer ;&lt;br /&gt;
		maxdelay : inout integer&lt;br /&gt;
		)&lt;br /&gt;
		is	&lt;br /&gt;
		variable tmp : real;&lt;br /&gt;
	begin&lt;br /&gt;
		--the algorith below is just used as an example and &lt;br /&gt;
		--by no means is the most effecient in adjusting left and right range for values generation		&lt;br /&gt;
		&lt;br /&gt;
		if (cp1_full.IsCovered = FALSE or cp3_cross_we_full.IsCovered = FALSE) then&lt;br /&gt;
			----reduce mindelay&lt;br /&gt;
			tmp := real(mindelay); --to real type&lt;br /&gt;
			tmp := tmp - tmp*0.3; --reducing by 30%&lt;br /&gt;
			--make sure mindelay is always &amp;gt;= 1&lt;br /&gt;
			if (integer(tmp) &amp;gt;= 1) then&lt;br /&gt;
				mindelay := integer(tmp); --back to integer&lt;br /&gt;
			else&lt;br /&gt;
				mindelay := 1; --to avoid going under 1&lt;br /&gt;
			end if;&lt;br /&gt;
			--reduce maxdelay&lt;br /&gt;
			tmp := real(maxdelay); --to real type&lt;br /&gt;
			tmp := tmp - tmp*0.3; --reducing by 30%&lt;br /&gt;
			--make sure maxdelay is always &amp;gt; then mindelay&lt;br /&gt;
			if (integer(tmp) &amp;gt; mindelay) then&lt;br /&gt;
				maxdelay := integer(tmp); --back to integer&lt;br /&gt;
			else&lt;br /&gt;
				maxdelay := mindelay + 1; --to avoid going under mindelay&lt;br /&gt;
			end if;&lt;br /&gt;
			&lt;br /&gt;
			--and increase the packet length&lt;br /&gt;
			tmp := real(maxlen); --to real type&lt;br /&gt;
			tmp := tmp + tmp*0.5; --increase by 50%			&lt;br /&gt;
			maxlen := integer(tmp); --back to integer			&lt;br /&gt;
			&lt;br /&gt;
		else &lt;br /&gt;
			if (cp2_empty.IsCovered = FALSE) then&lt;br /&gt;
				-- to empty the fifo increase the delay between packets&lt;br /&gt;
				--increase mindelay&lt;br /&gt;
				tmp := real(mindelay); --to real type&lt;br /&gt;
				tmp := tmp + tmp*0.3; --increase by 30%&lt;br /&gt;
				mindelay := integer(tmp); --back to integer&lt;br /&gt;
				&lt;br /&gt;
				--increase maxdelay&lt;br /&gt;
				tmp := real(maxdelay); --to real type&lt;br /&gt;
				tmp := tmp + tmp*0.3; --increase by 30%&lt;br /&gt;
				maxdelay := integer(tmp); --back to integer&lt;br /&gt;
				&lt;br /&gt;
				--and reduce the packet lengh&lt;br /&gt;
				--reduce minlen&lt;br /&gt;
				tmp := real(minlen); --to real type&lt;br /&gt;
				tmp := tmp - tmp*0.3; --reducing by 30%				&lt;br /&gt;
				if (integer(tmp) &amp;gt;= 1) then&lt;br /&gt;
					minlen := integer(tmp); --back to integer&lt;br /&gt;
				else&lt;br /&gt;
					minlen := 1; --to avoid going under value 1&lt;br /&gt;
				end if;&lt;br /&gt;
				&lt;br /&gt;
				--reduce maxlen&lt;br /&gt;
				tmp := real(maxlen); --to real type&lt;br /&gt;
				tmp := tmp - tmp*0.3; --reducing by 30%				&lt;br /&gt;
				if (integer(tmp) &amp;gt; minlen) then&lt;br /&gt;
					maxlen := integer(tmp); --back to integer&lt;br /&gt;
				else&lt;br /&gt;
					maxlen := minlen + 1; --to avoid going under value 1&lt;br /&gt;
				end if;&lt;br /&gt;
			end if;&lt;br /&gt;
		end if;&lt;br /&gt;
		&lt;br /&gt;
	end procedure adjustknobs;&lt;br /&gt;
	&lt;br /&gt;
	procedure Message ( str : string ) is&lt;br /&gt;
		variable buf : LINE;&lt;br /&gt;
	begin&lt;br /&gt;
		write(buf, str);&lt;br /&gt;
		writeline(output, buf);&lt;br /&gt;
	end;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
begin&lt;br /&gt;
	----------------------------------------------------------------------------------------------------------------	&lt;br /&gt;
	&lt;br /&gt;
	DUT: fifo&lt;br /&gt;
	generic map(&lt;br /&gt;
		data_width =&amp;gt; 8,&lt;br /&gt;
	fifo_depth =&amp;gt; 128)&lt;br /&gt;
	port map(&lt;br /&gt;
		rst =&amp;gt; reset, &lt;br /&gt;
		wr_en =&amp;gt; FifoWrInf.we, &lt;br /&gt;
		wr_clk =&amp;gt; clk, &lt;br /&gt;
		wr_data =&amp;gt; FifoWrInf.datain, &lt;br /&gt;
		rd_en =&amp;gt; fifo_re, &lt;br /&gt;
		rd_clk =&amp;gt; rd_clk, &lt;br /&gt;
		rd_data =&amp;gt; dataout, &lt;br /&gt;
		empty =&amp;gt; empty,&lt;br /&gt;
		full =&amp;gt; full&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
	&lt;br /&gt;
	TestFlow: process&lt;br /&gt;
		--This process implements writing to FIFO and also checking &lt;br /&gt;
		--the FC results and adjusting the randomization if necessary&lt;br /&gt;
		variable delay : integer;&lt;br /&gt;
		variable len : integer;&lt;br /&gt;
		variable RV : RandomPType ; &lt;br /&gt;
		variable FC_prev : integer:=0;&lt;br /&gt;
		variable FC : integer;&lt;br /&gt;
		variable minlen : integer := 10;&lt;br /&gt;
		variable maxlen : integer := 64;&lt;br /&gt;
		variable mindelay: integer := 1;&lt;br /&gt;
		variable maxdelay : integer := 20;&lt;br /&gt;
	begin&lt;br /&gt;
		--initializing the generator with the seed&lt;br /&gt;
		RV.InitSeed(RV'instance_name) ; &lt;br /&gt;
		&lt;br /&gt;
		--reseting the DUT&lt;br /&gt;
		GloablReset(reset);&lt;br /&gt;
		&lt;br /&gt;
		--Main loop&lt;br /&gt;
		while (end_sim = '0') loop&lt;br /&gt;
			&lt;br /&gt;
			--random delay between sending the next packet			&lt;br /&gt;
			delay := RV.RandInt(mindelay, maxdelay);&lt;br /&gt;
			wait for delay * clk_period;&lt;br /&gt;
			&lt;br /&gt;
			-- Generating the random size packet and sending it to the fifo&lt;br /&gt;
			len := RV.RandInt(minlen, maxlen);&lt;br /&gt;
			FifoRandBurstWrite(len,FifoWrInf);&lt;br /&gt;
			--counting number of workds transfered (for statistics)&lt;br /&gt;
			wordnum &amp;lt;= wordnum + len;&lt;br /&gt;
			&lt;br /&gt;
			--checking the functional coverage&lt;br /&gt;
			FC := getFC;&lt;br /&gt;
			if FC = FC_prev then&lt;br /&gt;
				adjustknobs(minlen, maxlen, mindelay, maxdelay);				&lt;br /&gt;
			end if;&lt;br /&gt;
			--updating the FC_prev&lt;br /&gt;
			FC_prev := FC;&lt;br /&gt;
			--incrementing the packet counter ( for statistics)&lt;br /&gt;
			burstnum &amp;lt;= burstnum +1;&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		wait;&lt;br /&gt;
	end process; &lt;br /&gt;
	----------------------------------------------------------------------------------------------------------------	&lt;br /&gt;
	CoverageMonitor: process 		&lt;br /&gt;
		variable we_integer:integer;&lt;br /&gt;
		variable full_integer:integer; 	&lt;br /&gt;
		variable re_integer,empty_integer:integer;&lt;br /&gt;
		variable re_empty_illegal: std_logic;&lt;br /&gt;
		variable re_empty_illegal_integer: integer;&lt;br /&gt;
		variable RV : RandomPType ;&lt;br /&gt;
		variable bin_1d: CovBinBaseType;&lt;br /&gt;
		variable bin_2d: CovMatrix2BaseType;&lt;br /&gt;
		variable status_notFull, status_notEmpty, status_notWeFull: bit;&lt;br /&gt;
	begin		&lt;br /&gt;
		--creating bins for cover points&lt;br /&gt;
		--coverage point 1 - for fifo's full signal (High). The coverage goal is set to 3&lt;br /&gt;
		cp1_full.AddBins(3,GenBin(1));&lt;br /&gt;
		--coverage point 2 - for fifo's empty signal (High). The coverage goal is set to 3&lt;br /&gt;
		cp2_empty.AddBins(3,GenBin(1));&lt;br /&gt;
		--coverage point 3 - cross coverage for simultaneous FifoWrInfType.we and full signal. The coverage goal is set to 3&lt;br /&gt;
		cp3_cross_we_full.AddCross(3,GenBin(1), GenBin(1));&lt;br /&gt;
		&lt;br /&gt;
		-- coverage point 4 - creating illegal bin when empty and re are high at the same time&lt;br /&gt;
		cp4_illegal_re_empty.AddBins(IllegalBin(1));&lt;br /&gt;
		&lt;br /&gt;
		--setting the initial statuses. Statuses are used for proper coverage event counting towards the goal. For instance,&lt;br /&gt;
		--when FIFO gets full we don't want to increment the full coverage point again on the next clock cycle. Instead, we &lt;br /&gt;
		--want to count the event when FIFO transitions from not being full to full.&lt;br /&gt;
		status_notFull := '1';&lt;br /&gt;
		status_notEmpty := '1';&lt;br /&gt;
		status_notWeFull := '1';&lt;br /&gt;
		&lt;br /&gt;
		--collecting coverage&lt;br /&gt;
		MainCovLoop: while not (cp1_full.IsCovered and cp2_empty.IsCovered and cp3_cross_we_full.IsCovered)	loop &lt;br /&gt;
			&lt;br /&gt;
			wait until rising_edge(clk) and reset = '0';&lt;br /&gt;
			we_integer := to_integer(FifoWrInf.we);&lt;br /&gt;
			full_integer := to_integer(full);&lt;br /&gt;
			if full = '0' then&lt;br /&gt;
				status_notFull := '1';&lt;br /&gt;
			end if;&lt;br /&gt;
			&lt;br /&gt;
			re_integer := to_integer(fifo_re);&lt;br /&gt;
			empty_integer := to_integer(empty);&lt;br /&gt;
			if empty = '0' then &lt;br /&gt;
				status_notEmpty := '1';&lt;br /&gt;
			end if;&lt;br /&gt;
			&lt;br /&gt;
			if not (FifoWrInf.we = '1' and full = '1') then&lt;br /&gt;
				status_notWeFull := '1';&lt;br /&gt;
			end if;&lt;br /&gt;
			&lt;br /&gt;
			re_empty_illegal := fifo_re and empty;&lt;br /&gt;
			re_empty_illegal_integer := to_integer(re_empty_illegal);&lt;br /&gt;
			&lt;br /&gt;
			--check if cp1 is covered&lt;br /&gt;
			if (cp1_full.IsCovered = FALSE and status_notFull = '1') then&lt;br /&gt;
				--if not then sample it&lt;br /&gt;
				cp1_full.ICover(to_integer(full) ) ;				&lt;br /&gt;
				if (full = '1') then&lt;br /&gt;
					status_notFull := '0';					&lt;br /&gt;
					if (cp1_full.IsCovered) then					&lt;br /&gt;
						Message(&amp;quot;Covered condition *FIFO Full* @ &amp;quot; &amp;amp; time'image(now) );&lt;br /&gt;
					else &lt;br /&gt;
						Message(&amp;quot;Hit condition *FIFO Full* @ &amp;quot; &amp;amp; time'image(now) );						&lt;br /&gt;
					end if;&lt;br /&gt;
					cp1_full.WriteBin;&lt;br /&gt;
				end if;&lt;br /&gt;
			end if;&lt;br /&gt;
			&lt;br /&gt;
			--check if cp2 is covered&lt;br /&gt;
			if (cp2_empty.IsCovered = FALSE and status_notEmpty = '1') then 			&lt;br /&gt;
				--if not then sample it&lt;br /&gt;
				cp2_empty.ICover(to_integer(empty)) ;				&lt;br /&gt;
				if (empty = '1') then&lt;br /&gt;
					status_notEmpty := '0';&lt;br /&gt;
					if (cp2_empty.IsCovered) then&lt;br /&gt;
						Message(&amp;quot;Covered condition *FIFO Empty* @ &amp;quot; &amp;amp; time'image(now) );&lt;br /&gt;
					else&lt;br /&gt;
						Message(&amp;quot;Hit condition *FIFO Empty* @ &amp;quot; &amp;amp; time'image(now) );&lt;br /&gt;
					end if;&lt;br /&gt;
					cp2_empty.WriteBin ;&lt;br /&gt;
				end if;&lt;br /&gt;
			end if;&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			--check if cp3 is covered&lt;br /&gt;
			if (cp3_cross_we_full.IsCovered = FALSE and status_notWeFull = '1') then 			&lt;br /&gt;
				--if not then sample it&lt;br /&gt;
				cp3_cross_we_full.ICover((we_integer, full_integer));				&lt;br /&gt;
				if (FifoWrInf.we = '1' and full = '1') then&lt;br /&gt;
					status_notWeFull := '0';&lt;br /&gt;
					if (cp3_cross_we_full.IsCovered) then					&lt;br /&gt;
						Message(&amp;quot;Covered condition *Writing to full FIFO (we and full)* @ &amp;quot; &amp;amp; time'image(now) );&lt;br /&gt;
					else &lt;br /&gt;
						Message(&amp;quot;Hit condition *Writing to full FIFO (we and full)* @ &amp;quot; &amp;amp; time'image(now) );&lt;br /&gt;
					end if;&lt;br /&gt;
					cp3_cross_we_full.WriteBin ; &lt;br /&gt;
				end if;&lt;br /&gt;
			end if;&lt;br /&gt;
			&lt;br /&gt;
			--check for the cp4 as long as the simulation is running&lt;br /&gt;
			cp4_illegal_re_empty.ICover(re_empty_illegal_integer);&lt;br /&gt;
			&lt;br /&gt;
			--Check for TimeOut and force exit when now is greater than TimeOut value&lt;br /&gt;
			exit MainCovLoop when now &amp;gt;= TimeOut;&lt;br /&gt;
			&lt;br /&gt;
		end loop;&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		--Final reporting&lt;br /&gt;
		if now &amp;gt;= TimeOut then&lt;br /&gt;
			Message(&amp;quot;TIME OUT. Cannot achieve the target functional coverage. You may try increasing the TimeOut generic in the tb_top instance.&amp;quot;);&lt;br /&gt;
		else&lt;br /&gt;
			Message(&amp;quot;SUCCESS. The functional coverage goal  is achieved.&amp;quot;);			&lt;br /&gt;
		end if;&lt;br /&gt;
		Message(&amp;quot;Number of burst transfers: &amp;quot; &amp;amp; integer'image(burstnum));&lt;br /&gt;
		Message(&amp;quot;Total words transferred: &amp;quot; &amp;amp; integer'image(wordnum));&lt;br /&gt;
		Message(&amp;quot;Coverage Goal: 100%&amp;quot;);&lt;br /&gt;
		Message(&amp;quot;Achieved Coverage: &amp;quot; &amp;amp; integer'image(getFC) &amp;amp; &amp;quot;%&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
	    cp3_cross_we_full.WriteCovDb (&amp;quot;we_full.txt&amp;quot;, OpenKind =&amp;gt; WRITE_MODE );&lt;br /&gt;
		Message(&amp;quot;Database written to 'we_full.txt' text file.&amp;quot;);&lt;br /&gt;
		cp2_empty.WriteCovDb (&amp;quot;empty.txt&amp;quot;, OpenKind =&amp;gt; WRITE_MODE );&lt;br /&gt;
		Message(&amp;quot;Database written to 'empty.txt' text file.&amp;quot;);&lt;br /&gt;
		cp1_full.WriteCovDb (&amp;quot;full.txt&amp;quot;, OpenKind =&amp;gt; WRITE_MODE );&lt;br /&gt;
		Message(&amp;quot;Database written to 'full.txt' text file.&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		--let the simulation run for a little longer before stopping it&lt;br /&gt;
		wait for 1 us;&lt;br /&gt;
		--end the simulation by suspending all the processes&lt;br /&gt;
		end_sim &amp;lt;= '1';&lt;br /&gt;
		&lt;br /&gt;
		wait;&lt;br /&gt;
	end process;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	---------------------------------------------------------------------------------------------------&lt;br /&gt;
	readInf:process (rd_clk,reset)&lt;br /&gt;
		variable RV :RandomPType;&lt;br /&gt;
		variable count: integer :=0;&lt;br /&gt;
		--mindelay and maxdelay are set to introduce some delay in CPU reaction to not empty fifo&lt;br /&gt;
		constant mindelay : integer:= 5;&lt;br /&gt;
		constant maxdelay : integer:= 30;&lt;br /&gt;
		&lt;br /&gt;
	begin&lt;br /&gt;
		--initializing the generator with the seed&lt;br /&gt;
		RV.InitSeed(RV'instance_name) ; 		&lt;br /&gt;
		&lt;br /&gt;
		if reset = '1' then&lt;br /&gt;
			state &amp;lt;= S_IDLE;&lt;br /&gt;
			--set random delay before CPU starts reading&lt;br /&gt;
			count := RV.RandInt(mindelay, maxdelay);&lt;br /&gt;
		elsif rising_edge(rd_clk)then&lt;br /&gt;
			case state is				&lt;br /&gt;
				--in IDLE state CPU waits until fifo becomes not empty				&lt;br /&gt;
				when S_IDLE =&amp;gt; &lt;br /&gt;
				if(empty ='1') then&lt;br /&gt;
					--set random delay before CPU starts reading&lt;br /&gt;
					count := RV.RandInt(mindelay, maxdelay);&lt;br /&gt;
				else&lt;br /&gt;
					state &amp;lt;= S_DELAY;&lt;br /&gt;
				end if;   &lt;br /&gt;
				--DELAY state inserts a delay before CPU starts actual reading&lt;br /&gt;
				when S_DELAY =&amp;gt;&lt;br /&gt;
				if(count &amp;gt; 0) then&lt;br /&gt;
					--decrement the counter and state in the same state			&lt;br /&gt;
					count := count - 1;					&lt;br /&gt;
				else&lt;br /&gt;
					state &amp;lt;= S_READ;					&lt;br /&gt;
				end if;&lt;br /&gt;
				--In READ state the read enable strobe will be set to high&lt;br /&gt;
				when S_READ =&amp;gt;&lt;br /&gt;
				--unless fifo is empty stay in the same state&lt;br /&gt;
				if(empty = '1') then  &lt;br /&gt;
					state &amp;lt;= S_IDLE;&lt;br /&gt;
				end if;&lt;br /&gt;
				&lt;br /&gt;
				when others  =&amp;gt;&lt;br /&gt;
				state &amp;lt;= S_IDLE;				&lt;br /&gt;
				&lt;br /&gt;
			end case;&lt;br /&gt;
		end if;&lt;br /&gt;
	end process;&lt;br /&gt;
	&lt;br /&gt;
	fifo_re &amp;lt;= '1' when (state = S_READ and empty = '0') else '0';	--added empty='0' to instantly disable reading when empty goes High.&lt;br /&gt;
	-------------------------------------------------------------------------------------------	&lt;br /&gt;
	clkGen : process&lt;br /&gt;
	begin&lt;br /&gt;
		if (end_sim = '0') then&lt;br /&gt;
			clk &amp;lt;= '0';&lt;br /&gt;
			wait for clk_period/2;&lt;br /&gt;
			clk &amp;lt;= '1';&lt;br /&gt;
			wait for clk_period/2;&lt;br /&gt;
		else &lt;br /&gt;
			wait;--suspend the simulation&lt;br /&gt;
		end if;&lt;br /&gt;
	end process;&lt;br /&gt;
	-------------------------------------------------------------------------------------------	&lt;br /&gt;
	clk_slow:process (reset, clk)&lt;br /&gt;
	begin		&lt;br /&gt;
		if rising_edge(clk) then&lt;br /&gt;
			if (reset = '1') then &lt;br /&gt;
				cnt &amp;lt;= (others =&amp;gt; '0');&lt;br /&gt;
			else&lt;br /&gt;
				cnt &amp;lt;= cnt + 1;&lt;br /&gt;
			end if;&lt;br /&gt;
		end if;&lt;br /&gt;
	end process;&lt;br /&gt;
	&lt;br /&gt;
	rd_clk &amp;lt;= '1' when cnt = &amp;quot;11&amp;quot; else '0';&lt;br /&gt;
	&lt;br /&gt;
end architecture; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sensors ==&lt;br /&gt;
&lt;br /&gt;
{{Файл|sensors.vhd|&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
-- ######################################################################################&lt;br /&gt;
-- # File: sensors.vhd&lt;br /&gt;
-- # Version: 1.1&lt;br /&gt;
-- # Dependencies: RandomPkg&lt;br /&gt;
-- #               CoveragePkg (revision 2.3 or newer)&lt;br /&gt;
-- # Functionality: This unit emulates reading from 8x8 matrix of sensors.&lt;br /&gt;
-- # Sensors are randomly filled with data (normal distribution, Mean and SD controlled&lt;br /&gt;
-- # with generics). Index values for reading from sensor matrix are either generated&lt;br /&gt;
-- # using uniform RNG or intelligent randomization feature of CoveragePkg (selection&lt;br /&gt;
-- # is controlled by generic).&lt;br /&gt;
-- # Coverage is collected for sensor index pairs and for sensor data. Current coverage&lt;br /&gt;
-- # results are used to control index generation (intelligent mode) and to flatten&lt;br /&gt;
-- # sensor data distribution for faster coverage.&lt;br /&gt;
-- # The test prints report in the console and saves coverage databases in two files.&lt;br /&gt;
-- ######################################################################################&lt;br /&gt;
&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
use ieee.numeric_std.all;&lt;br /&gt;
&lt;br /&gt;
use work.CoveragePkg.all;&lt;br /&gt;
use work.RandomPkg.all;&lt;br /&gt;
&lt;br /&gt;
use std.textio.all;&lt;br /&gt;
&lt;br /&gt;
entity sensors is&lt;br /&gt;
    generic&lt;br /&gt;
    (&lt;br /&gt;
        Intelligent : boolean := True;      -- Intelligent or Uniform index randomization&lt;br /&gt;
        DataMean : real := 128.0;           -- Mean value of sensor data distribution&lt;br /&gt;
        DataSDstart: real := 32.0;          -- SD of sensor data distribution&lt;br /&gt;
        DataSDinc: real := 4.0              -- increment of SD value auto-adjustment&lt;br /&gt;
    );&lt;br /&gt;
end entity sensors;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
architecture behavior of sensors is&lt;br /&gt;
    signal END_TEST : boolean := false;         -- Flag that ends clock generation&lt;br /&gt;
    signal CLK: std_logic;                      -- Universal clocking signal&lt;br /&gt;
    &lt;br /&gt;
    type sensorsPType is protected              -- Type handling setting/retrieving sensor data&lt;br /&gt;
        procedure set ( X,Y,Val : integer );&lt;br /&gt;
        impure function get ( X,Y : integer ) return integer;&lt;br /&gt;
    end protected;&lt;br /&gt;
&lt;br /&gt;
    type sensorsPType is protected body&lt;br /&gt;
        type data_array is array (0 to 7, 0 to 7) of integer;&lt;br /&gt;
        variable data : data_array := (others=&amp;gt;(others=&amp;gt;0));&lt;br /&gt;
        &lt;br /&gt;
        procedure set ( X,Y,Val : integer ) is  -- sets sensor data at position (X,Y)&lt;br /&gt;
        begin&lt;br /&gt;
            data(X, Y) := Val;&lt;br /&gt;
        end;&lt;br /&gt;
        &lt;br /&gt;
        impure function get ( X,Y : integer ) return integer is&lt;br /&gt;
        begin                                   -- gets sensor data from position (X,Y)&lt;br /&gt;
            return data(X, Y);&lt;br /&gt;
        end;&lt;br /&gt;
    	&lt;br /&gt;
    end protected body;&lt;br /&gt;
    &lt;br /&gt;
    shared variable sensors : sensorsPType;     -- 8x8 sensor matrix&lt;br /&gt;
    &lt;br /&gt;
--    shared variable Rsens   : RandomPType;      -- Object for generating one sensor data&lt;br /&gt;
--    shared variable Rxy     : RandomPType;      -- Object for generating sensor indices&lt;br /&gt;
&lt;br /&gt;
    shared variable DCov  : CovPType;           -- Object for sensor data coverpoint&lt;br /&gt;
    shared variable XYCov : CovPType;           -- Object for sensor address cross&lt;br /&gt;
    &lt;br /&gt;
    procedure Message ( str : string ) is       -- prints string argument to the console&lt;br /&gt;
        variable buf : LINE;&lt;br /&gt;
    begin&lt;br /&gt;
        write(buf, str);&lt;br /&gt;
        writeline(output, buf);&lt;br /&gt;
    end;&lt;br /&gt;
    &lt;br /&gt;
begin&lt;br /&gt;
-- This process provides initialization of random and coverage objects.&lt;br /&gt;
-- Data Collection loop runs until full data coverage is achieved.&lt;br /&gt;
-- Message is displayed within the loop when index coverage is achieved.&lt;br /&gt;
-- When all tests are done, END_TEST flag turns off clock generation.&lt;br /&gt;
-- Messages describing verification progress and final reports are printed from here.&lt;br /&gt;
  CollectCv : process&lt;br /&gt;
        variable Rxy : RandomPType;             -- object for generating sensor indices&lt;br /&gt;
        variable X,Y,SensorData : integer;      -- index and sensor data buffers&lt;br /&gt;
        variable buf : LINE;                    -- line buffer for direct text IO&lt;br /&gt;
        variable xycnt, dcnt : integer;         -- loop counters&lt;br /&gt;
        variable bin_1d: CovBinBaseType;        -- 1 dimensional bin data buffer&lt;br /&gt;
        variable bin_2d: CovMatrix2BaseType;    -- 2 dimensional bin data buffer&lt;br /&gt;
        &lt;br /&gt;
    begin&lt;br /&gt;
        Rxy.InitSeed(Rxy'instance_name);        -- seed array index random variable Rxy'instance_name&lt;br /&gt;
        DCov.AddBins(GenBin(0, 255, 16));           -- 16 bins (0 to 15, 16 to 31, ...)&lt;br /&gt;
        XYCov.AddCross(GenBin(0,7), GenBin(0,7));   -- 8x8 bin matrix.&lt;br /&gt;
        XYCov.InitSeed(XYCov'instance_name);    -- seed for intelligent coverage&lt;br /&gt;
        Message(&amp;quot;*** Initialized Randomization and Coverage Structures ***&amp;quot;);&lt;br /&gt;
        Message(&amp;quot;  Data mean value set to &amp;quot; &amp;amp; real'image(DataMean));&lt;br /&gt;
        Message(&amp;quot;  Data SD value set to &amp;quot; &amp;amp; real'image(DataSDstart));&lt;br /&gt;
&lt;br /&gt;
        dcnt  := 0;                             -- initialize collection loop counter&lt;br /&gt;
        xycnt := 0;                             -- initialize index coverage counter&lt;br /&gt;
        Collect: while not DCov.IsCovered loop  -- collection loop runs until data covered&lt;br /&gt;
           wait until rising_edge(CLK);         -- sampling event detection&lt;br /&gt;
           if Intelligent then&lt;br /&gt;
              (X, Y) := XYCov.RandCovPoint;     -- randomize uncovered indices&lt;br /&gt;
           else&lt;br /&gt;
              X := Rxy.RandInt(0,7);            -- generate X array index&lt;br /&gt;
              Y := Rxy.RandInt(0,7);            -- generate Y array index&lt;br /&gt;
           end if;&lt;br /&gt;
           DCov.ICover(sensors.get(X, Y));      -- collect coverpoint data&lt;br /&gt;
           XYCov.ICover((X, Y));                -- collect cross data&lt;br /&gt;
           dcnt := dcnt + 1;                    -- incr. collection loop counter&lt;br /&gt;
           if xycnt=0 and XYCov.IsCovered then  -- index coverage just achieved&lt;br /&gt;
		      xycnt := dcnt;&lt;br /&gt;
              Message(&amp;quot;# Index Coverage achieved after &amp;quot; &amp;amp; integer'image(xycnt) &lt;br /&gt;
                       &amp;amp; &amp;quot; iterations.&amp;quot;);&lt;br /&gt;
           end if;&lt;br /&gt;
        end loop Collect;&lt;br /&gt;
        Message(&amp;quot;$ Sensor Data Coverage achieved after &amp;quot; &amp;amp; integer'image(dcnt) &lt;br /&gt;
                 &amp;amp; &amp;quot; iterations.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        END_TEST &amp;lt;= true;       -- We are done with testing - only reporting left...&lt;br /&gt;
        Message(&amp;quot;*** Complete Coverage achieved !!! ***&amp;quot;);&lt;br /&gt;
        Message(&amp;quot;*******   Reporting Stage...   *******&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        -- DCov.WriteBin;  -- writing extensive report for coverpoint would be very long!&lt;br /&gt;
        Message(&amp;quot;$$$ Sensor Data Coverage Results $$$&amp;quot;);&lt;br /&gt;
        DmpD: for i in 1 to 16 loop     -- print 16 lines of data coverage results&lt;br /&gt;
            bin_1d := DCov.GetBin(i);   -- get 1 bin data&lt;br /&gt;
            Message(&amp;quot;  Bin: &amp;quot; &amp;amp; integer'image(bin_1d.BinVal(1).min)     -- print bin value range&lt;br /&gt;
                     &amp;amp; &amp;quot; to &amp;quot; &amp;amp; integer'image(bin_1d.BinVal(1).max) &lt;br /&gt;
                     &amp;amp; &amp;quot;; Count: &amp;quot; &amp;amp; integer'image(bin_1d.Count)    );  -- print bin count&lt;br /&gt;
        end loop DmpD;&lt;br /&gt;
        DCov.WriteCovDb (&amp;quot;quicktest_Dcovdb.txt&amp;quot;, OpenKind =&amp;gt; WRITE_MODE );  -- dump database&lt;br /&gt;
        Message(&amp;quot;Database written to 'quicktest_Dcovdb.txt' text file.&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        --XYCov.WriteBin; -- writing extensive report for cross would be very long&lt;br /&gt;
        Message(&amp;quot;####### Sensor Matrix Index Coverage Results #######&amp;quot;);&lt;br /&gt;
        DmpRows: for i in 0 to 7 loop               -- sweep rows&lt;br /&gt;
            DmpY: for j in 0 to 7 loop              -- sweep columns&lt;br /&gt;
                bin_2d := XYCov.GetBin(1+i*8+j);    -- get 1 bin data&lt;br /&gt;
                write(buf, bin_2d.Count, FIELD=&amp;gt;6); -- write 6 characters per sensor&lt;br /&gt;
            end loop DmpY;                          -- buffer full now&lt;br /&gt;
            writeline(output, buf);                 -- dump buffer to the console&lt;br /&gt;
        end loop DmpRows;&lt;br /&gt;
        XYCov.WriteCovDb (&amp;quot;quicktest_XYcovdb.txt&amp;quot;, OpenKind =&amp;gt; WRITE_MODE );-- dump database&lt;br /&gt;
        Message(&amp;quot;Database written to 'quicktest_XYcovdb.txt' text file.&amp;quot;);&lt;br /&gt;
        Message(&amp;quot;*** Goodbye! :-) ***&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        wait;                                   -- end of report - halt process&lt;br /&gt;
    end process CollectCv;    &lt;br /&gt;
&lt;br /&gt;
-- This process generates sensor data for the entire matrix on every 64th falling clock edge.&lt;br /&gt;
-- If sensor index values are covered but sensor data is not covered yet, the process increases &lt;br /&gt;
--  SD parameter of Normal distribution to speed up data coverage goal achievement.&lt;br /&gt;
-- Mean value, initial SD and SD increment are controlled by generics and can be changed &lt;br /&gt;
--  from simulator command line without recompilation (-Gname=value).&lt;br /&gt;
  GenSensData : process&lt;br /&gt;
        variable Rsens : RandomPType;           -- object for generating one sensor data&lt;br /&gt;
        variable cnt6b : unsigned(5 downto 0) := (others=&amp;gt;'1');&lt;br /&gt;
        variable DataSD : real := DataSDstart;&lt;br /&gt;
    begin&lt;br /&gt;
        Rsens.InitSeed(Rsens'instance_name);    -- seed sensor data random variable&lt;br /&gt;
		wait for 0 ns;							-- force order of process execution&lt;br /&gt;
        GenSens: while not DCov.IsCovered loop&lt;br /&gt;
            wait until falling_edge(CLK);&lt;br /&gt;
            cnt6b := cnt6b + 1;         -- increment 6-bit counter&lt;br /&gt;
            if cnt6b=0 then             -- generate sensor data every 64th clock&lt;br /&gt;
                if not DCov.IsCovered and DataSDinc/= 0.0 then&lt;br /&gt;
                  -- When data coverage not yet achieved and SD incrementation allowed,&lt;br /&gt;
                  --  print current hole count and increment SD&lt;br /&gt;
                    Message(&amp;quot;  Data coverage holes count is: &amp;quot; &amp;amp; integer'image(DCov.CountCovHoles));&lt;br /&gt;
                    DataSD := DataSD + DataSDinc;&lt;br /&gt;
                    Message(&amp;quot;    Standard Deviation for data generation increased to &amp;quot; &amp;amp; real'image(DataSD));&lt;br /&gt;
                end if;&lt;br /&gt;
                for i in 0 to 7 loop&lt;br /&gt;
                    for j in 0 to 7 loop&lt;br /&gt;
                        sensors.set(i,j, Rsens.Normal(DataMean, DataSD, 1, 255));&lt;br /&gt;
                    end loop;&lt;br /&gt;
                end loop;&lt;br /&gt;
            end if;&lt;br /&gt;
        end loop GenSens;&lt;br /&gt;
        wait;&lt;br /&gt;
    end process GenSensData;&lt;br /&gt;
    &lt;br /&gt;
-- This process generates CLK signal (100MHz, 50%) as long as END_TEST flag is False&lt;br /&gt;
  ClkGen: process&lt;br /&gt;
    begin&lt;br /&gt;
        while not END_TEST loop         -- stop clock when test done&lt;br /&gt;
            CLK &amp;lt;= '0'; wait for 5 ns;&lt;br /&gt;
            CLK &amp;lt;= '1'; wait for 5 ns;&lt;br /&gt;
        end loop;&lt;br /&gt;
        wait;                           -- stop process forever&lt;br /&gt;
    end process ClkGen;&lt;br /&gt;
&lt;br /&gt;
end architecture behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ANA</name></author>	</entry>

	</feed>