<?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=UVM%2FUVM_Cookbook%2FScoreboards</id>
		<title>UVM/UVM Cookbook/Scoreboards - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://simhard.com/wiki/index.php?action=history&amp;feed=atom&amp;title=UVM%2FUVM_Cookbook%2FScoreboards"/>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=UVM/UVM_Cookbook/Scoreboards&amp;action=history"/>
		<updated>2026-04-09T04:52:06Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.21.3</generator>

	<entry>
		<id>http://simhard.com/wiki/index.php?title=UVM/UVM_Cookbook/Scoreboards&amp;diff=4529&amp;oldid=prev</id>
		<title>ANA: /* Comparing transactions out-of-order */</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=UVM/UVM_Cookbook/Scoreboards&amp;diff=4529&amp;oldid=prev"/>
				<updated>2014-07-19T10:21:49Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Comparing transactions out-of-order&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr style='vertical-align: top;'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 10:21, 19 июля 2014&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 79:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 79:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Because of the need to determine if two transactions are a match and should be compared, this example requires transactions to implement an index_id() function that returns a value that is used as a key for the associative array. If an entry with this key already exists in the associative array, it means that a transaction previously arrived from the other stream, and the transactions are compared. If no key exists, then this transaction is added to associative array.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Because of the need to determine if two transactions are a match and should be compared, this example requires transactions to implement an index_id() function that returns a value that is used as a key for the associative array. If an entry with this key already exists in the associative array, it means that a transaction previously arrived from the other stream, and the transactions are compared. If no key exists, then this transaction is added to associative array.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;В связи с необходимостью определения, если две транзакции матч и следует сравнивать, этот пример требует операции для реализации index_id функцию (), которая возвращает значение, которое используется в качестве ключа для ассоциативного массива. Если запись с этим ключом уже существует в ассоциативный массив, то это означает, что транзакция ранее приехал из другой поток, и сделки по сравнению. Если ни одна кнопка не существует, то эта сделка будет добавлен в ассоциативный массив.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This example has an additional feature in that it does not assume that the index_id() values are always unique on a given stream. In the case where multiple outstanding transactions from the same stream have the same index value, they are stored in a queue, and the queue is the value portion of the associative array. When matches from the other stream arrive, they are compared in FIFO order.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This example has an additional feature in that it does not assume that the index_id() values are always unique on a given stream. In the case where multiple outstanding transactions from the same stream have the same index value, they are stored in a queue, and the queue is the value portion of the associative array. When matches from the other stream arrive, they are compared in FIFO order.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Этот пример имеет дополнительную особенность в том, что он не считает, что index_id () значения всегда был уникальным для данного потока. В случае, когда несколько нерешенных транзакции из того же самого потока имеют одинаковое значение индекса, они хранятся в очереди, и очередь это значение, часть ассоциативного массива. Когда результаты от другой поток прибыли, они сравниваются в порядке поступления.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;0&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;0&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>ANA</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php?title=UVM/UVM_Cookbook/Scoreboards&amp;diff=4528&amp;oldid=prev</id>
		<title>ANA: /* Comparing Transactions Assuming In-Order Arrival */</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=UVM/UVM_Cookbook/Scoreboards&amp;diff=4528&amp;oldid=prev"/>
				<updated>2014-07-19T09:58:23Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Comparing Transactions Assuming In-Order Arrival&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr style='vertical-align: top;'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 09:58, 19 июля 2014&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 12:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 12:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;http://uvm-stage.mentor.com//w/images/4/49/InOrderComparator.png [[Файл:InOrderComparator.png|700px|InOrderComparator.png]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;http://uvm-stage.mentor.com//w/images/4/49/InOrderComparator.png [[Файл:InOrderComparator.png|700px|InOrderComparator.png]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;An in-order comparator assumes that matching transactions will appear in the same order from both expected and actual streams. It gets transactions from the expected and actual side and evaluates them.&amp;#160; The transactions will arrive independently, so the evaluation must block until both transactions are present.&amp;#160; In this case, an easy implementation would be to embed two analysis fifos in the comparator and perform the synchronization and evaluation in the run() task. Evaluation can be as simple as calling the transaction's compare() method, or it can be more involved, because for the purposes of evaluating correct behavior, comparison does not necessarily mean equality.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;!-- &lt;/ins&gt;An in-order comparator assumes that matching transactions will appear in the same order from both expected and actual streams. It gets transactions from the expected and actual side and evaluates them.&amp;#160; The transactions will arrive independently, so the evaluation must block until both transactions are present.&amp;#160; In this case, an easy implementation would be to embed two analysis fifos in the comparator and perform the synchronization and evaluation in the run() task. Evaluation can be as simple as calling the transaction's compare() method, or it can be more involved, because for the purposes of evaluating correct behavior, comparison does not necessarily mean equality&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;--&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;In-order компаратор предполагает, что сравниваемые транзакции будут появляться в одном и том же порядке и с ожидаемого и фактического потоков. Компоратор получает транзакции с ожидаемой и фактической стороны и оценивает их. Транзакции прибудут независимо, поэтому оценка должна блокировать, пока обе транзакции не появятся. В этом случае простой реализацией было бы встроить две analysis FIFOs в компаратор и выполнять синхронизацию и оценку в task run(). Оценка может быть простым вызовом метода compare() транзакции, или может быть более сложной, потому что для оценки правильного поведения, сравнение не обязательно означает равенство&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;0&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;0&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 67:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 69:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Comparing transactions out-of-order&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;===&lt;/ins&gt;Comparing transactions out-of-order&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;http://uvm-stage.mentor.com//w/images/5/54/OutOfOrderScoreboard.png [[Файл:OutOfOrderScoreboard.png|509px|OutOfOrderScoreboard.png]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;http://uvm-stage.mentor.com//w/images/5/54/OutOfOrderScoreboard.png [[Файл:OutOfOrderScoreboard.png|509px|OutOfOrderScoreboard.png]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;!-- &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;An out-of-order comparator makes no assumption that matching transactions will appear in the same order from the expected and actual sides. So, unmatched transactions need to be stored until a matching transaction appears on the opposite stream. For most out-of-order comparators, an associative array is used for storage. This example comparator has two input streams arriving through analysis exports. The implementation of the comparator is symmetrical, so the export names do not have any real importance. This example uses embedded fifos to implement the analysis write() functions, but since the transactions are either stored into the associative array or evaluated upon arrival, this example could easily be written using [https://verificationacademy.com/cookbook/AnalysisConnections#Multiple_Transaction_Streams_Without_Synchronization analysis imps] and write() functions.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;An out-of-order comparator makes no assumption that matching transactions will appear in the same order from the expected and actual sides. So, unmatched transactions need to be stored until a matching transaction appears on the opposite stream. For most out-of-order comparators, an associative array is used for storage. This example comparator has two input streams arriving through analysis exports. The implementation of the comparator is symmetrical, so the export names do not have any real importance. This example uses embedded fifos to implement the analysis write() functions, but since the transactions are either stored into the associative array or evaluated upon arrival, this example could easily be written using [https://verificationacademy.com/cookbook/AnalysisConnections#Multiple_Transaction_Streams_Without_Synchronization analysis imps] and write() functions.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;--&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Out-of-order компаратор не делает предположение, что сравниваемые транзакции будут появляться в том же порядке и от ожидаемой и от фактической сторон. Так, несравненные транзакции должны быть сохранены пока подходящая транзакция не появится на другом потоке. Для большинства Out-of-order компараторов для хранения используется ассоциативный массив. В примере компаратор имеет два входных потока, поступающих с analysis exports (порты). Реализация компаратора является симметричной, поэтому имена export`ов не имеют никакого реального значения. Этот пример использует встроенные буферы FIFO для реализации функции анализа write(), но так как транзакции либо хранятся в ассоциативном массиве или оцениваются при поступлении, этот пример может быть легко написан с использованием [https://verificationacademy.com/cookbook/AnalysisConnections#Multiple_Transaction_Streams_Without_Synchronization analysis imps] и функций write().&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Because of the need to determine if two transactions are a match and should be compared, this example requires transactions to implement an index_id() function that returns a value that is used as a key for the associative array. If an entry with this key already exists in the associative array, it means that a transaction previously arrived from the other stream, and the transactions are compared. If no key exists, then this transaction is added to associative array.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Because of the need to determine if two transactions are a match and should be compared, this example requires transactions to implement an index_id() function that returns a value that is used as a key for the associative array. If an entry with this key already exists in the associative array, it means that a transaction previously arrived from the other stream, and the transactions are compared. If no key exists, then this transaction is added to associative array.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>ANA</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php?title=UVM/UVM_Cookbook/Scoreboards&amp;diff=4527&amp;oldid=prev</id>
		<title>ANA: Новая страница: «{{UVM TOC}}  ===   Overview  ===  &lt;div&gt;http://uvm-stage.mentor.com//w/images/7/73/ScoreboardOverview.png Файл:ScoreboardOverview.png|364px|ScoreboardOvervie…»</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=UVM/UVM_Cookbook/Scoreboards&amp;diff=4527&amp;oldid=prev"/>
				<updated>2014-07-19T09:23:44Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «{{UVM TOC}}  ===   Overview  ===  &amp;lt;div&amp;gt;http://uvm-stage.mentor.com//w/images/7/73/ScoreboardOverview.png Файл:ScoreboardOverview.png|364px|ScoreboardOvervie…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{UVM TOC}}&lt;br /&gt;
