Несинтезируемые конструкции


 

НЕСИНТЕЗИРУЕМЫЕ VHDL-КОНСТРУКЦИИ

Отсутствие поддержки VHDL-конструкции при синтезе понимается следующим образом: если проектировщик употребил в VHDL-программе не синтезируемую конструкцию, то синтезатор выдаст сообщение об ошибке и логическая схема, реализующая то же поведение, что и VHDL-программа, не будет построена.

 

Примеры синтезируемых и не синтезируемых VHDL-конструкций приведены для

  • синтезатора XST (версия 8.1i), входящего в состав САПР XILINX ISE;
  • синтезатора LeonardoSpectrum, далее сокращенно именуемого Leonardo (версия 2005a.82), разработанного фирмой Mentor Graphics.

 

1.Операции над типом real не поддерживаются при синтезе
2. Ограничения на атрибуты выделения фронтов сигналов
3. Ограничения для операторов /, rem, mod
4. Ограничения оператора ** (возведение в степень)
5. Охраняемый блок
6. Назначение сигнала
7. Сигналы типа register, bus
8. Ключевое слово disconnect не поддерживается
9. Сигналы, декларированные в пакете
10. Разделяемые переменные
11. Ключевое слово after игнорируется при синтезе
12. Операции над файлами не поддерживаются при синтезе
13. Атрибуты, определенные пользователем
14. Ограничения на инициализацию значений
15. Ограничения использования оператора цикла loop
16. Ограничения на использование оператора wait
17. Сравнение синтезаторов Leonardo и XST

 



1. Тип real не поддерживается при синтезе

 

—  VHDL-код, не синтезируемый в Leonardo

—  VHDL-код, не синтезируемый в XST

 

entity exp1_real is

port(

b1 : in  real range 2.0 to 3.14;

— ошибка (тип real не поддерживается при синтезе)

b2 : in  real range -2.0 to 4.77;

b3 : out real range -4.0 to 8.00);

end exp1_real;

architecture str1 of exp1_real is

begin

b3 <= b1 + b2;

end str1;

 

Декларация типа real   является не синтезируемой конструкцией (ошибкой).

 

2. Ограничения на атрибуты выделения фронтов сигналов

 

—  VHDL-код, синтезируемый в Leonardo

—  VHDL-код, не синтезируемый в XST

 

entity while_loop is

port (inp_sig : in bit_vector (3 downto 0);

ena : in bit;

result : out bit_vector (3 downto 0));

end while_loop;

 

architecture example of while_loop is

begin

process

variable i : integer;

begin

i := 0;

while (i<4)  loop

result (i) <= ena and inp_sig(i);

i := i + 1;

end loop;

wait until (inp_sig = “1010”) ;

end process;

end example;

 

Синтезатор XST не синтезирует логическую схему, Leonardo – синтезирует. Все дело в условии (inp_sig = “1010”) ожидания в операторе wait: для синтезатора XST не допускается использования векторов в условиях для wait. Если использовать однобитные сигналы, то XST схему синтезирует.

В синтезаторе XST оператор wait может использоваться в следующем виде:

 

wait [on clock_signal] until [clock_signal’event | not clock_signal’stable) and clock_signal= {‘0’|’1’};

 

—  VHDL-код, синтезируемый в Leonardo

—  VHDL-код, не синтезируемый в XST

library IEEE;

use IEEE.std_logic_1164.all;

entity event is

port (CLK, D : in  std_logic;

Q1 : out std_logic;

Q2 : out boolean);

end;

architecture RTL of event is

begin

process (CLK)

begin

if (CLK’event and CLK = ‘1’) then    — триггер

Q1 <= D;

end if;

Q2 <= (CLKevent and CLK = 0);инвертор

— не синтезируемая конструкция для синтезатора XST

end process;

end RTL;

 

 

—  VHDL-код, не синтезируемый в Leonardo

—  VHDL-код, не синтезируемый в XST

 

library IEEE;

use IEEE.std_logic_1164.all;

entity event1 is

port (CLK, Rst, D : in  std_logic;

Q1 : out std_logic;)

end;

architecture RTL of event1 is

begin

process (CLK,Rst)

begin

if (CLK’event and CLK = ‘1’ and Rst=’0’) then

— в выражении с атрибутом используются два сигнала CLK, Rst

Q1 <= D;

end if;

end process;

end RTL;

 

3. Ограничения для операторов /, rem, mod

 

Выражения

 

c <= a /(-2);          –error

d <= b rem (3);        –error

e <= x mod (5);        –error

 

рассматриваются как ошибки и схемы не синтезируются.

В синтезируемых конструкциях  в выражениях

 

c <= x / y;

d <= x rem y;

e <= x mod y;

 

значение y должно быть 2N, N=0,1, 2, … .



4. Ограничения оператора ** (возведение в степень)

 

Оператор

 

c <= a**(2); –error

 

