<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-3544667600852951116</id><updated>2024-08-28T19:49:23.371+02:00</updated><category term="SystemVerilog"/><category term="FAQ"/><category term="OOP"/><category term="UVM"/><category term="Assertions"/><category term="ModelSim"/><category term="SVA"/><category term="SystemVerilog Example"/><title type="text">Новости в мире SystemVerilog</title><subtitle type="html">www.SystemVerilog.ru</subtitle><link href="http://systemverilog-ru.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default?redirect=false" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/" rel="alternate" type="text/html"/><link href="http://pubsubhubbub.appspot.com/" rel="hub"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><generator uri="http://www.blogger.com" version="7.00">Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-8645015430934209046</id><published>2010-11-26T17:20:00.002+02:00</published><updated>2010-11-26T17:22:49.638+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FAQ"/><category scheme="http://www.blogger.com/atom/ns#" term="SystemVerilog"/><title type="text">Зачем нужны clocking-блоки в SystemVerilog?</title><content type="html">Если в Verilog взаимодействие между блоками описывается с помощью портов модуля, то в Systemverilog добавились интерфейсы. Эта конструкция позволяет объединить данные о реализации взаимодействие между блоками в отдельном interface-модуле (другими словами, инкапсулировать данные о взаимодействии блоков). При использовании интерфейсов можно с легкостью менять уровень абстракции для моделирования межмодульного взаимодействия.&lt;br /&gt;
Интерфейс описывает сигналы, с помощью которых testbench взаимодействует с тестируемым устройством (DUT). Однако, интерфейсы явно не описывают временные ограничения и синхронизацию. Для этого в SystemVerilog добавлены clocking-блоки. Они отделяют все, что связано с временными параметрами и синхронизацией от других элементов testbench'а. С помощью clocking-блоков можно группировать сигналы, изменяющиеся по одному тактовому сигналу.</content><link href="http://systemverilog-ru.blogspot.com/feeds/8645015430934209046/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/clocking-systemverilog.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/8645015430934209046" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/8645015430934209046" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/clocking-systemverilog.html" rel="alternate" title="Зачем нужны clocking-блоки в SystemVerilog?" type="text/html"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-5158379378035734037</id><published>2010-11-19T20:32:00.005+02:00</published><updated>2010-11-24T15:14:15.961+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FAQ"/><category scheme="http://www.blogger.com/atom/ns#" term="SystemVerilog"/><title type="text">В чем различие между типами данных wire, reg и logic?</title><content type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Для того, чтобы понять различие между wire, reg и logic, сначала рассмотрим какие в SystemVerilog есть &lt;b&gt;типы данных&lt;/b&gt; и какие &lt;b&gt;классы объектов&lt;/b&gt;. Сразу скажу, что это не одно и тоже.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Тип данных определяет набор значений и набор операций над этими значениями.&lt;br /&gt;
&lt;p class="code"&gt;&lt;span class="key"&gt;bit&lt;/span&gt; | &lt;span class="key"&gt;logic&lt;/span&gt; | &lt;span class="key"&gt;reg&lt;/span&gt; | &lt;span class="key"&gt;byte&lt;/span&gt; | &lt;span class="key"&gt;shortint&lt;/span&gt; | &lt;span class="key"&gt;int&lt;/span&gt; | &lt;span class="key"&gt;longint&lt;/span&gt; | &lt;span class="key"&gt;integer&lt;/span&gt; | &lt;span class="key"&gt;time&lt;/span&gt; | &lt;span class="key"&gt;byte&lt;/span&gt; | &lt;span class="key"&gt;shortint&lt;/span&gt; | &lt;span class="key"&gt;int&lt;/span&gt; | &lt;span class="key"&gt;longint&lt;/span&gt; | &lt;span class="key"&gt;integer&lt;/span&gt; | &lt;span class="key"&gt;time&lt;/span&gt; | &lt;span class="key"&gt;struct&lt;/span&gt; | &lt;span class="key"&gt;union&lt;/span&gt; | &lt;span class="key"&gt;enum&lt;/span&gt; | &lt;span class="key"&gt;string&lt;/span&gt; | &lt;span class="key"&gt;event&lt;/span&gt; и т.д. - все это типы данных.&lt;/p&gt;&lt;b&gt;reg&lt;/b&gt; и &lt;b&gt;logic&lt;/b&gt; тута. А где &lt;b&gt;wire&lt;/b&gt;? Попробуем разобрать, что такое классы объектов, может там найдется &lt;b&gt;wire&lt;/b&gt;.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Итак, в SV выделяют следующие классы объектов: &lt;b&gt;литералы&lt;/b&gt;, &lt;b&gt;параметры&lt;/b&gt;, &lt;b&gt;константы&lt;/b&gt;, &lt;b&gt;переменные&lt;/b&gt;, &lt;b&gt;сигналы&lt;/b&gt; и &lt;b&gt;атрибуты&lt;/b&gt;. Все они описаны в стандарте. Мы же рассмотрим поподробнее классы объектов "&lt;b&gt;переменные&lt;/b&gt;" (&lt;b&gt;variables&lt;/b&gt;) и "&lt;b&gt;сигналы&lt;/b&gt;" (&lt;b&gt;nets&lt;/b&gt;).&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;К классу "&lt;b&gt;сигналы&lt;/b&gt;" относятся - &lt;br /&gt;
&lt;p class="code"&gt;&lt;span class="key"&gt;supply0&lt;/span&gt; | &lt;span class="key"&gt;supply1&lt;/span&gt; | &lt;span class="key"&gt;tri&lt;/span&gt; | &lt;span class="key"&gt;triand&lt;/span&gt; | &lt;span class="key"&gt;trior&lt;/span&gt; | &lt;span class="key"&gt;trireg&lt;/span&gt; | &lt;span class="key"&gt;tri0&lt;/span&gt; | &lt;span class="key"&gt;tri1&lt;/span&gt; | &lt;span class="key"&gt;uwire&lt;/span&gt; | &lt;span class="key"&gt;wire&lt;/span&gt; | &lt;span class="key"&gt;wand&lt;/span&gt; | &lt;span class="key"&gt;wor&lt;/span&gt;.&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Вот и нашелся &lt;b&gt;wire&lt;/b&gt;. Объекты класса "&lt;b&gt;сигналы&lt;/b&gt;" по умолчанию относятся к типу данных logic и поэтому: &lt;br /&gt;
&lt;p class="code"&gt;&lt;span class="key"&gt;wire&lt;/span&gt; a;&lt;/p&gt;и&lt;br /&gt;
&lt;p class="code"&gt;&lt;span class="key"&gt;wire logic&lt;/span&gt; a;&lt;/p&gt;эквивалентны. Все, что явно не объявлено объектом класса "&lt;b&gt;сигналы&lt;/b&gt;", становится объектом класса "&lt;b&gt;переменные&lt;/b&gt;". Объявить переменную можно с помощью типа данных и следующего за ним названия переменной:&lt;br /&gt;
&lt;p class="code"&gt;&lt;span class="key"&gt;logic&lt;/span&gt; a;&lt;/p&gt;или с добавлением ключевого слова &lt;b&gt;var&lt;/b&gt;:&lt;br /&gt;
&lt;p class="code"&gt;&lt;span class="key"&gt;var logic&lt;/span&gt; a;&lt;/p&gt;Это эквивалентные записи. При использовании &lt;b&gt;var&lt;/b&gt; тип данных можно не указывать, тогда по умолчание тип данных будет &lt;b&gt;logic&lt;/b&gt;.&lt;br /&gt;
&lt;h3&gt;wire&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Wire&lt;/b&gt; используется для соединения различных элементов&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Wire&lt;/b&gt; представляет собой физический провод (цепь)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Wire&lt;/b&gt; можно считывать или присваивать&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Wire&lt;/b&gt; не может хранить значение&lt;/li&gt;
&lt;li&gt;Для определения состояния сигнала в цепи, у нее должен быть источник сигнала (драйвер), который будет непрерывно управлять цепью&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Wire&lt;/b&gt; может иметь несколько драйверов. Что в этом случае происходит, читаем &lt;a href="http://www.kit-e.ru/articles/circuit/2008_4_164.php"&gt;здесь&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Назначить драйвер для &lt;b&gt;wire&lt;/b&gt; можно с помощью оператора непрерывного присваивания &lt;b&gt;assign&lt;/b&gt; или через порт модуля&lt;/li&gt;
&lt;li&gt;При синтезе wire всегда воспринимается как провод&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;reg&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Reg&lt;/b&gt; в &lt;b&gt;Verilog/SystemVerilog&lt;/b&gt; представляет элементы хранения данных (аналог переменной в языках программирования)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reg&lt;/b&gt; не всегда представляет физический регистр. При синтезе может получиться регистр (flip-flop), регистр-защелка (latch) или комбинационная логика (еще есть вариант, когда может вообще ничего не получиться - это называется несинтезируемая конструкция).&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;logic&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Ключевое слово &lt;b&gt;logic&lt;/b&gt; было добавлено в стандарт, чтобы разработчики больше не думали, что используя переменную &lt;b&gt;reg&lt;/b&gt;, они получат физический регистр. &lt;b&gt;logic&lt;/b&gt; - это эквивалент &lt;b&gt;reg&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Если к переменной типа &lt;b&gt;logic&lt;/b&gt; одновременно осуществляется несколько присваиваний, то выбирается последнее.&lt;/li&gt;
&lt;li&gt;Присваивание переменной типа &lt;b&gt;logic&lt;/b&gt; можно осуществить с помощью оператора непрерывного присваивания &lt;b&gt;assign&lt;/b&gt; (тогда она воспринимается, как &lt;b&gt;wire&lt;/b&gt;), через порт модуля или в процедурном блоке:&lt;/li&gt;
&lt;/ol&gt;&lt;p class="code"&gt;&lt;span class="key"&gt;logic&lt;/span&gt; sum;&lt;br /&gt;
&lt;span class="key"&gt;assign&lt;/span&gt; sum = a ^ b;                   &lt;span class="comment"&gt;// как wire&lt;/span&gt; &lt;br /&gt;
&lt;span class="key"&gt;always_comb&lt;/span&gt; sum = a + b;              &lt;span class="comment"&gt;// как reg&lt;/span&gt;&lt;br /&gt;
adder adder_inst(.out(sum), .op1(a), op2(b));  &lt;span class="comment"&gt;// как wire&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;Дополнительная информация по logic в &lt;a href="http://www.eda.org/sv-ec/hm/att-0319/01-Logic_20021209.PDF"&gt;статье&lt;/a&gt;.</content><link href="http://systemverilog-ru.blogspot.com/feeds/5158379378035734037/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/wire-reg-logic.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/5158379378035734037" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/5158379378035734037" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/wire-reg-logic.html" rel="alternate" title="В чем различие между типами данных wire, reg и logic?" type="text/html"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-3862081634043179023</id><published>2010-11-18T18:14:00.001+02:00</published><updated>2010-11-18T18:17:04.897+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FAQ"/><category scheme="http://www.blogger.com/atom/ns#" term="OOP"/><category scheme="http://www.blogger.com/atom/ns#" term="SystemVerilog"/><title type="text">Что такое Factory Pattern в SystemVerilog?</title><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;О том, что такое паттерн, уже писалось &lt;a href="http://systemverilog-ru.blogspot.com/2010/11/callback-systemverilog.html"&gt;здесь&lt;/a&gt;. Вкратце напомню, что паттерн в ООП - это устоявшееся решение проблем, которые возникали, возникают и будут возникать. У некоторых из этих решений есть свое название. Что же такое factory pattern (или фабричный паттерн)? Сперва обратимся к определению фабричного метода из wiki:&lt;/p&gt;&lt;b&gt;Фабричный метод&lt;/b&gt; &lt;b&gt;(&lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA" title="Английский язык"&gt;англ.&lt;/a&gt;&amp;nbsp;&lt;i&gt;&lt;span lang="en" xml:lang="en"&gt;Factory Method&lt;/span&gt;&lt;/i&gt;)&lt;/b&gt;&amp;nbsp;— &lt;a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D0%BE%D0%B6%D0%B4%D0%B0%D1%8E%D1%89%D0%B8%D0%B5_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F" title="Порождающие шаблоны проектирования"&gt;порождающий шаблон проектирования&lt;/a&gt;, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс инстанциировать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне. Также известен под названием виртуальный конструктор.&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Фабричный паттерн нацелен на решение проблемы создания объекта. Есть еще набор паттернов, которые имеют отношение к созданию объекта, предназначенные для различных случаев. Они известны под названием creational patterns (порождающие паттерны).&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Рассмотрим пример использования порождающего паттерна на SystemVerilog. Создадим класс для "Фабрики роботов", который необходим, чтобы создавать разные типы роботов (Андроид (android), Боевой робот (robokiller), Бытовой робот (robomama), Персональный робот (robocomp)). Тип робота будет выбираться с помощью входной строки.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Для каждого типа робота нам потребуется свой класс. Создадим базовый класс ROBO, который будет содержать общие для всех классов переменные, подзадачи task, функции function. Остальные классы будут наследовать базовый класс:&lt;/p&gt;&lt;p class="code"&gt;&lt;span class="key"&gt;class&lt;/span&gt; ROBO;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// Общие объекты данных&lt;/span&gt; &lt;br /&gt;
&lt;span class="key"&gt;string type&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="comment"&gt;// Общие методы&lt;/span&gt; &lt;br /&gt;
&lt;span class="key"&gt;virtual function string&lt;/span&gt; get_type();&lt;br /&gt;
&lt;span class="key"&gt;endclass&lt;/span&gt; : ROBO&lt;br /&gt;
&lt;br /&gt;
&lt;span class="key"&gt;class&lt;/span&gt; ANDROID &lt;span class="key"&gt;extends&lt;/span&gt; ROBO;&lt;br /&gt;
&lt;span class="key"&gt;function new&lt;/span&gt;();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;this&lt;/span&gt;.&lt;span class="key"&gt;string&lt;/span&gt; = "&lt;span class="msg"&gt;Android&lt;/span&gt;";&lt;br /&gt;
&lt;span class="key"&gt;endfunction&lt;/span&gt; : &lt;span class="key"&gt;new&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="key"&gt;string function string&lt;/span&gt; get_type();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;return this&lt;/span&gt;.&lt;span class="key"&gt;string&lt;/span&gt;;&lt;br /&gt;
&lt;span class="key"&gt;endfunction&lt;/span&gt; : get_type&lt;br /&gt;
&lt;span class="key"&gt;endclass&lt;/span&gt; : ANDROID&lt;br /&gt;
&lt;br /&gt;
&lt;span class="key"&gt;class&lt;/span&gt; ROBOKILLER &lt;span class="key"&gt;extends&lt;/span&gt; ROBO;&lt;br /&gt;
&lt;span class="key"&gt;function new&lt;/span&gt;();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;this&lt;/span&gt;.&lt;span class="key"&gt;string&lt;/span&gt; = "&lt;span class="msg"&gt;ROBOKILLER&lt;/span&gt;";&lt;br /&gt;
&lt;span class="key"&gt;endfunction&lt;/span&gt; : new&lt;br /&gt;
&lt;br /&gt;
&lt;span class="key"&gt;string function string&lt;/span&gt; get_type();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;return this&lt;/span&gt;.&lt;span class="key"&gt;string&lt;/span&gt;;&lt;br /&gt;
&lt;span class="key"&gt;endfunction&lt;/span&gt; : get_type&lt;br /&gt;
&lt;span class="key"&gt;endclass&lt;/span&gt; : ROBOKILLER&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Теперь опишем класс "фабрики роботов" (ROBO_FACTORY). Для простоты пронумеруем каждый тип робота, чтобы было легче выбирать, какого робота создавать.&lt;/p&gt;&lt;p class="code"&gt;&lt;span class="key"&gt;class&lt;/span&gt; ROBO_FACTORY;&lt;br /&gt;
ROBO my_robo&lt;br /&gt;
&lt;br /&gt;
&lt;span class="comment"&gt;// Общие методы&lt;/span&gt;&lt;br /&gt;
&lt;span class="key"&gt;function&lt;/span&gt; ROBO get_robo(&lt;span class="key"&gt;int type&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;if&lt;/span&gt;(&lt;span class="key"&gt;type&lt;/span&gt; == 1) &lt;span class="key"&gt;this&lt;/span&gt;.my_robo = &lt;span class="key"&gt;new&lt;/span&gt; ANDROID();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;if&lt;/span&gt;(&lt;span class="key"&gt;type&lt;/span&gt; == 2) &lt;span class="key"&gt;this&lt;/span&gt;.my_robo = &lt;span class="key"&gt;new&lt;/span&gt; ROBOKILLER();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;return this&lt;/span&gt;.my_robo;&lt;br /&gt;
&lt;span class="key"&gt;endfunction&lt;/span&gt; : get_robo&lt;br /&gt;
&lt;span class="key"&gt;endclass&lt;/span&gt; : ROBO_FACTORY&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Дополнительно читайте &lt;a href="http://sourcemaking.com/design_patterns/factory_method"&gt;здесь&lt;/a&gt;.&lt;/p&gt;</content><link href="http://systemverilog-ru.blogspot.com/feeds/3862081634043179023/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/factory-pattern-systemverilog.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/3862081634043179023" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/3862081634043179023" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/factory-pattern-systemverilog.html" rel="alternate" title="Что такое Factory Pattern в SystemVerilog?" type="text/html"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-6801274582189573562</id><published>2010-11-16T17:45:00.001+02:00</published><updated>2010-11-18T18:17:54.320+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FAQ"/><category scheme="http://www.blogger.com/atom/ns#" term="OOP"/><category scheme="http://www.blogger.com/atom/ns#" term="SystemVerilog"/><title type="text">Что такое Callback в SystemVerilog?</title><content type="html">&amp;nbsp;Начнем с определения из википедии:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Callback&lt;/b&gt; (&lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA" title="Английский язык"&gt;англ.&lt;/a&gt;&amp;nbsp;&lt;i&gt;&lt;span lang="en" xml:lang="en"&gt;call&lt;/span&gt;&lt;/i&gt;&amp;nbsp;— вызов, &lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA" title="Английский язык"&gt;англ.&lt;/a&gt;&amp;nbsp;&lt;i&gt;&lt;span lang="en" xml:lang="en"&gt;back&lt;/span&gt;&lt;/i&gt;&amp;nbsp;— обратный) или &lt;b&gt;фу́нкция обра́тного вы́зова&lt;/b&gt; в &lt;a href="http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" title="Программирование"&gt;программировании&lt;/a&gt;&amp;nbsp;— передача исполняемого кода в качестве одного из параметров другого кода.&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Например, вам необходимо передать одну функцию в качестве входного параметра другой функции. Это и есть &lt;b&gt;callback&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Как это реализуется с помощью средств ООП в &lt;b&gt;SystemVerilog&lt;/b&gt;? Рассмотрим пример:&lt;br /&gt;
Есть базовый класс &lt;b&gt;my_transactor&lt;/b&gt;, который принимает транзакции от драйвера и пересылает их в монитор:&lt;/p&gt;&lt;p class="code"&gt;&lt;span class="key"&gt;class&lt;/span&gt; my_transactor;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;task&lt;/span&gt; main();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;forever begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// Достаем из почтового ящика транзакцию,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// которую прислал драйвер&lt;/span&gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;driver2xactor.get(in_tr);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// Выполняем необходимые действия&lt;/span&gt;  &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// Отправляем транзакцию в блок монитора&lt;/span&gt;                      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xactor2monitor.put(out_tr); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;end&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;endtask&lt;/span&gt;&lt;br /&gt;
&lt;span class="key"&gt;endclass&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Предположим, мы хотим просто посмотреть содержимое принятой транзакции и содержимое транзакции, подготовленной для пересылки в монитор:&lt;/p&gt;&lt;p class="code"&gt;&lt;span class="key"&gt;class&lt;/span&gt; my_transactor;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;task&lt;/span&gt; main();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;forever begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// Достаем из почтового ящика транзакцию,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// которую прислал драйвер&lt;/span&gt;  &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;driver2xactor.get(in_tr);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$display(&lt;span class="msg"&gt;" Input trans: a = %h, b = %h"&lt;/span&gt;, in_tr.a, in_tr.b);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// Выполняем необходимые действия&lt;/span&gt;  &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// Отправляем транзакцию в блок монитора&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$display(&lt;span class="msg"&gt;" Output trans: a = %h, b = %h"&lt;/span&gt;, out_tr.a, out_tr.b);                      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xactor2monitor.put(out_tr); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;end&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;endtask&lt;/span&gt;&lt;br /&gt;
&lt;span class="key"&gt;endclass&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Теперь этот код непригоден для повторного использования, т.к. добавленные сообщения специфичны для конкретной тестируемой схемы (DUT) или для определенного теста. Это становится ощутимо, если поменять содержимое транзакции или попробовать не выводить содержимое транзакции в наследуемом классе. Необходимо избегать использования специфичного для данной реализации кода в тестовых окружениях, предназначенных для повторного использования. Эта проблема общая для повторно используемого кода, не только касательно верификации. И средства ООП предлагают решение этой проблемы: виртуальные методы. С помощью них можно расширить возможности транзактора при необходимости:&lt;/p&gt;&lt;p class="code"&gt;&lt;span class="key"&gt;class&lt;/span&gt; my_transactor;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;virtual task&lt;/span&gt; pre_exec(in_trans tr);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;endtask&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;virtual task&lt;/span&gt; post_exec(out_trans tr);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;endtask&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;task&lt;/span&gt; main();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;forever begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// Достаем из почтового ящика транзакцию,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// которую прислал драйвер&lt;/span&gt;  &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;driver2xactor.get(in_tr);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;this&lt;/span&gt;.pre_exec(in_tr);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// Выполняем необходимые действия&lt;/span&gt;  &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;// Отправляем транзакцию в блок монитора&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;this&lt;/span&gt;.post_exec(out_tr);                      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xactor2monitor.put(out_tr); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;end&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;endtask&lt;/span&gt;&lt;br /&gt;
&lt;span class="key"&gt;endclass&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="key"&gt;class&lt;/span&gt; my_transactor_child &lt;span class="key"&gt;extend&lt;/span&gt; my_transactor;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;virtual task&lt;/span&gt; pre_exec(in_trans tr);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$display(&lt;span class="msg"&gt;" Input trans: a = %h, b = %h"&lt;/span&gt;, tr.a, tr.b);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;endtask&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;virtual task&lt;/span&gt; post_exec(out_trans tr);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$display(&lt;span class="msg"&gt;" Output trans: a = %h, b = %h"&lt;/span&gt;, tr.a, tr.b);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="key"&gt;endtask&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&lt;span class="key"&gt;endclass&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Как это работает? В базовом классе &lt;b&gt;my_transactor&lt;/b&gt; есть 3 подзадачи task, 2 из которых виртуальные и не реализованы. Класс-потомок &lt;b&gt;my_transactor_child&lt;/b&gt; наследует методы базового класса и может и заполняет виртуальные методы в соответствии со своими нуждами. Тем самым мы можем вносить изменения в метод &lt;b&gt;main&lt;/b&gt;, не изменяя его код.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;Callback&lt;/b&gt; методы содержат фрагменты кода, функции и подзадачи, которые меняются от теста к тесту. Они очень полезны, когда идет речь о создании базового класса, который планируется использовать в нескольких тестовых окружениях.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;У приведенного выше примера &lt;b&gt;callback&lt;/b&gt; есть некоторые ограничения, которые можно решить с помощью паттернов. Паттерны в ООП это не базовые классы или библиотеки. Это некий шаблон проектирования или техника для построения объектно-ориентированного кода, которая позволяет решить сложные задачи. Подробнее об этом в статье - &lt;a href="http://www.vmmcentral.org/vmartialarts/?p=17"&gt;Janick Bergeron "How to use VMM callbacks"&lt;/a&gt;&lt;/p&gt;</content><link href="http://systemverilog-ru.blogspot.com/feeds/6801274582189573562/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/callback-systemverilog.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/6801274582189573562" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/6801274582189573562" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/callback-systemverilog.html" rel="alternate" title="Что такое Callback в SystemVerilog?" type="text/html"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-4951095649776890820</id><published>2010-11-15T21:26:00.002+02:00</published><updated>2010-11-15T21:26:33.919+02:00</updated><title type="text">FeedShark test msg</title><content type="html">&lt;a href="http://www.hypersmash.com/dreamhost/" id="GJ274708"&gt;DreamHost Uptime&lt;/a&gt;</content><link href="http://systemverilog-ru.blogspot.com/feeds/4951095649776890820/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/feedshark-test-msg.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/4951095649776890820" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/4951095649776890820" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/feedshark-test-msg.html" rel="alternate" title="FeedShark test msg" type="text/html"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-8739120627341077805</id><published>2010-11-12T17:34:00.003+02:00</published><updated>2010-11-14T14:47:12.028+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ModelSim"/><title type="text">Сайт о ModelSim</title><content type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Сайт  о системе моделирования и среде верификации ModelSim компании Mentor Graphics - &lt;a href="http://modelsim.ru/"&gt;http://modelsim.ru/&lt;/a&gt;</content><link href="http://systemverilog-ru.blogspot.com/feeds/8739120627341077805/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/modelsim.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/8739120627341077805" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/8739120627341077805" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/modelsim.html" rel="alternate" title="Сайт о ModelSim" type="text/html"/><author><name>ModelSim</name><uri>http://www.blogger.com/profile/05103537941589852166</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-1040848073382283518</id><published>2010-11-12T16:31:00.002+02:00</published><updated>2010-11-14T14:48:26.905+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SystemVerilog"/><category scheme="http://www.blogger.com/atom/ns#" term="UVM"/><title type="text">Статьи по UVM - A Practical Guide to Adopting the Universal Verification Methodology</title><content type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Статьи по &lt;b&gt;SystemVerilog UVM&lt;/b&gt; "&lt;b&gt;&lt;i&gt;A Practical Guide to Adopting the Universal Verification Methodology&lt;/i&gt;&lt;/b&gt;":&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.low-powerdesign.com/article_Cadence-UVM_082310.html"&gt;Часть 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.low-powerdesign.com/article_Cadence-UVM_083010.html"&gt;Часть 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.low-powerdesign.com/article_Cadence-UVM_101010.html"&gt;Часть 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.low-powerdesign.com/article_Cadence-UVM_101810.html"&gt;Часть 4 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><link href="http://systemverilog-ru.blogspot.com/feeds/1040848073382283518/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/uvm-practical-guide-to-adopting.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/1040848073382283518" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/1040848073382283518" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/uvm-practical-guide-to-adopting.html" rel="alternate" title="Статьи по UVM - A Practical Guide to Adopting the Universal Verification Methodology" type="text/html"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-1451972282739278184</id><published>2010-11-12T14:34:00.004+02:00</published><updated>2010-11-14T15:14:59.391+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SystemVerilog"/><category scheme="http://www.blogger.com/atom/ns#" term="UVM"/><title type="text">Установка библиотеки UVM</title><content type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Универсальная методология верификации UVM (Universal Verification Methodology) готова к применению. Инструкция по установке - &lt;a href="http://www.systemverilog.ru/uvm_1.html"&gt;http://www.systemverilog.ru/uvm_1.html&lt;/a&gt;</content><link href="http://systemverilog-ru.blogspot.com/feeds/1451972282739278184/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/uvm.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/1451972282739278184" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/1451972282739278184" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/uvm.html" rel="alternate" title="Установка библиотеки UVM" type="text/html"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-1725553758328300118</id><published>2010-11-12T14:29:00.002+02:00</published><updated>2010-11-14T15:15:40.783+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SystemVerilog"/><category scheme="http://www.blogger.com/atom/ns#" term="SystemVerilog Example"/><title type="text">SystemVerilog Example</title><content type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Пример тестового окружения на &lt;b&gt;SystemVerilog &lt;/b&gt;- &lt;a href="http://www.systemverilog.ru/systemverilog_example_0.html"&gt;http://www.systemverilog.ru/systemverilog_example_0.html&lt;/a&gt;</content><link href="http://systemverilog-ru.blogspot.com/feeds/1725553758328300118/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/systemverilog-example.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/1725553758328300118" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/1725553758328300118" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/systemverilog-example.html" rel="alternate" title="SystemVerilog Example" type="text/html"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-2108212921923005295</id><published>2010-11-11T23:09:00.005+02:00</published><updated>2010-11-14T15:16:21.305+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Assertions"/><category scheme="http://www.blogger.com/atom/ns#" term="SVA"/><category scheme="http://www.blogger.com/atom/ns#" term="SystemVerilog"/><title type="text">SystemVerilog assertions (SVA)</title><content type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Helvetica,Arial,sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 18px;"&gt;Изучить &lt;b&gt;SystemVerilog&lt;/b&gt; утверждения вам поможет материал об &lt;b&gt;SVA&lt;/b&gt; на русском языке - &lt;a href="http://www.systemverilog.ru/assertions_0.html"&gt;http://www.systemverilog.ru/assertions_0.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;</content><link href="http://systemverilog-ru.blogspot.com/feeds/2108212921923005295/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/systemverilog.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/2108212921923005295" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/2108212921923005295" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/systemverilog.html" rel="alternate" title="SystemVerilog assertions (SVA)" type="text/html"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3544667600852951116.post-2452664474085963811</id><published>2010-11-11T22:55:00.002+02:00</published><updated>2010-11-12T13:52:37.730+02:00</updated><title type="text">Вас приветствует блог сайта www.SystemVerilog.ru</title><content type="html">&lt;h1 style="color: #104e8b; font-family: 'Trebuchet MS'; font-size: 20px; line-height: 24px; margin: 0px; padding: 10px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana,Arial; font-size: 12px; font-weight: normal; line-height: 22px;"&gt;&amp;nbsp;&amp;nbsp; Сайт &lt;span class="sv" style="background-color: #f0f0f0; font-weight: bold; margin: 0px; padding: 5px;"&gt;SystemVerilog.ru&lt;/span&gt;&amp;nbsp;создан для того, чтобы помочь инженерам, работающим с языками описания аппаратуры&amp;nbsp;&lt;span class="exp" style="font-weight: bold; margin: 0px; padding: 0px;"&gt;Verilog&lt;/span&gt;&amp;nbsp;и&amp;nbsp;&lt;span class="exp" style="font-weight: bold; margin: 0px; padding: 0px;"&gt;VHDL&lt;/span&gt;, начать использовать возможности языка&amp;nbsp;&lt;span class="sv" style="background-color: #f0f0f0; font-weight: bold; margin: 0px; padding: 5px;"&gt;SystemVerilog&lt;/span&gt;&amp;nbsp;для разработки и верификации. В блоге будут выкладываться последние новости, относящиеся к языку SystemVerilog и не только.&lt;/span&gt;&lt;/h1&gt;</content><link href="http://systemverilog-ru.blogspot.com/feeds/2452664474085963811/comments/default" rel="replies" title="Комментарии к сообщению" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/systemverilogru.html#comment-form" rel="replies" title="Комментарии: 0" type="text/html"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/2452664474085963811" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/3544667600852951116/posts/default/2452664474085963811" rel="self" type="application/atom+xml"/><link href="http://systemverilog-ru.blogspot.com/2010/11/systemverilogru.html" rel="alternate" title="Вас приветствует блог сайта www.SystemVerilog.ru" type="text/html"/><author><name>SystemVerilog</name><uri>http://www.blogger.com/profile/16505317230198582728</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry></feed>