&lt;br /&gt;
===   Overview  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;http://uvm-stage.mentor.com//w/images/7/73/ScoreboardOverview.png [[Файл:ScoreboardOverview.png|364px|ScoreboardOverview.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
The Scoreboard's job is to determine whether or not the DUT is functioning properly. The scoreboard is usually the most difficult part of the testbench to write, but it can be generalized into two parts: The first step is determining what exactly is the correct functionality. Once the correct functionality is [https://verificationacademy.com/cookbook/Predictors predicted], the scoreboard can then evaluate whether or not the actual results observed on the DUT match the predicted results. The best scoreboard architecture is to separate the prediction task from the evaluation task. This gives you the most flexibility for reuse by allowing for substitution of predictor and evaluation models, and follows the best practice of separation of concerns.&lt;br /&gt;
&lt;br /&gt;
In cases where there is a single stream of predicted transactions and a single stream of actual transactions, the scoreboard can perform the evaluation with a simple comparator. The most common comparators are an in-order and out-of-order comparator.&lt;br /&gt;
&lt;br /&gt;
===   Comparing Transactions Assuming In-Order Arrival  ===&lt;br /&gt;
&lt;br /&gt;
http://uvm-stage.mentor.com//w/images/4/49/InOrderComparator.png [[Файл:InOrderComparator.png|700px|InOrderComparator.png]]&lt;br /&gt;
&lt;br /&gt;
An in-order comparator assumes that matching transactions will appear in the same order from both expected and actual streams. It gets transactions from the expected and actual side and evaluates them.  The transactions will arrive independently, so the evaluation must block until both transactions are present.  In this case, an easy implementation would be to embed two analysis fifos in the comparator and perform the synchronization and evaluation in the run() task. Evaluation can be as simple as calling the transaction's compare() method, or it can be more involved, because for the purposes of evaluating correct behavior, comparison does not necessarily mean equality.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;pre&amp;gt;class comparator_inorder extends uvm_component;&lt;br /&gt;
`uvm_component_utils(comparator_inorder)&lt;br /&gt;
 &lt;br /&gt;
  uvm_analysis_export #(alu_txn) before_export;&lt;br /&gt;
  uvm_analysis_export #(alu_txn) after_export;&lt;br /&gt;
 &lt;br /&gt;
  uvm_tlm_analysis_fifo #(alu_txn) before_fifo, after_fifo;&lt;br /&gt;
  int m_matches, m_mismatches;&lt;br /&gt;
 &lt;br /&gt;
 function new( string name , uvm_component parent) ;&lt;br /&gt;
  super.new( name , parent );&lt;br /&gt;
  m_matches = 0;&lt;br /&gt;
  m_mismatches = 0;&lt;br /&gt;
 endfunction&lt;br /&gt;
 &lt;br /&gt;
 function void build_phase( uvm_phase phase );&lt;br /&gt;
   before_fifo = new(&amp;quot;before_fifo&amp;quot;, this);&lt;br /&gt;
   after_fifo = new(&amp;quot;after_fifo&amp;quot;, this);&lt;br /&gt;
   before_export = new(&amp;quot;before_export&amp;quot;, this);&lt;br /&gt;
   after_export = new(&amp;quot;after_export&amp;quot;, this);&lt;br /&gt;
 endfunction&lt;br /&gt;
 &lt;br /&gt;
 function void connect_phase( uvm_phase phase );&lt;br /&gt;
   before_export.connect(before_fifo.analysis_export);&lt;br /&gt;
   after_export.connect(after_fifo.analysis_export);&lt;br /&gt;
 endfunction&lt;br /&gt;
 &lt;br /&gt;
 task run_phase( uvm_phase phase );&lt;br /&gt;
   string s;&lt;br /&gt;
   alu_txn before_txn, after_txn;&lt;br /&gt;
   forever begin&lt;br /&gt;
     before_fifo.get(before_txn);&lt;br /&gt;
     after_fifo.get(after_txn);&lt;br /&gt;
     if (!before_txn.compare(after_txn)) begin&lt;br /&gt;
       $sformat(s, &amp;quot;%s does not match %s&amp;quot;, before_txn.convert2string(), after_txn.convert2string());&lt;br /&gt;
       uvm_report_error(&amp;quot;Comparator Mismatch&amp;quot;,s);&lt;br /&gt;
       m_mismatches++;&lt;br /&gt;
     end else begin&lt;br /&gt;
       m_matches++;&lt;br /&gt;
     end&lt;br /&gt;
   end&lt;br /&gt;
 endtask&lt;br /&gt;
 &lt;br /&gt;
 function void report_phase( uvm_phase phase );&lt;br /&gt;
  uvm_report_info(&amp;quot;Inorder Comparator&amp;quot;, $sformatf(&amp;quot;Matches:    %0d&amp;quot;, m_matches));&lt;br /&gt;
  uvm_report_info(&amp;quot;Inorder Comparator&amp;quot;, $sformatf(&amp;quot;Mismatches: %0d&amp;quot;, m_mismatches));&lt;br /&gt;
 endfunction&lt;br /&gt;
 &lt;br /&gt;
endclass&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Comparing transactions out-of-order&lt;br /&gt;
&lt;br /&gt;
http://uvm-stage.mentor.com//w/images/5/54/OutOfOrderScoreboard.png [[Файл:OutOfOrderScoreboard.png|509px|OutOfOrderScoreboard.png]]&lt;br /&gt;
&lt;br /&gt;
An out-of-order comparator makes no assumption that matching transactions will appear in the same order from the expected and actual sides. So, unmatched transactions need to be stored until a matching transaction appears on the opposite stream. For most out-of-order comparators, an associative array is used for storage. This example comparator has two input streams arriving through analysis exports. The implementation of the comparator is symmetrical, so the export names do not have any real importance. This example uses embedded fifos to implement the analysis write() functions, but since the transactions are either stored into the associative array or evaluated upon arrival, this example could easily be written using [https://verificationacademy.com/cookbook/AnalysisConnections#Multiple_Transaction_Streams_Without_Synchronization analysis imps] and write() functions.&lt;br /&gt;
&lt;br /&gt;
Because of the need to determine if two transactions are a match and should be compared, this example requires transactions to implement an index_id() function that returns a value that is used as a key for the associative array. If an entry with this key already exists in the associative array, it means that a transaction previously arrived from the other stream, and the transactions are compared. If no key exists, then this transaction is added to associative array.&lt;br /&gt;
&lt;br /&gt;
This example has an additional feature in that it does not assume that the index_id() values are always unique on a given stream. In the case where multiple outstanding transactions from the same stream have the same index value, they are stored in a queue, and the queue is the value portion of the associative array. When matches from the other stream arrive, they are compared in FIFO order.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;pre&amp;gt;class ooo_comparator&lt;br /&gt;
  #(type T = int,&lt;br /&gt;
    type IDX = int)&lt;br /&gt;
   extends uvm_component;&lt;br /&gt;
 &lt;br /&gt;
  typedef ooo_comparator #(T, IDX) this_type;&lt;br /&gt;
  `uvm_component_param_utils(this_type)&lt;br /&gt;
 &lt;br /&gt;
  typedef T q_of_T[$];&lt;br /&gt;
  typedef IDX q_of_IDX[$];&lt;br /&gt;
 &lt;br /&gt;
  uvm_analysis_export #(T) before_axp, after_axp;&lt;br /&gt;
 &lt;br /&gt;
  protected uvm_tlm_analysis_fifo #(T) before_fifo, after_fifo;&lt;br /&gt;
  bit before_queued = 0;&lt;br /&gt;
  bit after_queued = 0;&lt;br /&gt;
 &lt;br /&gt;
  protected int m_matches, m_mismatches;&lt;br /&gt;
 &lt;br /&gt;
  protected q_of_T received_data[IDX];&lt;br /&gt;
  protected int rcv_count[IDX];&lt;br /&gt;
 &lt;br /&gt;
  protected process before_proc = null;&lt;br /&gt;
  protected process after_proc  = null;&lt;br /&gt;
 &lt;br /&gt;
  function new(string name, uvm_component parent);&lt;br /&gt;
    super.new(name, parent);&lt;br /&gt;
  endfunction&lt;br /&gt;
 &lt;br /&gt;
  function void build_phase( uvm_phase phase );&lt;br /&gt;
    before_axp = new(&amp;quot;before_axp&amp;quot;, this);&lt;br /&gt;
    after_axp = new(&amp;quot;after_axp&amp;quot;, this);&lt;br /&gt;
    before_fifo = new(&amp;quot;before&amp;quot;, this);&lt;br /&gt;
    after_fifo = new(&amp;quot;after&amp;quot;, this);&lt;br /&gt;
  endfunction&lt;br /&gt;
 &lt;br /&gt;
  function void connect_phase( uvm_phase phase );&lt;br /&gt;
    before_axp.connect(before_fifo.analysis_export);&lt;br /&gt;
    after_axp.connect(after_fifo.analysis_export);&lt;br /&gt;
  endfunction : connect&lt;br /&gt;
 &lt;br /&gt;