приводит к ошибке в XST и в Leonardo. В обоих синтезаторах только число 2 можно возводить в степень:

 

c <= 2**(N); — good

 

где N целое положительное число типа integer.

 

В Leonardo можно схемно реализовать оператор c <= 2**(N);, если N30.  Чтобы работать в Leonardo с большей размерностью N типа integer, требуется подключение пакетов, например, пакета NUMERIC_STD. Все описанные в пакете NUMERIC_STD функции поддерживаются при синтезе, кроме функций {/, rem, mod}, которые синтезируются только в случаях, когда делитель равен 2N.

В отличие от Leonardo, синтезатор XST реализует оператор

 

c <= 2**( N);

 

для N> 30.

 

 

5. Охраняемый блок

 

—  VHDL-код, синтезируемый в Leonardo

—  VHDL-код, не синтезируемый в XST

 

entity guard is

port(

x1, x2, x3, x4, x5, x6 : in bit;

v, w : out bit);

end guard;

architecture str of guard is

begin

p1: block ((x5 and x6 )=’1′)

— охраняемый блок

begin

v <= guarded (x1 or x2);

w <= guarded (x3 xor x4);

end block;

end str;

 

6. Назначение сигнала

В XST поддерживаются операторы назначения сигнала с ключевым словом transport, и не поддерживаются – со словом guarded (охраняемый).

В Leonardo таких ограничений нет.

 

7. Сигналы типа register, bus

Синтезатор XST не поддерживает типы register, bus, а синтезатор Leonardo – поддерживает.

 

—  VHDL-код, синтезируемый в Leonardo

—  VHDL-код, не синтезируемый в XST

library IEEE;

use IEEE.STD_LOGIC_1164. all;

entity reg is

port(

x1, x2, x3, x4  : in std_logic_vector (0 to 3);

z : out std_logic_vector (0 to 3));

end reg;

architecture beh of reg is

signal y1 :  std_logic_vector (0 to 3) register;

— сигнал y1 типа register

signal y2 :  std_logic_vector (0 to 3) bus;

— сигнал y2 типа bus

 

begin

y1 <=   x1 and x2;

y2 <=  x3 or x4;

z <=   y1 xor y2;

end beh;



8. Ключевое слово disconnect не поддерживается

Синтезаторы XST и Leonardo не поддерживают ключевое слово disconnect.

 

9. Сигналы, декларированные в пакете

Синтезатор Leonardo не поддерживает такие декларации, синтезатор XST – поддерживает.

 

—  VHDL-код, не синтезируемый в Leonardo

—  VHDL-код, синтезируемый в XST

 

package pack is

signal C1 : bit;   декларация сигнала C1

end pack;

 

package body pack is

end pack;

Library work;

use work.pack.all;

entity adder_2 is

port (a1, b1, a2,b2 : in  BIT;

c2,s2,s1 : out BIT);

end adder_2;

architecture struct_1 of adder_2 is

component

add1 port (b1,b2: in BIT;

c1,s1: out BIT);

end component;

component  add2 port(c1, a1,a2:in BIT;

c2,s2:out BIT);

end component;

— signal c1:BIT := ‘1’; — сигнал декларирован в пакете pack

begin

circ1: add1 port map (b1, b2, c1, s1);

circ2: add2 port map (c1, a1, a2, c2, s2);

end struct_1;

 

В листинге приведено структурное описание схемы, внутренний сигнал С1 которой декларирован в пакете pack. Заметим, что если внести в описание строку, являющуюся комментарием (в VHDL каждая строка комментария начинается с двух символов “–”) и не использовать пакет pack, то и для Leonardo описание станет синтезируемым. Очевидно, что оба синтезатора потребуют функциональные описания компонент add1, add2 для полноты проекта.

 

10. Разделяемые переменные

 

—  VHDL-код, не синтезируемый в Leonardo

—  VHDL-код, не синтезируемый в XST

 

entity example_1_shared is

port(

x1 : in integer;

y1, y2 : out integer);

end example_1_shared;

architecture beh of example_1_shared is

shared variable COUNT : Integer;

— переменная COUNT разделяемая

begin

p1: process (x1)

begin

COUNT := 1;

y1 <= x1 + COUNT;

end process;

p2: process (x1)

begin

COUNT := 3;

y2 <= x1 + COUNT;

end process;

end beh;

Разделяемая (shared) переменная COUNT используется в двух процессах p1, p2, однако при синтезе появляется противоречие, связанное с употреблением этой переменной. Естественно, если в каждом процессе использовать свою локальную переменную, например, COUNT1 –  для процесса p1, COUNT2 –  для процесса p2, то описание будет синтезируемым.

 

11. Ключевое слово after игнорируется при синтезе

Игнорируется – это значит пропускается, как будто этого слова вовсе и нет. Это справедливо для обоих синтезаторов – Leonardo и XST.

Например, оператор

 

Y <= X1 or X2 or X3 after 30 ns;

 

