<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.simhard.com/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.simhard.com/wiki/index.php?action=history&amp;feed=atom&amp;title=OVM%2FOVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F%2F%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench</id>
		<title>OVM/OVM методология/Полный Testbench - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.simhard.com/wiki/index.php?action=history&amp;feed=atom&amp;title=OVM%2FOVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F%2F%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench"/>
		<link rel="alternate" type="text/html" href="http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;action=history"/>
		<updated>2026-07-28T07:29:20Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.21.3</generator>

	<entry>
		<id>http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;diff=4120&amp;oldid=prev</id>
		<title>Vidokq в 14:12, 19 марта 2014</title>
		<link rel="alternate" type="text/html" href="http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;diff=4120&amp;oldid=prev"/>
				<updated>2014-03-19T14:12:49Z</updated>
		
		<summary type="html">&lt;p&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;Версия 14:12, 19 марта 2014&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&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;{{OVM TOC}}&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;=Полный тестбенч=&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;/table&gt;</summary>
		<author><name>Vidokq</name></author>	</entry>

	<entry>
		<id>http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;diff=2353&amp;oldid=prev</id>
		<title>Vidokq: /* FPU агент */</title>
		<link rel="alternate" type="text/html" href="http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;diff=2353&amp;oldid=prev"/>
				<updated>2013-03-28T20:27:27Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;FPU агент&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;Версия 20:27, 28 марта 2013&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 122:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 122:&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;Обратите внимание, что нам нужен любой явный путь сообщения между коллекцией покрытия и тестом. Stop_request механизм в OVM автоматически обрабатывает соответствующее уведомление. Тест не будет завершена, пока все компоненты в тестбенче (которые имеют свой enable_stop_interrupt набор бит) не закончат выполнение их stop() методов, или будет превышено время ожидания. И так, только потому, что задача stop() в этом компоненте будет разблокирована, это не означает, что моделирование будет немедленно прекращено. Это лишь означает, что с точки зрения этой коллекции покрытий, можно прекращать моделирование. Может быть, что есть другие компоненты, в которых задача stop() по-прежнему заблокирована по той или или иной причине. Только когда все задачи stop() вернут значения будет начата остановка(перезапуск).&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;Обратите внимание, что нам нужен любой явный путь сообщения между коллекцией покрытия и тестом. Stop_request механизм в OVM автоматически обрабатывает соответствующее уведомление. Тест не будет завершена, пока все компоненты в тестбенче (которые имеют свой enable_stop_interrupt набор бит) не закончат выполнение их stop() методов, или будет превышено время ожидания. И так, только потому, что задача stop() в этом компоненте будет разблокирована, это не означает, что моделирование будет немедленно прекращено. Это лишь означает, что с точки зрения этой коллекции покрытий, можно прекращать моделирование. Может быть, что есть другие компоненты, в которых задача stop() по-прежнему заблокирована по той или или иной причине. Только когда все задачи stop() вернут значения будет начата остановка(перезапуск).&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;==FPU агент==&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;7.3 &lt;/ins&gt;FPU агент==&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;Когда вы проверяете на уровне транзакций модель FPU с RTL, то это необходимо для того, чтобы протокол интерфейса осуществляется в полном объеме и надлежащим образом. Чтобы проиллюстрировать эту задачу проверки, мы используем RTL версии модели FPU написаны на VHDL. Интерфейс FPU прост, что делает его хорошим кандидатом для примера. Рисунок 7-2 показывает распиновку на блок FPU. Она имеет два 32-разрядных входных шин для А и В операндов и 32-битная шина для вывода результата. 2-битная входная шина определяет режим округления, а 3-битный входная шина определяет операцию, которая будет выполнена. Восемь выходных контактов сигнала исключения, по одному на контакт.&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;Когда вы проверяете на уровне транзакций модель FPU с RTL, то это необходимо для того, чтобы протокол интерфейса осуществляется в полном объеме и надлежащим образом. Чтобы проиллюстрировать эту задачу проверки, мы используем RTL версии модели FPU написаны на VHDL. Интерфейс FPU прост, что делает его хорошим кандидатом для примера. Рисунок 7-2 показывает распиновку на блок FPU. Она имеет два 32-разрядных входных шин для А и В операндов и 32-битная шина для вывода результата. 2-битная входная шина определяет режим округления, а 3-битный входная шина определяет операцию, которая будет выполнена. Восемь выходных контактов сигнала исключения, по одному на контакт.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 135:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 135:&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;[[Файл:sc_g_7.3_p3.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;[[Файл:sc_g_7.3_p3.png]]&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;Как и в нашем HFPB агент, агент FPU включает в себя специфичные для протокола коллекции покрытия. Монитор обнаруживает запрос и ответ операций по выводу на уровне интерфейса и собирает их в транзакции fpu_pair, которая включает в себя как запрос и ответ операций встроенный в него. Один из способов настроить агент - настроить его через фабрику для создания экземпляров различных коллекционеров покрытия, в зависимости от того, что вы пытаетесь достичь в вашем тесте. Для агента FPU есть три пути для управления операций на шине: мастер, мастер канала передачи и секвенсор-драйвер комбинации. Мастер и мастер канала передачи используют транзакции объектов, производных от ovm_transaction. Секвенсор-драйвер использует транзакции объектов, производных от ovm_sequence_item. Разница в том, что последовательность элементов содержит дополнительные механизмы, которые позволяют им быть транспортированы через секвенсор для драйвера. Не смотря на то, что содержание последовательности элементов и операций, получено из различных базовых классов, они являются идентичными. В главе 8 обсуждается последовательность и последовательность элементов более тщательно. Эти три компонента для управления операциями FPU являются взаимоисключающими. Хорошие стиль кодинга, диктуют, чтобы интерфейс конфигурации для агента FPU гарантировал, что в нем будет применен один из способов создания (а не оба).&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;&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;==7.4 Табло результатов==&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;&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;The term scoreboard is a generic term for a wide range of component types&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;whose function is to answer does-it-work questions. The essential&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;characteristic of a scoreboard is that it collects data about the operation of the&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;DUT as the simulation proceeds and compares it with a reference of some sort&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;to determine if the DUT is functioning correctly. A scoreboard can be as&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;simple as a trigger that recognizes when a flag is raised or a truth table, as in&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;the simple testbench in Section 1.2.2. Or it can be as complex as a complete&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;reference model of a complete system design.&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;For the FPU design, we embed a scoreboard inside a reference model. The&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;The reference for the FPU contains the transaction-level implementation of&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;the FPU and a scoreboard to compare the data generated by reference with&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;the results from the RTL DUT. Figure 7-4 shows the reference, along with an&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;example design that uses it.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Vidokq</name></author>	</entry>

	<entry>
		<id>http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;diff=2352&amp;oldid=prev</id>
		<title>Vidokq: /* FPU агент */</title>
		<link rel="alternate" type="text/html" href="http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;diff=2352&amp;oldid=prev"/>
				<updated>2013-03-28T19:57:20Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;FPU агент&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;Версия 19:57, 28 марта 2013&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 123:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 123:&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;==FPU агент==&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;==FPU агент==&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;Когда вы проверяете на уровне транзакций модель FPU с RTL, то это необходимо для того, чтобы протокол интерфейса осуществляется в полном объеме и надлежащим образом. Чтобы проиллюстрировать эту задачу проверки, мы используем RTL версии модели FPU написаны на VHDL. Интерфейс FPU прост, что делает его хорошим кандидатом для примера. Рисунок 7-2 показывает распиновку на блок FPU. Она имеет два 32-разрядных входных шин для А и В операндов и 32-битная шина для вывода результата. 2-битная входная шина определяет режим округления, а 3-битный входная шина определяет операцию, которая будет выполнена. Восемь выходных контактов сигнала исключения, по одному на контакт.&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;&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;[[Файл:sc_g_7.3_p1.png]] &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;&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;32-разрядные А и B операнды и 32-разрядных результат являются значения с плавающей точкой и представлены с помощью IEEE 754 стандарт для двоичного представления числа с плавающей точкой. В ниже таблицах кратко приведены функции FPU.&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;&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;[[Файл:sc_g_7.3_p2.png]] &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;&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;FPU управляется start пином. Расчет начинается по следующий переднему фронту тактовой сигнала, когда устанавливается значение на start пине. FPU устанавливает пин готовности вывода результата, если расчет завершен. Устройство содержит конвейер с глубиной 1, поэтому, когда устанавливает контакт ready, это означает, что результат предыдущего расчета доступен на выходах. При использовании FPU в testbenches удобно рассматривать его как протокола для создания драйверов, монитор и так далее, и инкапсулировать их в агентов. В то время как интерфейс для FPU не является протоколом общего назначения, как наш HFPB протокол или другие, такие как USB, PCI, и так далее, то думая о нем в данном случае, нам позволяется создавать многократно используемые компоненты для построения testbenches для FPU или устройств, использующих FPU. Организация агент FPU показано на рисунке 7-3 ниже. Она организована так же, как HFPB агент. Он имеет мастеров и драйвера, которые преобразуют транзакции в контактный уровень активности. Она также имеет шину контактного уровня, монитор, talker, и коллекцию покрытия. Одним из важных отличий является то, что он не slave, поэтому вы не можете действительно использовать агент как отдельная модель шины. Поскольку интерфейс FPU это протокол для доступа к конкретному устройству, а не к шине или протокол связи,то нет никакой проблемы.&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;&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;[[Файл:sc_g_7.3_p3.png]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Vidokq</name></author>	</entry>

	<entry>
		<id>http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;diff=2347&amp;oldid=prev</id>
		<title>Vidokq: /* 7.2 Коллекции покрытия */</title>
		<link rel="alternate" type="text/html" href="http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;diff=2347&amp;oldid=prev"/>
				<updated>2013-03-28T19:40:06Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;7.2 Коллекции покрытия&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;Версия 19:40, 28 марта 2013&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 121:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 121:&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;Обратите внимание, что нам нужен любой явный путь сообщения между коллекцией покрытия и тестом. Stop_request механизм в OVM автоматически обрабатывает соответствующее уведомление. Тест не будет завершена, пока все компоненты в тестбенче (которые имеют свой enable_stop_interrupt набор бит) не закончат выполнение их stop() методов, или будет превышено время ожидания. И так, только потому, что задача stop() в этом компоненте будет разблокирована, это не означает, что моделирование будет немедленно прекращено. Это лишь означает, что с точки зрения этой коллекции покрытий, можно прекращать моделирование. Может быть, что есть другие компоненты, в которых задача stop() по-прежнему заблокирована по той или или иной причине. Только когда все задачи stop() вернут значения будет начата остановка(перезапуск).&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;Обратите внимание, что нам нужен любой явный путь сообщения между коллекцией покрытия и тестом. Stop_request механизм в OVM автоматически обрабатывает соответствующее уведомление. Тест не будет завершена, пока все компоненты в тестбенче (которые имеют свой enable_stop_interrupt набор бит) не закончат выполнение их stop() методов, или будет превышено время ожидания. И так, только потому, что задача stop() в этом компоненте будет разблокирована, это не означает, что моделирование будет немедленно прекращено. Это лишь означает, что с точки зрения этой коллекции покрытий, можно прекращать моделирование. Может быть, что есть другие компоненты, в которых задача stop() по-прежнему заблокирована по той или или иной причине. Только когда все задачи stop() вернут значения будет начата остановка(перезапуск).&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;==FPU агент==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Vidokq</name></author>	</entry>

	<entry>
		<id>http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;diff=2346&amp;oldid=prev</id>
		<title>Vidokq: Новая страница: «=Полный тестбенч=  Чтобы ответить на вопросы does-it-work и are-we-done, нам нужно больше, чем просто …»</title>
		<link rel="alternate" type="text/html" href="http://www.simhard.com/wiki/index.php?title=OVM/OVM_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_Testbench&amp;diff=2346&amp;oldid=prev"/>
				<updated>2013-03-28T19:38:19Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «=Полный тестбенч=  Чтобы ответить на вопросы does-it-work и are-we-done, нам нужно больше, чем просто …»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Полный тестбенч=&lt;br /&gt;
&lt;br /&gt;
Чтобы ответить на вопросы does-it-work и are-we-done, нам нужно больше, чем просто драйвера и мониторы. Мы должны собрать информацию о покрытии для ответа на are-we-done вопрос, нам нужно эталонная модель и механизм сравнения функции эталонной модели, чтобы ответить на вопрос does-it-work, и нам нужны механизм контроля, чтобы перезапускать испытательный стенд в соответствующее время. Наконец, нам нужны адаптеры и коннекторы, чтобы все это соединить вместе.&lt;br /&gt;
&lt;br /&gt;
==Блоки float-point==&lt;br /&gt;
&lt;br /&gt;
Эта и последующие главы иллюстрируют методы построения испытательного стенда для дизайна с использования с плавающей запятой(FPU). Эта конструкция принимает FP операнды и оператор, и вычисляет результат. В данном разделе представлен пример, который использует на уровне транзакций FPU, чтобы проиллюстрировать построение корзины покрытия OVM. На рисунке ниже показана организация примера.&lt;br /&gt;
[[Файл:sc_g_7.0_p1.png]]&lt;br /&gt;
&lt;br /&gt;
Генератор расчетов, CALC, передает рандомизированных арифметические расчеты с FPU в виде запросов к FPU. FPU выполняет расчет и возвращает ответ в транзакции, которая содержит результат вычисления. Tap связывает между собой генератор воздействий и DUT. Роль TAP - формирование запросов и ответов на пары и отправка пар анализируемой компоненте через порта analysis port. На уровне транзакций FPU является простым устройством. Ядро модели является классическим с точки зрения концепции моделирования на уровне транзакций для slave: получение запроса, ее обработка и возвращение ответа.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;verilog&amp;quot;&amp;gt;58 forever begin&lt;br /&gt;
59 get_port.get(req);&lt;br /&gt;
60 rsp = compute(req);&lt;br /&gt;
61 put_port.put(rsp);&lt;br /&gt;
62 end&lt;br /&gt;
63 endtask&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Интерфейс связи с FPU осуществляется через встроенный tlm_transport_channel (см. раздел «Транспорт» на стр. 58). Для упрощения кодирования вызова run(), мы обьявим get_port и put_port для подключения к внутренней стороне транспортного канал slave. Get_port для получения запросов и put_port для возвращения ответов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
23 class fpu_tlm extends ovm_component;&lt;br /&gt;
24&lt;br /&gt;
25 ovm_transport_export #(fpu_request,&lt;br /&gt;
26 fpu_response) transport_export;&lt;br /&gt;
27&lt;br /&gt;
28 local tlm_transport_channel #(fpu_request,&lt;br /&gt;
29 fpu_response) mstr_chan;&lt;br /&gt;
30 local ovm_blocking_get_port #(fpu_request) get_port;&lt;br /&gt;
31 local ovm_blocking_put_port #(fpu_response) put_port;&lt;br /&gt;
44 function void connect();&lt;br /&gt;
45 transport_export.connect(mstr_chan.transport_export);&lt;br /&gt;
46&lt;br /&gt;
get_port.connect(mstr_chan.blocking_get_request_export);&lt;br /&gt;
47&lt;br /&gt;
put_port.connect(mstr_chan.blocking_put_response_export);&lt;br /&gt;
48 endfunction&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сердце вычислений функции этот выбор состояния случай, которое выполняет запрошенную арифметическую операцию.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
75 case(op)&lt;br /&gt;
76 OP_ADD: result = req.a + req.b;&lt;br /&gt;
77 OP_SUB: result = req.a - req.b;&lt;br /&gt;
78 OP_MUL: result = req.a * req.b;&lt;br /&gt;
79 OP_DIV:&lt;br /&gt;
80 if (req.b &amp;lt;= 1.0e-38 &amp;amp;&amp;amp; req.b &amp;gt;= -1.0e-38)&lt;br /&gt;
81 result = _nanf(); // div by zero&lt;br /&gt;
82 else&lt;br /&gt;
83 result = req.a / req.b;&lt;br /&gt;
84 OP_SQR:&lt;br /&gt;
85 if (req.a &amp;lt; 0.0)&lt;br /&gt;
86 result = _nanf();&lt;br /&gt;
87 else&lt;br /&gt;
88 result = req.a ** 0.5; // square root&lt;br /&gt;
89 endcase&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Состояние case переключается при запросе операции, и каждая из ветвей case выполняет определенные вычисления. Состояние DIV сначала проверяет, если делитель равен нулю, поскольку деление на ноль не определено. В RTL версии FPU, деление на нуль, будет вызывать исключение, когда операция деления выбрана и делитель равен нулю. В случае с Квадратным корнем проверяется, если его операнд меньше нуля, так как квадратный корень из отрицательного числа также не определен. В обоих случаях, результат имеет значение NaN, то есть не является числом, которое является IEEE значение с плавающей точкой по стандарту для неопределенных значений. Ключевым фактором конструкции транспортного вентиля TAP является то, что она не потребляет нисколько времени на свое выполнение. То есть, не должно быть цикла дельта задержки между транспортными вызовом в генераторе и транспортным вызовом в slave. Чтобы удовлетворить это требование, мы реализуем блокирование транспортных интерфейса непосредственно с помощью ovm_blocking_transport_imp. Наша реализации transport() перенаправляет запрос на загрузку и ответ обратно на получение. Он также формирует запрос и ответ на пару и отправляет его из порт анализа.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;verilog&amp;quot;&amp;gt;89 task transport(input fpu_request req,&lt;br /&gt;
90 output fpu_response rsp);&lt;br /&gt;
91&lt;br /&gt;
92 fpu_pair pair;&lt;br /&gt;
93&lt;br /&gt;
94 transport_port.transport(req, rsp);&lt;br /&gt;
95 pair = new(req, rsp);&lt;br /&gt;
96 pair_ap.write(pair);&lt;br /&gt;
97&lt;br /&gt;
98 endtask&lt;br /&gt;
file: 07_complete_testbenches/01_tlm_reference/top.sv&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подставляя реализации вместо подключения к каналу, мы можем избежать любых задержек, связанных с перемещением данных через канал.&lt;br /&gt;
&lt;br /&gt;
==7.2 Коллекции покрытия==&lt;br /&gt;
&lt;br /&gt;
Ключевым компонентом в ответе на вопрос are-we-done - вопрос коллекции покрытия. Её роль, как следует из названия, состоит в сборе информации по функционированию во время прогонов моделирования. Покрытие является количественным характеристикой о том, сколько конструкции теста выполнилось. Коллекция покрытия получает информацию о том, что было выполнено и использует ее для вычисления ответа на вопрос are-we-done. Коллекция покрытия строится в OVM как расширение ovm_subscriber абстрактного базового класса. Как вы можете видеть ниже, subscriber имеет реализацию интерфейса анализа, который содержит одну неблокирующую функцию, write().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;verilog&amp;quot;&amp;gt;virtual class ovm_subscriber #(type T = int)&lt;br /&gt;
extends ovm_component;&lt;br /&gt;
typedef ovm_subscriber #(T) this_type;&lt;br /&gt;
ovm_analysis_imp #(T, this_type) analysis_export;&lt;br /&gt;
function new(string name, ovm_component parent);&lt;br /&gt;
super.new(name, parent);&lt;br /&gt;
analysis_export = new( &amp;quot;analysis_imp&amp;quot;, this );&lt;br /&gt;
endfunction&lt;br /&gt;
pure virtual function void write( input T t );&lt;br /&gt;
endclass&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как это абстрактный класс, необходимо расширить(наследовать) ovm_subscriber и определить свою собственную реализацию функции write(), чтобы сохранять покрытия. Ovm_analysis_imp связывает разъем для фактической реализации интерфейса. Мы называем это analysis_export потому, что внешне он выглядит так же, как экспорт, потому что он обеспечивает реализацию вызывающего порта. При расширении ovm_subscriber, вы просто подключить analysis_export в нужный analysis_port, и запустите на выполнение его. В процессе работы функция write() собирает данные из объекта, переданного в качестве аргумента и обрабатывает их. Обработка может быть любого рода, до тех пор, пока она сохраняет неблокирующую семантику. SystemVerilog дает возможность построить covergroup(груп покрытия) для сбора и обработки фактических данных об покрытии. Как правило, write() будет копировать свой ​​вклад сделки в соответствующие поля в переменной класса, который затем оцифровывается в covergroup. В сущности write() выступает в роли абонента, который обеспечивает средства для подключения covergroup с другими компонентами OVM, которые являются источниками данных для анализа.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;verilog&amp;quot;&amp;gt;57 covergroup fpu_cov;&lt;br /&gt;
58 cons_op : coverpoint m_op {bins adds = (OP_ADD [* 2]);&lt;br /&gt;
59 bins subs = (OP_SUB [* 2]);&lt;br /&gt;
60 bins muls = (OP_MUL [* 2]);&lt;br /&gt;
61 bins divs = (OP_DIV [* 2]);&lt;br /&gt;
62 bins sqrs = (OP_SQR [* 2]); }&lt;br /&gt;
63 endgroup&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конечно, реализация covergroups и критерия достижения полноты охвата зависит от конкретного приложения. Особенность covergroup - он используется для иллюстрации концепции. Функция write() имеет три обязанности в нашей коллекции покрытия. Оно копирует данные от транзакции и передает в переменную класса, так что данные видны для covergroup, он вызывает sample() из covergroup, и этим проверяет, был ли достигнут порог полноты покрытия. Вызов sample() дает указания covergroup посмотреть на текущие значения соответствующих переменных покрытия и обновить свои счетчик.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;verilog&amp;quot;&amp;gt;78 function void write(input fpu_pair t);&lt;br /&gt;
79&lt;br /&gt;
80 real coverage;&lt;br /&gt;
81 m_op = t.req.op;&lt;br /&gt;
82 m_round = t.req.round;&lt;br /&gt;
83&lt;br /&gt;
84 fpu_cov.sample();&lt;br /&gt;
85&lt;br /&gt;
86 coverage = fpu_cov.get_inst_coverage();&lt;br /&gt;
87 if(coverage &amp;gt;= coverage_threshold) begin&lt;br /&gt;
88 done = 1;&lt;br /&gt;
89 end&lt;br /&gt;
90&lt;br /&gt;
91 endfunction&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дополнение к подсчету информации по покрытию, коллекция покрытия позволяет тестбенчу закрыться, когда покрытие достигнет порога. Он делает это согласованно с верхним уровнем окружения. Окружение верхнего уровня вызывает global_stop_request () в качестве первого (и единственного) вызова, для задачи run(). Это приводит к вызову функции stop() во всех компонентах, которые имеют enable_stop_interrupt установленным в 1, включая наш коллекцию покрытия. Когда все задачи stop() вернутся, то моделирование останавливается. Наши коллекции покрытий не выключаются по вызову задачи stop(), пока не будет установлено флага, который укажет, что на полное покрытие было достигнуто.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;verilog&amp;quot;&amp;gt;96 task stop(string ph_name);&lt;br /&gt;
97 wait (done == 1);&lt;br /&gt;
98 ovm_report_info(“stop”, “allowing stop”);&lt;br /&gt;
99 endtask&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что нам нужен любой явный путь сообщения между коллекцией покрытия и тестом. Stop_request механизм в OVM автоматически обрабатывает соответствующее уведомление. Тест не будет завершена, пока все компоненты в тестбенче (которые имеют свой enable_stop_interrupt набор бит) не закончат выполнение их stop() методов, или будет превышено время ожидания. И так, только потому, что задача stop() в этом компоненте будет разблокирована, это не означает, что моделирование будет немедленно прекращено. Это лишь означает, что с точки зрения этой коллекции покрытий, можно прекращать моделирование. Может быть, что есть другие компоненты, в которых задача stop() по-прежнему заблокирована по той или или иной причине. Только когда все задачи stop() вернут значения будет начата остановка(перезапуск).&lt;/div&gt;</summary>
		<author><name>Vidokq</name></author>	</entry>

	</feed>