<?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=OVM%2FBasic_OVM%2FSession5_-_Connecting_Components</id>
		<title>OVM/Basic OVM/Session5 - Connecting Components - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://simhard.com/wiki/index.php?action=history&amp;feed=atom&amp;title=OVM%2FBasic_OVM%2FSession5_-_Connecting_Components"/>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session5_-_Connecting_Components&amp;action=history"/>
		<updated>2026-04-23T00:10:32Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.21.3</generator>

	<entry>
		<id>http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session5_-_Connecting_Components&amp;diff=3433&amp;oldid=prev</id>
		<title>Yura в 09:14, 25 ноября 2013</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session5_-_Connecting_Components&amp;diff=3433&amp;oldid=prev"/>
				<updated>2013-11-25T09:14:31Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session5_-_Connecting_Components&amp;amp;diff=3433&amp;amp;oldid=3407&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Yura</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session5_-_Connecting_Components&amp;diff=3407&amp;oldid=prev</id>
		<title>ANA в 15:07, 21 ноября 2013</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session5_-_Connecting_Components&amp;diff=3407&amp;oldid=prev"/>
				<updated>2013-11-21T15:07:45Z</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;Версия 15:07, 21 ноября 2013&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 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;{{OVM TOC}}&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;{{OVM TOC}}&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;[[file:module_basic_ovm_session5_connecting_components_jaynsley.pdf|&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;page1&lt;/del&gt;|600px]]&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;[[file:module_basic_ovm_session5_connecting_components_jaynsley.pdf|&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;page=1&lt;/ins&gt;|600px]]&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;Здравствуйте, я Джон Эйнли&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;/table&gt;</summary>
		<author><name>ANA</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session5_-_Connecting_Components&amp;diff=3399&amp;oldid=prev</id>
		<title>ANA: Новая страница: «{{OVM TOC}}  600px  Здравствуйте, я Джон Эйнли из компан…»</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session5_-_Connecting_Components&amp;diff=3399&amp;oldid=prev"/>
				<updated>2013-11-21T14:53:20Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «{{OVM TOC}}  &lt;a href=&quot;/wiki/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:Module_basic_ovm_session5_connecting_components_jaynsley.pdf&quot; title=&quot;Файл:Module basic ovm session5 connecting components jaynsley.pdf&quot;&gt;600px&lt;/a&gt;  Здравствуйте, я Джон Эйнли из компан…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{OVM TOC}}&lt;br /&gt;
