СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №3/2013

ной не допускается. Как следствие, пе ременная типа protected не должна иметь присвоения начального значе ния при декларации, например, недо пустимой является следующая декла рация: shared variable Cnt1, Cnt2 : COUNTER_TYPE := 10; недопустимо ... Cnt1 := Cnt2; недопустимо Аналогичным образом операторы равенства («=») и неравенства («/=») не должны использоваться для типа pro tected : shared variable Cnt1, Cnt2 : protected_type; ... if (Cnt1 = Cnt2 and Cnt1 /= 5) then недопустимо Функции, объявляемые при декла рации защищённого типа, должны объявляться с ключевым словом im pure . Как правило, защищённым типом protected являются общие переменные, которые объявляются в декларативной части архитектуры и пакетов, но не процессов и подпрограмм. Если доба вить ключевое слово shared в деклара ции переменной, то такую перемен ную называют общей переменной, и к ней разрешается доступ более чем из одного процесса. Общие переменные могут быть продекларированы в тех местах кода VHDL, где не могут быть продекларированыобычные перемен ные, а именно, в декларации entity , в разделах деклараций архитектур, опе раторов блоков, операторов генерации и пакетах. В отличие от обычных пере менных, могут возникать проблемы при использовании общих перемен ных, например, когда два процесса конкурируют при обновлении общей переменной, это может приводить к непредсказуемому итоговому значе нию переменной. П РИМЕР ИСПОЛЬЗОВАНИЯ ТИПА PROTECTED package new_types is type COUNTER_TYPE is protected procedure Set ( num : integer); procedure Inc; impure function get return integer; end protected COUNTER_TYPE; end new_types; package body new_types is type COUNTER_TYPE is protected body – тело типа variable count : integer := 0; procedure Set ( num : integer) is begin count := num ; end procedure Set; procedure Inc is begin count := count + 1 ; end procedure Inc; impure function Get return integer is – определение функции begin return count; end function Get; end protected body COUNTER_TYPE; end new_types; library work; use work.new_types.all; entity count is end entity; architecture beh of count is shared variable Cnt : counter_type; begin p1: process begin if Cnt.get = 6 then wait for 0 ns; Cnt.Set(0); end if; wait for 10 ns; end process p1; p2: process begin Cnt.Inc; wait for 10 ns; end process p2; end architecture; Для того чтобы вызвать методы (функции, процедуры) защищённого типа, следует указать имя переменной и имя метода, разделённые точкой. Например, если переменная объявле на как shared variable Cnt : COUNTER_TYPE; то она может использоваться следую щим образом: if (Cnt.Get = 6) then . . В этом выражении вызывается ме тод Get переменной Cnt , который воз вращает значение внутренней пере менной count . Локальныепеременные, объявленные в процессах и подпрограммах, также могут быть типа protected . Вэтомслучае общий доступ к данным типа protected невозможен, но преимущества инкап суляции остаются. Заметим, что нельзя продекларировать сигнал типа protected . Следует отметить, что использова ние общих переменных защищённо го типа гарантирует доступ к общим структурам данных только для одного процесса в настоящий момент, но не гарантирует порядок выполнения. Это значит, что состязание по прежнему возможно, если обновление или чте ние общей структуры данных плани руется в один и тот же момент моде лирования и в дельта цикле. Наблю дать гонки (различные результаты моделирования) можно путём экспе риментов, вводя дельта задержку (с по мощью оператора wait for 0 ns ;) в про цессе p1 и переставляя в тексте про граммы процессы p1 , p2 . Защищённые переменные shared можно объявлять (по сути глобальны ми) в другом пакете, не забыв указать ссылку на пакет, где декларируются эти переменные, и использовать эти пере менные для программ сбора информа ции о функциональном покрытии. З АКЛЮЧЕНИЕ ВметодологииOS VVMзащищённые типы, описанные в пакетах RandomPkg и CoveragePkg, используются для того, чтобы, с одной стороны, скрыть от пользователя довольно сложные струк туры данных, а с другой – с целью упрощения работы пользователя с подпрограммами и функциями, пред назначенными для генерации псевдо случайных чисел и сбора данных для оценки функционального покрытия. Л ИТЕРАТУРА 1. IEEE Standard VHDL Language Reference Manual, IEEE Std 1076 2008. 2. http://osvvm.org/about os vvm. 3. http://www.synthworks.com/downloads/. 4. Using Protected Types in VHDL Designs. http://www.aldec.com/en/support/re sources/documentation/articles/1179. 5. Ashenden P.J., Lewis J . The Designer’s Guide to VHDL. Third Ed. Morgan Kaufmann, 2008. 6. Суворова Е.А., Шейнин Ю.Е. Проектирова ние цифровых систем на VHDL. БХВ Пе тербург, 2003. ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ 76 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 3 2013

RkJQdWJsaXNoZXIy MTQ4NjUy