в процессе  синтеза заменяется 3-входовым дизъюнктором, который имеет задержку, например, 3 ns – это реальная задержка логического элемента из технологической библиотеки. Таким же логическим элементом (с задержкой 3 ns) будет заменен оператор

 

Y <= X1 or X2 or X3 after 1 ns;

 

Даже в этом простейшем примере видно, что поведение во времени исходной алгоритмической модели будет отличаться от поведения синтезированной логической схемы.

 

12. Операции над файлами не поддерживаются при синтезе

Данные операции используют ключевые слова VHDL: file (файл), accsess – (доступ).

 

 

13. Атрибуты, определенные пользователем

Синтезатор XST не поддерживает такие атрибуты, синтезатор Leonardo – поддерживает.

 

—  VHDL-код, синтезируемый в Leonardo

—  VHDL-код, не синтезируемый в XST

 

entity attr is

port( a : in bit_vector (0 to 5);

b : out integer); end;

architecture beh of attr is

attribute two_length : integer;

attribute two_length  of a : signal is (a’length) * 2;

begin

b  <= a’two_length ;

end;

Атрибут two_length является примером атрибута, определенного пользователем. Синтезатор Leonardo получает схемную реализацию константы 12 (удвоенная длина массива). Логическая схема состоит из элементов, реализующих логический нуль и логическую единицу.

 

14. Ограничения на инициализацию значений

Игнорируются инициальные значения сигналов в разделе декларации сигналов архитектурного тела.

Игнорируются инициальные значения портов OUTPUT, INOUT в интерфейсе объекта проекта, т.е. в entity.

В операторе процесса игнорируются инициальные значения переменных в разделе деклараций переменных.

 

15. Ограничения использования оператора цикла loop

 

Циклы поддерживаются, если цикловые переменные ограничены константами.

 

—  VHDL-код,   не синтезируемый в Leonardo

—  VHDL-код, не синтезируемый в XST

 

entity control_loop1  is

port (a: bit_vector (0 to 3);

c : natural;

d: out    natural);

end control_loop1;

 

architecture example of control_loop1  is

begin

process (a)

variable b: bit;

variable s: natural;

begin

b := ‘0’;

s:= 0;

for i in 0 to c loop

b:= a(1) and b;

— правая граница c  цикловой переменной i не является константой

 

end loop;

if (b=’1′) then s:=s+1;

else null;end if;

d <= s;

end process;

 

end example;

 

 

—  VHDL-код, синтезируемый в Leonardo

—  VHDL-код, синтезируемый в XST

 

entity control_loop is

port (a: bit_vector (0 to 3);

m: out bit_vector (0 to 3));

end control_loop;

 

architecture example of control_loop is

begin

process (a)

variable b: bit;

begin

b := ‘1’;

for i in 0 to 3 loop

— цикловая переменная i ограничена константой 3

b:= a(3-i) and b;

m( i ) <= b;

end loop;

end process;

end example;

 

 

16. Ограничения на использование оператора wait

Выражение в условии until оператора wait должно определять передний или задний фронт.

Многократные операторы wait допускаются в операторе процесса, однако условия ожидания должны быть одинаковыми.

 

—  VHDL-код, не синтезируемый в Leonardo

—  VHDL-код, не синтезируемый в XST

 

library IEEE;

use IEEE.std_logic_1164.all;

 

entity wait_pro is

port(

x1, x2, x3, x4 : in std_logic;

y, w, v : out std_logic);

end wait_pro;

 

architecture beh of wait_pro is

begin

p0 : process

begin

wait until  x3 = ‘1’;

y <= x1 or x2;

wait until  x3 = ‘1’;

v <= x1 and x2;

wait until  x4 = ‘1’;   — условия ожидания должны

—   быть одинаковыми

w <= x1 xor x2;

end process;

end beh;

 

Для синтезатора XST оператор wait не может быть внутри цикла (оператор цикла может быть в процессе, функции, процедуре), для Leonardo – может.

 

17. Сравнение синтезаторов Leonardo и XST

 

Знак “–” соответствует запрещенной для синтеза конструкции;

знак “+” соответствует синтезируемой конструкции;

знак “#” указывает на различное понимание синтезируемости конструкции в сравниваемых синтезаторах XST, Leonardo.

 

VHDL-конструкция Синтезатор

XST

Синтезатор

Leonardo

real
file, accsess
allocator
disconnect
guarded +
register +
bus +
linkage
group +
wait (#) (#)
loop + +
x/a; x rem a; x mod a;

(a=2N, N=0,1, 2, …)

+ +
2**N (#) (#)
a**(N)
Декларация сигнала в пакете +
Атрибут, определенный пользователем +
after игнорируется игнорируется

 

Контактная информация:

Автор идеи и контента: Бибило П.Н.
Разработчики: Голанов В.А., Зарембо Д.В.
На основе Wordpress CMS

Статистика за сегодня:

Сайт размещен на сервере ОИПИ НАН Беларуси