// The component forks two concurrent instantiations of this task&lt;br /&gt;
// Each instantiation monitors an input analysis fifo&lt;br /&gt;
  protected task get_data(ref uvm_tlm_analysis_fifo #(T) txn_fifo, ref process proc, input bit is_before);&lt;br /&gt;
    T txn_data, txn_existing;&lt;br /&gt;
    IDX idx;&lt;br /&gt;
    string rs;&lt;br /&gt;
    q_of_T tmpq;&lt;br /&gt;
    bit need_to_compare;&lt;br /&gt;
    forever begin&lt;br /&gt;
      proc = process::self();&lt;br /&gt;
 &lt;br /&gt;
   // Get the transaction object, block if no transaction available&lt;br /&gt;
      txn_fifo.get(txn_data);&lt;br /&gt;
      idx = txn_data.index_id();&lt;br /&gt;
 &lt;br /&gt;
   // Check to see if there is an existing object to compare&lt;br /&gt;
      need_to_compare = (rcv_count.exists(idx) &amp;amp;&amp;amp;&lt;br /&gt;
                         ((is_before &amp;amp;&amp;amp; rcv_count[idx] &amp;gt; 0) ||&lt;br /&gt;
                         (!is_before &amp;amp;&amp;amp; rcv_count[idx] &amp;lt; 0)));&lt;br /&gt;
      if (need_to_compare) begin&lt;br /&gt;
   // Compare objects using compare() method of transaction&lt;br /&gt;
        tmpq = received_data[idx];&lt;br /&gt;
        txn_existing = tmpq.pop_front();&lt;br /&gt;
        received_data[idx] = tmpq;&lt;br /&gt;
        if (txn_data.compare(txn_existing))&lt;br /&gt;
          m_matches++;&lt;br /&gt;
        else&lt;br /&gt;
          m_mismatches++;&lt;br /&gt;
      end&lt;br /&gt;
      else begin&lt;br /&gt;
      // If no compare happened, add the new entry&lt;br /&gt;
        if (received_data.exists(idx))&lt;br /&gt;
          tmpq = received_data[idx];&lt;br /&gt;
        else&lt;br /&gt;
          tmpq = {};&lt;br /&gt;
        tmpq.push_back(txn_data);&lt;br /&gt;
        received_data[idx] = tmpq;&lt;br /&gt;
      end&lt;br /&gt;
 &lt;br /&gt;
   // Update the index count&lt;br /&gt;
      if (is_before)&lt;br /&gt;
        if (rcv_count.exists(idx)) begin&lt;br /&gt;
          rcv_count[idx]--;&lt;br /&gt;
        end&lt;br /&gt;
        else&lt;br /&gt;
          rcv_count[idx] = -1;&lt;br /&gt;
      else&lt;br /&gt;
        if (rcv_count.exists(idx)) begin&lt;br /&gt;
          rcv_count[idx]++;&lt;br /&gt;
        end&lt;br /&gt;
        else&lt;br /&gt;
          rcv_count[idx] = 1;&lt;br /&gt;
 &lt;br /&gt;
   // If index count is balanced, remove entry from the arrays&lt;br /&gt;
      if (rcv_count[idx] == 0) begin&lt;br /&gt;
        received_data.delete(idx);&lt;br /&gt;
        rcv_count.delete(idx);&lt;br /&gt;
      end&lt;br /&gt;
    end // forever&lt;br /&gt;
  endtask&lt;br /&gt;
 &lt;br /&gt;
  virtual function int get_matches();&lt;br /&gt;
    return m_matches;&lt;br /&gt;
  endfunction : get_matches&lt;br /&gt;
 &lt;br /&gt;
  virtual function int get_mismatches();&lt;br /&gt;
    return m_mismatches;&lt;br /&gt;
  endfunction : get_mismatches&lt;br /&gt;
 &lt;br /&gt;
  virtual function int get_total_missing();&lt;br /&gt;
    int num_missing;&lt;br /&gt;
    foreach (rcv_count[i]) begin&lt;br /&gt;
      num_missing += (rcv_count[i] &amp;lt; 0 ? -rcv_count[i] : rcv_count[i]);&lt;br /&gt;
    end&lt;br /&gt;
    return num_missing;&lt;br /&gt;
  endfunction : get_total_missing&lt;br /&gt;
 &lt;br /&gt;
  virtual function q_of_IDX get_missing_indexes();&lt;br /&gt;
    q_of_IDX rv = rcv_count.find_index() with (item != 0);&lt;br /&gt;
    return rv;&lt;br /&gt;
  endfunction : get_missing_indexes;&lt;br /&gt;
 &lt;br /&gt;
  virtual function int get_missing_index_count(IDX i);&lt;br /&gt;
  // If count is &amp;lt; 0, more &amp;quot;before&amp;quot; txns were received&lt;br /&gt;
  // If count is &amp;gt; 0, more &amp;quot;after&amp;quot; txns were received&lt;br /&gt;
    if (rcv_count.exists(i))&lt;br /&gt;
      return rcv_count[i];&lt;br /&gt;
    else&lt;br /&gt;
      return 0;&lt;br /&gt;
  endfunction : get_missing_index_count;&lt;br /&gt;
 &lt;br /&gt;
  task run_phase( uvm_phase phase );&lt;br /&gt;
    fork&lt;br /&gt;
      get_data(before_fifo, before_proc, 1);&lt;br /&gt;
      get_data(after_fifo, after_proc, 0);&lt;br /&gt;
    join&lt;br /&gt;
  endtask : run_phase&lt;br /&gt;
 &lt;br /&gt;
 virtual function void kill();&lt;br /&gt;
  before_proc.kill();&lt;br /&gt;
  after_proc.kill();&lt;br /&gt;
 endfunction&lt;br /&gt;
 &lt;br /&gt;
endclass : ooo_comparator&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Advanced Scenarios&lt;br /&gt;
&lt;br /&gt;
In more advanced scenarios, there can be multiple predicted and actual transaction streams coming from multiple DUT interfaces. In this case, a simple comparator is insufficient and the implementation of the evaluation portion of the scoreboard is more complex and DUT-specific.&lt;br /&gt;
&lt;br /&gt;
===   Reporting and Recording  ===&lt;br /&gt;
&lt;br /&gt;
The result of the evaluation is a boolean value, which the Scoreboard should use to report and record failures. Usually successful evaluations are not individually reported, but can be recorded for later summary reports.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Файл:Download-tarball.png|40px|Download-tarball.png]]&lt;br /&gt;
| Download a complete working example:&amp;lt;br /&amp;gt;(tarball: [https://verificationacademy.com/cookbook/download?file=/w/images/3/33/Alu_config_Analysis.tgz Alu_config_Analysis.tgz])&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>ANA</name></author>	</entry>

	</feed>