ЛЕКЦИЯ Язык моделирования PML
Язык поведенческого моделирования PML На этом языке можно создавать функциональные и поведенческие модели цифровых объектов. Поддерживается также потоковый стиль описания объектов. Своё название PML берёт от английских слов Pc-logs behavioral Modeling Language, что переводится как язык поведенческого моделирования для программы PC-LOGS. Данная программа входит в состав пакета PCAD 4.5 и называется моделятором (PC-LOGS является сокращением от слов LOGic Simulate - логическое моделирование). В новых версиях PCADа языка PML нет Структурные модели на языке PML написать нельзя
Знакомство с PML – своеобразная разминка Мы начнём знакомство с этого изрядно устаревшего языка по одной простой причине: он является самым простым, в нём всего 11 ключевых слов. Тем не менее, обойти вниманием названный язык было бы неправильно, так как многие заложенные и реализованные в нём идеи с успехом применяются в современных языках моделирования и описания электронной аппаратуры. Поэтому будем считать знакомство с PML своеобразной разминкой.
Язык PML используется в САПР PCAD 4.5 САПР PCAD 4.5 (Personal Computer Aided Design), в которой используется этот язык, имеет весьма ограниченный набор встроенных моделей. Их всего 30 штук и они разработаны для стандартных компонентов цифровой аппаратуры, таких как логические элементы, триггеры, мультиплексоры и память. Они потому и называются встроенными, что прикомпонованы к моделятору и не существуют в виде отдельного файла. Расширить библиотеку поведенческих моделей пакета PCAD 4.5 как раз и позволяет язык PML
Особенности языка PML Первая особенность - простота В языке определены всего одиннадцать ключевых слов Для сравнения в языке VHDL их 97 (стандарт VHDL93) INPUT OUTPUT INOUT LOCAL IF ELSE OTHERWISE RETURN SELECT FOR SET ИнтерфейсУсловный оператор Оператор выбора Ключевых слов BEGIN и END нет
Особенности языка PML Вторая особенность – трёхзначный алфавит Язык моделирования PML напоминает в общих чертах язык программирования Си. Однако в отличие от последнего, язык PML работает с логическими переменными и условными выражениями в трёхзначном алфавите {0, 1, X}. Другими словами, любой сигнал в схеме может принимать одно из трёх значений: "0" - низкий уровень (Low); "1" - высокий уровень (High); "X" - неизвестное значение (Unknown).
Особенности языка PML Каждый логический уровень (то есть "0", "1", "X") характеризуется вполне определённой логической силой (Logic Strength), косвенно показывающей мощность или нагрузочную способность выхода. В PCAD'e определены четыре значения логической силы: Третья особенность – логическая сила "S" - питание (Supply); "D" - управление (Driving); "R" - резистивный выход (Resistive); "Z" - высокоомный выход (High Z). Логическая сила убывает в следующем порядке: S > D > R > Z. Язык Verilog унаследовал эту особенность Примеры: S0 D1 R0 ZX
Особенности языка PML Язык PML позволяет непосредственно запрограммировать временную задержку, с которой входной сигнал передаётся на выход. Четвёртая особенность – имитация задержек Такая возможность реализуется с помощью PCL-списка: Y = ~(A & B) (20, 22, D, Z) Язык PML позволяет описать не только функцию цифрового компонента, но и представить в модели самые важные его свойства - временную задержку и нагрузочную способность.
Особенности языка PML Пятая особенность – нет BEGIN и END NAND2 () INPUT IN1, IN2; OUTPUT OUT1 (20, 22,"D","D"); { OUT1 = ~(IN1 & IN2); } PML-модель логического элемента NAND2 Их роль выполняют фигурные скобки { } Заголовок модели Исполняемый раздел Большие и малые буквы не различаются
Особенности языка PML Язык PML поддерживает поведенческое и потоковое описания объекта Шестая особенность – стили описания Язык PML не поддерживает структурное описание объекта Нельзя создавать иерархические проекты Нельзя использовать вложенные подпрограммы
Стили описания проекта Да Нет MUX2_PML () INPUT D0,D1,A; OUTPUT Y; LOCAL F1,F2,F3; { F3=~A; F1=D0&F3; F2=D1&A; Y=F1|F2; } MUX2_PML () INPUT D0,D1,A; OUTPUT Y; { Y=(D0&~A)|(D1&A); } Конвейер
Особенности языка PML Локальные, то есть внутренние сигналы (узлы или шины), могут быть определены только внутри PML-модели. Седьмая особенность – локальные сигналы и шины LOCAL F1,F2,F3; LOCAL Q_BUS[8]; LOCAL MEM [4] (8,8,D",R"); Объявлено три одиночных узла (сигнала) Объявлена восьмиразрядная шина К четырёхразрядной шине добавлен PCL-атрибут
Особенности локальных узлов и шин Во-первых, они имеют собственную сигнальную память, которая выделяется динамически для каждого экземпляра (копии) схемного элемента с данной PML-моделью. В этой памяти фиксируется текущее состояние каждого экземпляра моделируемого элемента, например триггера, счётчика или регистра. Это состояние сохраняется и после выхода из подпрограммы модели, в отличие от классической локальной переменной, которая за пределами подпрограммы становится неопределённой. Локальные узлы и шины характеризуются пятью особенностями.
Особенности локальных узлов и шин Во-вторых, в списке локальных сигналов можно объявить не только одиночный узел, но и шину. В нашем примере как раз и объявляется такая шина. Имя её MEM, а ширина шины - 4. Она указывается в квадратных скобках и несёт информацию о числе проводников в ней. В каком то смысле шина - это "вещь в себе", потому что за пределами PML-модели она не видна: пакет PCAD 4.5 не поддерживает описание шинных структур. Именно по этой причине шину нельзя объявить в списках входных, выходных или двунаправленных (ключевое слово INOUT) узлов. Шина должна быть преобразована в соответствующее число одиночных узлов (проводников). В нашем примере эта работа выполняется операторами присваивания: Q0=MEM [0]; Q1=MEM [1]; Q2=MEM [2]; Q3=MEM [3];
Особенности локальных узлов и шин Третья особенность: Шинные сигналы вообще нельзя визуализировать не из программы моделятора, не из постпроцессора моделирования. Четвёртая особенность заключается в том, что локальные узлы и шины имеют статус сигналов двунаправленного типа, то есть их можно подставлять в правую часть выражения. Пятая особенность заключается в том, локальным узлам и шинам можно задавать PCL-списки, но в отличие от внешних выходных узлов, в них должны быть одинаковые задержки по фронту и срезу. Локальные сигналы (узлы и шины) занимают дополнительную область памяти и замедляют процесс моделирования.
Особенности языка PML Восьмая особенность – операция конкатенации Отдельные узлы можно объединять, "складывать" в шину с помощью операции конкатенации, называемой иначе [cat-узел]. Слово Cat происходит от Catenation - сцепление. Таким образом, с помощью cat-узла легко наполнить шину конкретным содержанием. Выражения в cat-узле недопустимы Q_BUS = [~D4, D3&D2, "0", D0]; /* ошибка */ Шина – это внутреннее достояние PML-модели OUTPUT Q1, Q2, Q3, Q4; INPUT D1, D2, D3, D4; LOCAL Q_BUS[4]; /* объявляется четырёхразрядная шина */ { Q_BUS = [D4,D3,D2,D1]; /* значение шины определяется входами D4..D1 */ Q_BUS = ["1","1","0","1"];/* шине присваивается значение 13 */ Q_BUS = [D4,"1","0",D1];/* в cat-узел можно подставлять узлы и */ /* узловые значения "0","1","X" */ }
Особенности языка PML В условных выражениях можно использовать описание переключающегося сигнала (его фронта или среза) Девятая особенность – динамическое управление IF (C == "/") Q = D; /* загрузка в D-триггер данных по фронту C */ Пример Аналогичным образом обозначается срез сигнала: "\" - наклонная черта влево (backslash). Заметим, что в операторе присваивания использование названных символов недопустимо. Компилятор языка PML зафиксирует ошибку, если вы наберёте следующий текст: Q = "/"; /* попытка присвоить сигналу Q значение «фронт» */
Особенности языка PML оператор присваивания; условный оператор; оператор выбора. Приведём несколько примеров их использования Оператор присваивания OUT1 = "X"; Q_BUS[3] = "1"; /* индексный компонент шины ИКШ */ Q_BUS = "0XD"; Q_BUS = [A3,A2,A1,A0] + 0B1011; A_BUS = [A3,A2,A1,A0]; /* cat-узел */ Q_BUS = A_BUS + "013"; Q_BUS = A_BUS & ["1","0","0","0"]; /* маскирование */ Q_BUS = Q_BUS
Особенности языка PML ~ - логическая инверсия; & - логическое "И"; | - логическое "ИЛИ"; ^ - исключающее "ИЛИ" Для одиночных узлов определены следующие операции Для шин определены следующие операции & - поразрядное "И"; | - поразрядное "ИЛИ"; ~ - поразрядная инверсия; ^ - поразрядное исключающее "ИЛИ"; >> - поразрядный сдвиг вправо;
Условный оператор IF (~R&S) Q = "0"; /* сброс триггера в 0 низким уровнем на входе R */ IF (R) Q_BUS = "0X0"; /* сброс счётчика в 0 высоким уровнем на входе R */ == - условное равенство != - условное неравенство IF (R=="1") Q_BUS = "0X0"; /* Сброс шины высоким уровнем на входе R */ IF (A != B) Y = "0"; /* на выходе Y одноразрядного цифрового */ /* компаратора фиксируется неравенство узлов A и B */ IF (C == \") Q =D; /* загрузка в D-триггер данных по срезу C */ && - условное "И"; || - условное "ИЛИ" IF (R != "0") && (C == "/") Q = D; /* динамическая запись данных с входа D, если в текущий момент узел C переключился из 0 в 1 и нет команды сброса на входе R */ IF (R != "1") && (C == "\") && (Q_BUS != "0X9") Q_BUS = Q_BUS + "0X1" Фрагмент PML-модели двоично-десятичного счётчика
Условный оператор Шины в условных выражениях == - условное равенство; != - условное неравенство; > - больше; >= - больше или равно; < - меньше; B_BUS) || (A_BUS < B_BUS) Y = "0"; /* фрагмент PML-модели */ IF (A_BUS == B_BUS) Y = "1"; /* цифровой компаратор */ IF ([A3,A2,A1,A0] == [B3,B2,B1,B0]) Y = "1'; /* используется cat-узел */ IF (A_BUS == ["1","1","0","1"]) Q_BUS = "0XD"; Ключевого слова THEN нет Условное выражение всегда заключается в круглые скобки
Полный формат условного оператора IF (условное_выражение) оператор_1;/* часть 1 */ ELSE оператор_2;/* часть 2 */ OTHERWISE оператор_3; /* часть 3 */ Условный оператор предписывает программе выполнить следующие действия: Если значение условного выражения равно "1", то выполняется оператор_1 Если значение условного выражения равно "0", то выполняется оператор_2 В противном случае (OTHERWISE), если условное выражение равно "X", то выполняется оператор_3 На месте оператора_1, оператора_2 или оператора_3 может стоять список операторов, заключённый в фигурные скобки. IF (C == "/") {Q = D; NQ = ~D;}
Ключевое слово RETURN в условном операторе В условном операторе можно использовать ключевое слово RETURN, чтобы объявить о досрочном завершении PML- программы. Все последующие операторы в этом случае выполняться не будут. AND2 () INPUT IN1,IN2; OUTPUT OUT1(1,1,"D","D"); { IF (IN1&IN2=="1") {OUT1="1"; RETURN ;} IF (IN1&IN2=="0") {OUT1="0"; RETURN ;} OUT1 = "X"; }
Оператор выбора Оператор выбора (SELECT) присваивает значение узлу или шине, как только будет обнаружено первое истинное условное выражение. Имя_узла = SELECT FOR (условное_выражение_1) SET узловое_выражение_1 (PCL-список) FOR (условное_выражение_2) SET узловое_выражение_2 (PCL-список)... FOR (условное_выражение_n) SET узловое_выражение_n (PCL-список) OTHERWISE SET узловое_выражение_x (PCL-список) ; Оператор выбора является наивысшим достижением в языке PML и широко используется на практике. Приведём несколько простых примеров. Ключевое слово FOR в данном операторе означает "если".
PML-модель JK-триггера JKFF () INPUT J, K, C; OUTPUT Q; LOCAL Q_INT; { Q_INT=SELECT FOR (C=="\")&&(J&~K) SET "1"/* запись "1" */ FOR (C=="\")&&(~J&K) SET "0"/* запись "0" */ FOR (C=="\")&&(J&K) SET ~Q_INT/* счёт */ FOR (C=="\")&&(~J&~K) SET Q_INT;/* хранение */ Q=Q_INT; } Фактически оператор выбора копирует логическую таблицу работы триггера. Последняя строка не производит никаких действий (это режим хранения) и приведена в модели только для полноты картины. Её можно исключить без всяких печальных последствий.
PML-модель универсального регистра сдвига 555IR11 IR11 () INPUT D0,D1,D2,D3,DR,DL,S0,S1,C,R; OUTPUT Q0,Q1,Q2,Q3; LOCAL Q_INT[4]; { IF (R=="0") Q_INT="0X0"(5,5,"D","D"); /* асинхронный сброс */ ELSE IF (C=="/")&&(R=="1") Q_INT=SELECT FOR (S0&S1) SET [D3,D2,D1,D0](8,8,"D","D") /* загрузка */ FOR (~S0&S1) SET [DR,Q3,Q2,Q1](1,1,"D","D") /* сдвиг вправо */ FOR (S0&~S1) SET [Q2,Q1,Q0,DL](1,1,"D","D"); /* сдвиг влево */ Q3=Q_INT[3]; Q2=Q_INT[2]; Q1=Q_INT[1]; Q0=Q_INT[0]; }
PML-модель двоичного сумматора 555IM6 555IM6 () INPUT A0,A1,A2,A3, B0,B1,B2,B3, CRI; OUTPUT S0,S1,S2,S3, CRO; LOCAL S[5] (10,10,"D","D"); { S = [A3,A2,A1,A0] + [B3,B2,B1,B0] +[CRI]; S0=S[0]; S1=S[1]; S2=S[2]; S3=S[3]; /* "раскладываем" */ CRO=S[4]; /* шину S на отдельные узлы */ } [CRI] – это не узел, а одноразрядная шина. Язык PML позволяет суммировать шины разной ширины Выходные сигналы нельзя собрать в cat-узел: [CRO,S3,S2,S1,S0] = [A3,A2,A1,A0] + [B3,B2,B1,B0] +[CRI]; /* ошибка */
Подведём итог. Перечислим кратко особенности языка PML всего одиннадцать ключевых слов трёхзначный алфавит {0, 1, X} логическая сила: S > D > R > Z имитация задержек PCL-список Y = ~(A & B) (20, 22, D, Z) Ключевых слов BEGIN и END нет. Их заменяют фигурные скобки { } Большие и малые буквы не различаются Язык PML поддерживает только поведенческое и потоковое описания Разрешены локальные узлы и шины Шины определены только внутри PML-модели операция конкатенации – cat-узел: Q_BUS = [D4,D3,D2,D1]; динамическое управление IF (C == "/") Q = D;
Подведём итог. Перечислим кратко особенности языка PML В языке PML определены всего три оператора: присваивания, условный и выбора нет операции вычитания шинных сигналов Ключевого слова THEN в условном операторе нет: IF (R=="1") Q = 0000"; Условное выражение всегда заключается в круглые скобки: IF (A_BUS == ["1","1","0","1"]) Q_BUS = "0XD"; Язык PML позволяет суммировать шины разной ширины: S = [A3,A2,A1,A0] + [B3,B2,B1,B0] +[CRI]; Выходные сигналы нельзя собрать в cat-узел: [CRO,S3,S2,S1,S0] = [A3,A2,A1,A0] + [B3,B2,B1,B0] +[CRI]; /* ошибка */