<?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%2FSession6_-_Introducing_Transactions</id>
		<title>OVM/Basic OVM/Session6 - Introducing Transactions - История изменений</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%2FSession6_-_Introducing_Transactions"/>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session6_-_Introducing_Transactions&amp;action=history"/>
		<updated>2026-07-05T13:12:26Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.21.3</generator>

	<entry>
		<id>http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session6_-_Introducing_Transactions&amp;diff=3436&amp;oldid=prev</id>
		<title>Yura в 09:49, 25 ноября 2013</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session6_-_Introducing_Transactions&amp;diff=3436&amp;oldid=prev"/>
				<updated>2013-11-25T09:49:31Z</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;Версия 09:49, 25 ноября 2013&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 236:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 236:&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;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 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;[[file:module_basic_ovm_session6_introducing_transactions_jaynsley.pdf|page=22|600px]]&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 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;Этот конкретный драйвер взаимодействует с RTL-кодом,&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;Этот конкретный драйвер взаимодействует с RTL-кодом,&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;div&gt;тестируемого устройства. Это делается в предложении @(posedge dut_vi.clock).&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;тестируемого устройства. Это делается в предложении @(posedge dut_vi.clock).&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_session6_introducing_transactions_jaynsley.pdf|page=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;22&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_session6_introducing_transactions_jaynsley.pdf|page=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;23&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;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 249:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 252:&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;[[file:module_basic_ovm_session6_introducing_transactions_jaynsley.pdf|page=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;23&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_session6_introducing_transactions_jaynsley.pdf|page=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;24&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;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;[[file:module_basic_ovm_session6_introducing_transactions_jaynsley.pdf|page=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;24&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_session6_introducing_transactions_jaynsley.pdf|page=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;25&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;И наконец, потребив все четыре транзакции, драйвер может вызвать метод stop_request,&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,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 260:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 263:&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;сигналы на входы тестируемого устройства. &amp;#160;&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;сигналы на входы тестируемого устройства. &amp;#160;&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_session6_introducing_transactions_jaynsley.pdf|page=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;25&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_session6_introducing_transactions_jaynsley.pdf|page=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;26&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>Yura</name></author>	</entry>

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

	<entry>
		<id>http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session6_-_Introducing_Transactions&amp;diff=3408&amp;oldid=prev</id>
		<title>ANA в 15:08, 21 ноября 2013</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session6_-_Introducing_Transactions&amp;diff=3408&amp;oldid=prev"/>
				<updated>2013-11-21T15:08:03Z</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:08, 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_session6_introducing_transactions_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_session6_introducing_transactions_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;/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>ANA</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php?title=OVM/Basic_OVM/Session6_-_Introducing_Transactions&amp;diff=3400&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/Session6_-_Introducing_Transactions&amp;diff=3400&amp;oldid=prev"/>
				<updated>2013-11-21T14:53:53Z</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_session6_introducing_transactions_jaynsley.pdf&quot; title=&quot;Файл:Module basic ovm session6 introducing transactions 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_session6_introducing_transactions_jaynsley.pdf|page1|600px]]&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;
писать транзакции в 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;
Драйвер должен подавать сигналы&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;
занимает иерархия классов OVM,&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;
ovm_transaction. Последовательность,&lt;br /&gt;
&lt;br /&gt;
строго говоря, представляется&lt;br /&gt;
классом, производным от ovm_sequence_item.&lt;br /&gt;
&lt;br /&gt;
Таким образом, класс ovm_sequence расширяет&lt;br /&gt;
ovm_sequence_item, который&lt;br /&gt;
&lt;br /&gt;
в свою очередь расширяет ovm_transaction,&lt;br /&gt;
ну а тот расширяет ovm_object.&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;
my_transaction,&lt;br /&gt;
&lt;br /&gt;
расширяющий ovm_sequence_item.&lt;br /&gt;
&lt;br /&gt;
Отметим, что мы расширяем класс&lt;br /&gt;
ovm_sequence_item,&lt;br /&gt;
&lt;br /&gt;
а не ovm_transaction,&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_sequence_item&lt;br /&gt;
вместо ovm_transaction&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_sequence_item.&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_object_utils, а не ovm_component_utils.&lt;br /&gt;
&lt;br /&gt;
Мы встречались с двумя стандартными макросами&lt;br /&gt;
для регистрации классов:&lt;br /&gt;
&lt;br /&gt;
ovm_component_utils&lt;br /&gt;
и ovm_object_utils.&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;
предшествует ключевое слово rand.&lt;br /&gt;
&lt;br /&gt;
В языке SystemVerilog слово rand&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;
ограничений SystemVerilog.&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_transaction по умолчанию,&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;
адрес лежит в диапазоне от 0 до 256,&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;
У любого класса в языке SystemVerilog&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_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;
аргумент, parent.&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;
ovm_sequencer - еще один базовый класс из&lt;br /&gt;
библиотеки OVM.&lt;br /&gt;
&lt;br /&gt;
ovm_sequencer - это пример параметризованного&lt;br /&gt;
класса в SystemVerilog.&lt;br /&gt;
&lt;br /&gt;
Для тех, кто знаком с объектно-ориентированным&lt;br /&gt;
программированием,&lt;br /&gt;
&lt;br /&gt;
скажу, что параметризованные классы в&lt;br /&gt;
SystemVerilog похожи на шаблоны классов в C++.&lt;br /&gt;
&lt;br /&gt;
Параметризованный класс позволяет&lt;br /&gt;
модифицировать некоторые свойства класса&lt;br /&gt;
&lt;br /&gt;
SystemVerilog в момент его создания.&lt;br /&gt;
&lt;br /&gt;
В данном случае при инстанцировании&lt;br /&gt;
класса ovm_sequencer&lt;br /&gt;
&lt;br /&gt;
мы задаем вид транзакции, генерируемой&lt;br /&gt;
этим контроллером.&lt;br /&gt;
&lt;br /&gt;
Таким образом, класс my_sequencer расширяет&lt;br /&gt;
ovm_sequencer с целью генерировать транзакции&lt;br /&gt;
&lt;br /&gt;
типа my_transaction.&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_component_utils&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;
ovm_sequencer с буквой r в конце.&lt;br /&gt;
&lt;br /&gt;
А теперь мы встречаем класс ovm_sequence.&lt;br /&gt;
&lt;br /&gt;
Напомним, что контроллер (sequencer) - это&lt;br /&gt;
компонент, структурный элемент, принадлежащий&lt;br /&gt;
&lt;br /&gt;
иерархии компонентов.&lt;br /&gt;
&lt;br /&gt;
С другой стороны, последовательность (sequence)&lt;br /&gt;
- это класс, расширяющий ovm_transaction.&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_sequence.&lt;br /&gt;
&lt;br /&gt;
Она расширяет базовый класс ovm_sequence -&lt;br /&gt;
еще один пример параметризованного класса.&lt;br /&gt;
&lt;br /&gt;
Он параметризуется типом транзакций, из&lt;br /&gt;
которых составлена последовательность.&lt;br /&gt;
&lt;br /&gt;
Последовательность ovm_sequence всегда&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_object_utils.&lt;br /&gt;
&lt;br /&gt;
У последовательности имеется стандартный&lt;br /&gt;
конструктор.&lt;br /&gt;
&lt;br /&gt;
А теперь более интересная часть -&lt;br /&gt;
у последовательности есть метод body.&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;
задаче body.&lt;br /&gt;
&lt;br /&gt;
В каком-то смысле метод body аналогичен&lt;br /&gt;
фазовым методам,&lt;br /&gt;
&lt;br /&gt;
хотя и не принадлежит к числу&lt;br /&gt;
стандартных фаз OVM.&lt;br /&gt;
&lt;br /&gt;
Метод body применяется только в&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;
Посмотрим, как выглядит метод body&lt;br /&gt;
для данной конкретной последовательности.&lt;br /&gt;
&lt;br /&gt;
На слайде показана задача body.&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;
например, путем вызова метода stop_request.&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;
фабричного метода.&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;
транзакция типа my_transaction,&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;
в данном случае методу 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;
На шаге 2 вызывается метод start_item,&lt;br /&gt;
на шаге 3 транзакция рандомизируется,&lt;br /&gt;
&lt;br /&gt;
а на шаге 4 вызывается метод finish item.&lt;br /&gt;
&lt;br /&gt;
Итак, мы создаем транзакцию,&lt;br /&gt;
&lt;br /&gt;
сигнализируем инфраструктуре, что начинаем&lt;br /&gt;
процесс ее обработки,&lt;br /&gt;
&lt;br /&gt;
рандомизируем объект транзакции&lt;br /&gt;
и вызываем finsh_transaction,&lt;br /&gt;
&lt;br /&gt;
сообщая о том, что обработка закончена.&lt;br /&gt;
&lt;br /&gt;
Методы start_item и finish_item&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;
класс ovm_driver,&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;
методы new и build и, наконец,&lt;br /&gt;
задача run.&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;
Задача 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;
&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;
с RTL-кодом,&lt;br /&gt;
&lt;br /&gt;
в самом начале он синхронизируется&lt;br /&gt;
по фронту синхроимпульса в интерфейсе&lt;br /&gt;
&lt;br /&gt;
тестируемого устройства. Это делается в&lt;br /&gt;
предложении @(posedge dut_vi.clock).&lt;br /&gt;
&lt;br /&gt;
Затем, по достижении готовности, драйвер&lt;br /&gt;
получает транзакцию от контроллера.&lt;br /&gt;
&lt;br /&gt;
То есть драйвер потребляет транзакции,&lt;br /&gt;
генерируемые контроллером.&lt;br /&gt;
&lt;br /&gt;
Для этого драйвер вызывает метод get&lt;br /&gt;
порта sequence_item_port.&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;
драйвер может вызвать метод stop_request,&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;/div&gt;</summary>
		<author><name>ANA</name></author>	</entry>

	</feed>