&lt;br /&gt;
[[file:module_basic_ovm_session5_connecting_components_jaynsley.pdf|page1|600px]]&lt;br /&gt;
&lt;br /&gt;
Здравствуйте, я Джон Эйнли&lt;br /&gt;
из компании Дулос.&lt;br /&gt;
&lt;br /&gt;
Это пятое занятие по основам OVM.&lt;br /&gt;
Его тема - соединение компонентов.&lt;br /&gt;
&lt;br /&gt;
Мы познакомимся&lt;br /&gt;
с тем, как создавать&lt;br /&gt;
&lt;br /&gt;
несколько компонентов OVM&lt;br /&gt;
в окружении верификации&lt;br /&gt;
&lt;br /&gt;
и как собирать их воедино.&lt;br /&gt;
Также мы&lt;br /&gt;
&lt;br /&gt;
подробнее рассмотрим&lt;br /&gt;
архитектуру отдельного компонента.&lt;br /&gt;
&lt;br /&gt;
На предыдущем занятии я говорил,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
что типичный компонент OVM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
состоит из контроллера,&lt;br /&gt;
драйвера и монитора.&lt;br /&gt;
&lt;br /&gt;
Идея в том, чтобы использовать компонент&lt;br /&gt;
как стандартный строительный блок&lt;br /&gt;
&lt;br /&gt;
в окружении верификации OVM.&lt;br /&gt;
&lt;br /&gt;
Такая конфигурация компонентов&lt;br /&gt;
называется агентом.&lt;br /&gt;
&lt;br /&gt;
Эта структура не является единственно&lt;br /&gt;
возможной.&lt;br /&gt;
&lt;br /&gt;
Вы не обязаны строить&lt;br /&gt;
окружение верификации&lt;br /&gt;
&lt;br /&gt;
исключительно из агентов с такой&lt;br /&gt;
структурой,&lt;br /&gt;
&lt;br /&gt;
однако это неплохая отправная точка,&lt;br /&gt;
позволяющая обеспечить стандартизацию&lt;br /&gt;
&lt;br /&gt;
и согласованность между компонентами&lt;br /&gt;
верификации из различных источников.&lt;br /&gt;
&lt;br /&gt;
Поэтому при обсуждении создания и&lt;br /&gt;
соединения компонентов будет&lt;br /&gt;
&lt;br /&gt;
разумно использовать описанную структуру&lt;br /&gt;
агентов в качестве примера, отправной точки.&lt;br /&gt;
&lt;br /&gt;
И именно так мы сейчас и поступим.&lt;br /&gt;
&lt;br /&gt;
Я уже неоднократно упоминал компоненты OVM,&lt;br /&gt;
&lt;br /&gt;
и теперь самое время взглянуть на&lt;br /&gt;
формальную иерархию классов OVM.&lt;br /&gt;
&lt;br /&gt;
Здесь мы вступаем на территорию&lt;br /&gt;
объектно-ориентированного программирования.&lt;br /&gt;
&lt;br /&gt;
На слайде представлена диаграмма&lt;br /&gt;
иерархии классов&lt;br /&gt;
&lt;br /&gt;
в обозначениях,&lt;br /&gt;
немного напоминающих язык UML.&lt;br /&gt;
&lt;br /&gt;
Классы, изображенные ниже, расширяют, или&lt;br /&gt;
наследуют тем,&lt;br /&gt;
&lt;br /&gt;
что изображены выше.&lt;br /&gt;
&lt;br /&gt;
Внутри широкой рамки в нижней части&lt;br /&gt;
диаграммы&lt;br /&gt;
&lt;br /&gt;
показаны все виды компонентов OVM.&lt;br /&gt;
&lt;br /&gt;
Они применяются для описания структуры.&lt;br /&gt;
В OVM имеется много классов,&lt;br /&gt;
&lt;br /&gt;
причем все они наследуют единственному&lt;br /&gt;
базовому классу ovm_component, который&lt;br /&gt;
&lt;br /&gt;
в свою очередь является производным от класса&lt;br /&gt;
ovm_report_object, а тот - от класса ovm_object,&lt;br /&gt;
&lt;br /&gt;
с которым мы встречались на&lt;br /&gt;
предыдущем занятии.&lt;br /&gt;
&lt;br /&gt;
В нижней части диаграммы мы видим&lt;br /&gt;
различные компоненты OVM,&lt;br /&gt;
&lt;br /&gt;
в частности ovm_env для уже знакомого&lt;br /&gt;
нам ovm_test,&lt;br /&gt;
&lt;br /&gt;
а также такие компоненты, как&lt;br /&gt;
ovm_agent и ovm_driver.&lt;br /&gt;
&lt;br /&gt;
Позже мы узнаем, что некоторые из компонентов&lt;br /&gt;
полностью взаимозаменяемы&lt;br /&gt;
&lt;br /&gt;
и отличаются только названиями.&lt;br /&gt;
&lt;br /&gt;
Но есть также компоненты с&lt;br /&gt;
уникальными свойствами,&lt;br /&gt;
&lt;br /&gt;
присущими только им.&lt;br /&gt;
&lt;br /&gt;
Во многих случаях у вас есть выбор.&lt;br /&gt;
&lt;br /&gt;
Например, можно воспользоваться как&lt;br /&gt;
ovm_env, так и ovm component.&lt;br /&gt;
&lt;br /&gt;
А это означает, что выбор того или иного&lt;br /&gt;
компонента OVM -&lt;br /&gt;
&lt;br /&gt;
вопрос стиля кодирования и единообразия,&lt;br /&gt;
а не технической необходимости.&lt;br /&gt;
&lt;br /&gt;
Тем не менее,&lt;br /&gt;
на данном занятии&lt;br /&gt;
&lt;br /&gt;
я буду выбирать подходящий тип компонента&lt;br /&gt;
&lt;br /&gt;
исходя из той роли, которую он играет.&lt;br /&gt;
&lt;br /&gt;
Стало быть, в данном случае&lt;br /&gt;
мы возьмем компонент ovm_agent.&lt;br /&gt;
&lt;br /&gt;
Итак, создадим определенный пользователем&lt;br /&gt;
компонент верификации,&lt;br /&gt;
&lt;br /&gt;
расширив базовый класс&lt;br /&gt;
ovm_agent.&lt;br /&gt;
&lt;br /&gt;
Однако подчеркну еще раз: я мог бы расширить&lt;br /&gt;
ovm_component,&lt;br /&gt;
&lt;br /&gt;
или даже ovm_monitor или ovm_env, и&lt;br /&gt;
в данном случае получился бы&lt;br /&gt;
&lt;br /&gt;
точно такой же результат.&lt;br /&gt;
&lt;br /&gt;
Итак, в строке 2 мы регистрируем&lt;br /&gt;
my_agent как ovm_component.&lt;br /&gt;
&lt;br /&gt;
Это стандартный код, который следует&lt;br /&gt;
включать обязательно.&lt;br /&gt;
&lt;br /&gt;
Впоследствии агент будет создавать&lt;br /&gt;
экземпляры контроллера и драйвера,&lt;br /&gt;
&lt;br /&gt;
поэтому мы объявляем в классе два описателя:&lt;br /&gt;
my_sequencer_h и&lt;br /&gt;
&lt;br /&gt;
my_driver_h.&lt;br /&gt;
&lt;br /&gt;
Далее следует метод new,&lt;br /&gt;
конструктор класса,&lt;br /&gt;
&lt;br /&gt;
и стандартные методы,&lt;br /&gt;
build и connect.&lt;br /&gt;
&lt;br /&gt;
С методом build мы уже встречались ранее,&lt;br /&gt;
а метод connect для нас внове.&lt;br /&gt;
&lt;br /&gt;
Он служит для соединения&lt;br /&gt;
дочерних компонентов,&lt;br /&gt;
&lt;br /&gt;
и чуть позже я подробнее объясню,&lt;br /&gt;
как он работает.&lt;br /&gt;
&lt;br /&gt;
Однако начнем с расширения метода build.&lt;br /&gt;
&lt;br /&gt;
Сначала метод build, как обычно, вызывает&lt;br /&gt;
метод базового класса super.build,&lt;br /&gt;
&lt;br /&gt;
а затем создает экземпляры&lt;br /&gt;
контроллера и драйвера,&lt;br /&gt;
&lt;br /&gt;
с помощью волшебного заклинания&lt;br /&gt;
type_id::create.&lt;br /&gt;
&lt;br /&gt;
Передаваемые методу create аргументы&lt;br /&gt;
очень важны.&lt;br /&gt;
&lt;br /&gt;
Первый аргумент, как и раньше, это&lt;br /&gt;
имя экземпляра,&lt;br /&gt;
&lt;br /&gt;
которое должно совпадать с&lt;br /&gt;
именем переменной.&lt;br /&gt;
&lt;br /&gt;
Второй аргумент – родитель, мы всегда будем&lt;br /&gt;
использовать в этом качестве &amp;quot;this&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
встроенную в SystemVerilog переменную, которая&lt;br /&gt;
обозначает текущий объект,&lt;br /&gt;
&lt;br /&gt;
с которым мы работаем.&lt;br /&gt;
&lt;br /&gt;
В объектно-ориентированной терминологии метод&lt;br /&gt;
create называется фабричным. Фабричные методы -&lt;br /&gt;
&lt;br /&gt;
это один из так называемых паттернов&lt;br /&gt;
объектно-ориентированного программирования,&lt;br /&gt;
&lt;br /&gt;
то есть заведомо хороших способов решить&lt;br /&gt;
определенную задачу.&lt;br /&gt;
&lt;br /&gt;
Конкретно, фабричный метод позволяет&lt;br /&gt;
создать объект&lt;br /&gt;
&lt;br /&gt;
и в то же время переопределить тип объекта,&lt;br /&gt;
&lt;br /&gt;
создаваемого где-то в другом месте.&lt;br /&gt;
&lt;br /&gt;
На первый взгляд кажется, что&lt;br /&gt;
здесь мы создаем&lt;br /&gt;
&lt;br /&gt;
объекты типа my_sequencer&lt;br /&gt;
и my_driver,&lt;br /&gt;
&lt;br /&gt;
и по умолчанию так оно и есть.&lt;br /&gt;
&lt;br /&gt;
Однако имеется возможность переопределить&lt;br /&gt;
типы компонентов, создаваемых&lt;br /&gt;
&lt;br /&gt;
этими фабричными методами.&lt;br /&gt;
&lt;br /&gt;
Так, в каком-то конкретном тесте,&lt;br /&gt;
не изменяя исходный код&lt;br /&gt;
&lt;br /&gt;
данного конкретного агента ни на йоту,&lt;br /&gt;
&lt;br /&gt;
мы могли бы переопределить поведение&lt;br /&gt;
фабричных методов,&lt;br /&gt;
&lt;br /&gt;
заставив их создавать иные компоненты,&lt;br /&gt;
последовательности или драйверы.&lt;br /&gt;
&lt;br /&gt;
С помощью этого механизма&lt;br /&gt;
мы можем настраивать поведение&lt;br /&gt;
&lt;br /&gt;
того или иного компонента верификации&lt;br /&gt;
в конкретном тесте:&lt;br /&gt;
&lt;br /&gt;
А. не изменяя ни единой строки&lt;br /&gt;
кода&lt;br /&gt;
&lt;br /&gt;
и Б. не заставляя автора&lt;br /&gt;
компонента верификации&lt;br /&gt;
&lt;br /&gt;
предвидеть все возможные модификации.&lt;br /&gt;
Ему достаточно просто&lt;br /&gt;
&lt;br /&gt;
воспользоваться фабричным методом.&lt;br /&gt;
&lt;br /&gt;
Так что это весьма полезный механизм.&lt;br /&gt;
&lt;br /&gt;
Мы рассмотрели метод build,&lt;br /&gt;
применяемый для конструирования&lt;br /&gt;
&lt;br /&gt;
компонентов в&lt;br /&gt;
окружении верификации.&lt;br /&gt;
&lt;br /&gt;
Далее идет метод connect,&lt;br /&gt;
&lt;br /&gt;
который служит для соединения компонентов&lt;br /&gt;
более низкого уровня между собой.&lt;br /&gt;
&lt;br /&gt;
В данном случае соединяются&lt;br /&gt;
драйвер и контроллер.&lt;br /&gt;
&lt;br /&gt;
Как видите, метод connect агента&lt;br /&gt;
вызывает метод connect драйвера,&lt;br /&gt;
&lt;br /&gt;
чтобы соединить оба&lt;br /&gt;
компонента нижнего уровня.&lt;br /&gt;
&lt;br /&gt;
Сам код соединения – это&lt;br /&gt;
обычный исполняемый код.&lt;br /&gt;
&lt;br /&gt;
Технически его можно было бы&lt;br /&gt;
включить в метод build,&lt;br /&gt;
&lt;br /&gt;
и все работало бы точно так же.&lt;br /&gt;
&lt;br /&gt;
Однако стилистически правильнее и&lt;br /&gt;
настоятельно рекомендуется&lt;br /&gt;
&lt;br /&gt;
размещать код соединения&lt;br /&gt;
компонентов нижнего уровня&lt;br /&gt;
&lt;br /&gt;
в теле метода connect,&lt;br /&gt;
хотя бы из соображений единообразия.&lt;br /&gt;
&lt;br /&gt;
Взглянув на код метода connect&lt;br /&gt;
более пристально,&lt;br /&gt;
&lt;br /&gt;
вы увидите ссылки на два&lt;br /&gt;
выделенных жирным шрифтом компонента:&lt;br /&gt;
&lt;br /&gt;
sequence_item_port и&lt;br /&gt;
sequence_item_export.&lt;br /&gt;
&lt;br /&gt;
Понятия порта и экспортера - выходцы из мира&lt;br /&gt;
моделирования на уровне транзакций.&lt;br /&gt;
&lt;br /&gt;
Они заимствованы из стандарта&lt;br /&gt;
System C TLM.&lt;br /&gt;
&lt;br /&gt;
В данном контексте можно считать, что&lt;br /&gt;
порты и экспортеры – это просто описатели&lt;br /&gt;
&lt;br /&gt;
дочерних компонентов, необходимые для того,&lt;br /&gt;
чтобы их можно было связать.&lt;br /&gt;
&lt;br /&gt;
Итак, чтобы связать&lt;br /&gt;
драйвер с контроллером,&lt;br /&gt;
&lt;br /&gt;
мы берем описатель драйвера,&lt;br /&gt;
sequence_item_port,&lt;br /&gt;
&lt;br /&gt;
описатель контроллера,&lt;br /&gt;
sequence_item_export,&lt;br /&gt;
&lt;br /&gt;
и соединяем их,&lt;br /&gt;
устанавливая соединение&lt;br /&gt;
&lt;br /&gt;
между контролем и драйвером.&lt;br /&gt;
&lt;br /&gt;
Можете считать, что эти&lt;br /&gt;
порты уровня транзакций&lt;br /&gt;
&lt;br /&gt;
- своеобразные вариации на тему портов&lt;br /&gt;
в системах Verilog или VHDL.&lt;br /&gt;
&lt;br /&gt;
На самом деле, они не полностью эквивалентны&lt;br /&gt;
портам VHDL или Verilog,&lt;br /&gt;
&lt;br /&gt;
но, если смотреть с высоты птичьего полета,&lt;br /&gt;
то выполняют они ту же функцию&lt;br /&gt;
&lt;br /&gt;
соединения между собой деталей&lt;br /&gt;
внутреннего устройства отдельных компонентов.&lt;br /&gt;
&lt;br /&gt;
Итак, я познакомил вас с методами&lt;br /&gt;
build и connect,&lt;br /&gt;
&lt;br /&gt;
которые в OVM называются&lt;br /&gt;
фазовыми методами.&lt;br /&gt;
&lt;br /&gt;
А теперь я опишу сами фазы OVM&lt;br /&gt;
более формально.&lt;br /&gt;
&lt;br /&gt;
Идея в том, что каждый компонент&lt;br /&gt;
в иерархии верификации&lt;br /&gt;
&lt;br /&gt;
должен сконструировать свои&lt;br /&gt;
дочерние компоненты&lt;br /&gt;
&lt;br /&gt;
и должен обладать неким основным поведением,&lt;br /&gt;
выполняемым в ходе моделирования.&lt;br /&gt;
&lt;br /&gt;
Кроме того, он может выполнять какие-то&lt;br /&gt;
служебные функции: открывать файлы,&lt;br /&gt;
&lt;br /&gt;
выводить результаты и так далее.&lt;br /&gt;
&lt;br /&gt;
Поэтому действия всех компонентов верификации&lt;br /&gt;
в процессе моделирования&lt;br /&gt;
&lt;br /&gt;
необходимо координировать.&lt;br /&gt;
&lt;br /&gt;
Именно для этого и предназначены&lt;br /&gt;
стандартные фазы OVM.&lt;br /&gt;
&lt;br /&gt;
Каждый компонент выполняет&lt;br /&gt;
стандартный набор фаз.&lt;br /&gt;
&lt;br /&gt;
Этот механизм позволяет координировать&lt;br /&gt;
&lt;br /&gt;
поведение всех компонентов, входящих в&lt;br /&gt;
иерархию верификации.&lt;br /&gt;
&lt;br /&gt;
Давайте рассмотрим пример.&lt;br /&gt;
&lt;br /&gt;
Мы создадим&lt;br /&gt;
пользовательский класс my_component,&lt;br /&gt;
&lt;br /&gt;
расширяющий базовый класс ovm_component.&lt;br /&gt;
&lt;br /&gt;
Как вы, наверное, помните, класс ovm_component&lt;br /&gt;
является базовым&lt;br /&gt;
&lt;br /&gt;
для целого семейства различных&lt;br /&gt;
классов компонентов. Обычно&lt;br /&gt;
&lt;br /&gt;
выбирается какой-то конкретный класс, скажем&lt;br /&gt;
ovm_agent, ovm_driver или ovm_monitor,&lt;br /&gt;
&lt;br /&gt;
который отражает ваше намерение.&lt;br /&gt;
Но технически вполне допустимо&lt;br /&gt;
&lt;br /&gt;
создавать пользовательский класс,&lt;br /&gt;
расширяя ovm_component.&lt;br /&gt;
&lt;br /&gt;
В данном примере мы так и поступим.&lt;br /&gt;
&lt;br /&gt;
Кое-что из показанного в этом примере мы&lt;br /&gt;
уже видели раньше. Начинаем с метода new.&lt;br /&gt;
&lt;br /&gt;
Метод new, строго говоря, не является&lt;br /&gt;
фазой,&lt;br /&gt;
&lt;br /&gt;
это просто конструктор, часть&lt;br /&gt;
языка SystemVerilog.&lt;br /&gt;
&lt;br /&gt;
Но для удобства можете считать,&lt;br /&gt;
что это фаза 0.&lt;br /&gt;
&lt;br /&gt;
Как правило, в OVM метод new не должен делать&lt;br /&gt;
&lt;br /&gt;
ничего, кроме вызова метода new базового&lt;br /&gt;
класса.&lt;br /&gt;
&lt;br /&gt;
Далее идет метод build, который мы начали&lt;br /&gt;
писать ранее. Он создает&lt;br /&gt;
&lt;br /&gt;
дочерние компоненты.&lt;br /&gt;
&lt;br /&gt;
Как я уже отмечал, методы new и build должны&lt;br /&gt;
вызывать соответственно методы new и build&lt;br /&gt;
&lt;br /&gt;
базового класса.&lt;br /&gt;
&lt;br /&gt;
Таким образом, оба метода new и build&lt;br /&gt;
вызываются в порядке строго сверху вниз,&lt;br /&gt;
&lt;br /&gt;
то есть начиная с уровня окружения&lt;br /&gt;
верификации вглубь.&lt;br /&gt;
&lt;br /&gt;
Пока вы еще не освоились с OVM более&lt;br /&gt;
основательно,&lt;br /&gt;
&lt;br /&gt;
очень важно помнить, что компоненты&lt;br /&gt;
&lt;br /&gt;
в окружении верификации строятся&lt;br /&gt;
сверху вниз.&lt;br /&gt;
&lt;br /&gt;
Напротив, все остальные фазовые методы&lt;br /&gt;
вызываются снизу вверх.&lt;br /&gt;
&lt;br /&gt;
Следующей стандартной фазой (необязательной)&lt;br /&gt;
является фаза соединения,&lt;br /&gt;
&lt;br /&gt;
на которой соединяются порты и экспортеры&lt;br /&gt;
дочерних компонентов,&lt;br /&gt;
&lt;br /&gt;
а точнее&lt;br /&gt;
их виртуальные интерфейсы.&lt;br /&gt;
&lt;br /&gt;
Методы connect вызываются снизу вверх,&lt;br /&gt;
&lt;br /&gt;
начиная с компонентов верификации&lt;br /&gt;
самого нижнего уровня.&lt;br /&gt;
&lt;br /&gt;
Затем идет стандартная фаза start_of_simulation,&lt;br /&gt;
&lt;br /&gt;
которая,&lt;br /&gt;
&lt;br /&gt;
как следует из названия,&lt;br /&gt;
вызывается в начале моделирования.&lt;br /&gt;
&lt;br /&gt;
Название этой фазы&lt;br /&gt;
заимствовано&lt;br /&gt;
&lt;br /&gt;
из системы System C.&lt;br /&gt;
&lt;br /&gt;
В System C имеется аналогичный обратный вызов,&lt;br /&gt;
выполняемый в начале моделирования,&lt;br /&gt;
&lt;br /&gt;
и называется он точно так же:&lt;br /&gt;
start_of_simulation.&lt;br /&gt;
&lt;br /&gt;
Обычно на этой фазе производятся такие&lt;br /&gt;
служебные операции,&lt;br /&gt;
&lt;br /&gt;
как открытие файлов для чтения или&lt;br /&gt;
записи в процессе моделирования.&lt;br /&gt;
&lt;br /&gt;
Затем начинается само моделирование, оно&lt;br /&gt;
выполняется на фазе run,&lt;br /&gt;
&lt;br /&gt;
и, как мы видели раньше,&lt;br /&gt;
run - это единственная задача.&lt;br /&gt;
&lt;br /&gt;
В Verilog задача, конечно, может&lt;br /&gt;
быть продолжительной,&lt;br /&gt;
&lt;br /&gt;
выполнять обработчики событий,&lt;br /&gt;
расходуя на это модельное время.&lt;br /&gt;
&lt;br /&gt;
За фазой run&lt;br /&gt;
&lt;br /&gt;
следуют еще две фазы, предназначенные&lt;br /&gt;
для выполнения&lt;br /&gt;
&lt;br /&gt;
служебных операций в самом&lt;br /&gt;
конце моделирования.&lt;br /&gt;
&lt;br /&gt;
На слайде показана фаза report,&lt;br /&gt;
&lt;br /&gt;
на которой можно вывести отчет о результатах&lt;br /&gt;
&lt;br /&gt;
после того как собственно моделирование&lt;br /&gt;
завершилось.&lt;br /&gt;
&lt;br /&gt;
Таким образом, фазовые методы позволяют&lt;br /&gt;
координировать и синхронизировать&lt;br /&gt;
&lt;br /&gt;
действия разнообразных компонентов,&lt;br /&gt;
находящихся на разных уровнях&lt;br /&gt;
&lt;br /&gt;
иерархии верификации.&lt;br /&gt;
&lt;br /&gt;
Резюмируем все, что мы узнали об&lt;br /&gt;
анатомии компонента OVM.&lt;br /&gt;
&lt;br /&gt;
Компания Mentor настоятельно рекомендует&lt;br /&gt;
при написании компонента OVM&lt;br /&gt;
&lt;br /&gt;
располагать его элементы в порядке,&lt;br /&gt;
показанном на данном слайде.&lt;br /&gt;
&lt;br /&gt;
Так, во второй строке мы всегда&lt;br /&gt;
регистрируем компонент&lt;br /&gt;
&lt;br /&gt;
в библиотеке классов OVM.&lt;br /&gt;
Затем объявляются все внешние интерфейсы,&lt;br /&gt;
&lt;br /&gt;
включая как&lt;br /&gt;
виртуальные интерфейсы,&lt;br /&gt;
&lt;br /&gt;
так и порты и экспортеры, если их&lt;br /&gt;
необходимо объявить явно.&lt;br /&gt;
&lt;br /&gt;
Далее идут объявления&lt;br /&gt;
описателей внутренних компонентов,&lt;br /&gt;
&lt;br /&gt;
в данном случае контроллера и драйвера.&lt;br /&gt;
&lt;br /&gt;
И потом все стандартные фазовые методы&lt;br /&gt;
в надлежащем порядке:&lt;br /&gt;
&lt;br /&gt;
сначала конструктор, за ним&lt;br /&gt;
собственно фазы,&lt;br /&gt;
&lt;br /&gt;
build, connect и так далее.&lt;br /&gt;
&lt;br /&gt;
Итак, на этом занятии&lt;br /&gt;
я объяснил, как создавать&lt;br /&gt;
&lt;br /&gt;
экземпляры нескольких компонентов&lt;br /&gt;
в иерархии верификации.&lt;br /&gt;
&lt;br /&gt;
Мы видели, что использование фабричных&lt;br /&gt;
методов позволяет создавать&lt;br /&gt;
&lt;br /&gt;
компоненты так, чтобы в отдельных тестах&lt;br /&gt;
один компонент можно было подменить другим.&lt;br /&gt;
&lt;br /&gt;
Мы видели, что стандартные фазы&lt;br /&gt;
используются для координации&lt;br /&gt;
&lt;br /&gt;
действий нескольких компонентов.&lt;br /&gt;
&lt;br /&gt;
А также что OVM предписывает способ&lt;br /&gt;
структурирования&lt;br /&gt;
&lt;br /&gt;
компонентов верификации&lt;br /&gt;
&lt;br /&gt;
с тем, чтобы повысить степень их&lt;br /&gt;
повторного использования,&lt;br /&gt;
&lt;br /&gt;
а также поддержать единый&lt;br /&gt;
стиль кодирования.&lt;br /&gt;
&lt;br /&gt;
Мы познакомились с типичной структурой:&lt;br /&gt;
имеется так называемый агент,&lt;br /&gt;
&lt;br /&gt;
который состоит из контроллера,&lt;br /&gt;
драйвера и монитора,&lt;br /&gt;
&lt;br /&gt;
а окружение верификации обычно содержит&lt;br /&gt;
несколько агентов.&lt;br /&gt;
&lt;br /&gt;
Как правило, один агент представляет один&lt;br /&gt;
коммуникационный канал, шину или порт&lt;br /&gt;
&lt;br /&gt;
в тестируемом устройстве.&lt;br /&gt;
&lt;br /&gt;
Например, если в тестируемом устройстве&lt;br /&gt;
имеется шина Amber,&lt;br /&gt;
&lt;br /&gt;
то в качестве ее формирователя мог бы&lt;br /&gt;
выступать агент Amber.&lt;br /&gt;
&lt;br /&gt;
Если имеется USB-соединение, то для USB-порта&lt;br /&gt;
заводится отдельный агент. И так далее.&lt;br /&gt;
&lt;br /&gt;
Окружение верификации, как правило, содержит&lt;br /&gt;
несколько агентов,&lt;br /&gt;
&lt;br /&gt;
по одному для каждого из основных интерфейсов&lt;br /&gt;
тестируемого устройства.&lt;br /&gt;
&lt;br /&gt;
А, помимо них, существуют другие компоненты&lt;br /&gt;
верификации, задача которых -&lt;br /&gt;
&lt;br /&gt;
координировать и суммировать действия&lt;br /&gt;
всех агентов.&lt;/div&gt;</summary>
		<author><name>ANA</name></author>	</entry>

	</feed>