Jump to content

    

Особенности аппаратного синтеза конструкций Verilog

Приветствую! Нужна литература. Видимо с английским у меня все плохо: не могу грамотно сформулировать вопрос гуглу. Потому прошу подсказать литературу. Device Handbook и "Recommended HDL Coding Styles" уже прочитаны. Хочется большего.

Суть вопроса. В силу аппаратных особенностей ПЛИС (структура LE, LUT, LAB) некоторые конструкции синтезируются оптимальным образом, достигается максимальное быстродействие и плотность упаковки, а какие-то нет. Например, если в триггере логического элемента есть асинхронный сброс, то конструкция:

always @ (posedge reset or posedge clk)
        if(reset)
            q <= 0;
        else 
            q <= x;

Займет один LAB, но если добавить еще и асинхронную установку, то схема займет уже 4 LE:

always @ (posedge reset or posedge set or posedge clk)
        if(reset)
            q <= 0;
        else if (set)
            q <= 1;
        ekse    
            q <= x;

 

А вот если set убрать из списка чувствительности, то опять 1 LE.

Или как лучше оформить выражение, что бы был задействован вход ENA триггера, а не обратная связь?

И много подобны вопросов.

Оно мне понятно почему и как, но где об этом почитать подробнее? Кое-что есть в "Advanced Synthesis Cookbook", но это для Stratix. Уж очень он от Cyclone отличается.

 

Share this post


Link to post
Share on other sites
но где об этом почитать подробнее?

хэндбук на целевую плис. там чтения минут на 20 и 10 минут пораскинуть мозгами

Share this post


Link to post
Share on other sites
Приветствую! Нужна литература. Видимо с английским у меня все плохо: не могу грамотно сформулировать вопрос гуглу. Потому прошу подсказать литературу. Device Handbook и "Recommended HDL Coding Styles" уже прочитаны. Хочется большего.

Суть вопроса. В силу аппаратных особенностей ПЛИС (структура LE, LUT, LAB) некоторые конструкции синтезируются оптимальным образом, достигается максимальное быстродействие и плотность упаковки, а какие-то нет. Например, если в триггере логического элемента есть асинхронный сброс, то конструкция:

always @ (posedge reset or posedge clk)
        if(reset)
            q <= 0;
        else 
            q <= x;

Займет один LAB, но если добавить еще и асинхронную установку, то схема займет уже 4 LE:

always @ (posedge reset or posedge set or posedge clk)
        if(reset)
            q <= 0;
        else if (set)
            q <= 1;
        ekse    
            q <= x;

 

А вот если set убрать из списка чувствительности, то опять 1 LE.

Или как лучше оформить выражение, что бы был задействован вход ENA триггера, а не обратная связь?

И много подобны вопросов.

Оно мне понятно почему и как, но где об этом почитать подробнее? Кое-что есть в "Advanced Synthesis Cookbook", но это для Stratix. Уж очень он от Cyclone отличается.

Ваш случай может происходить, например, из-за неоптимального (с точки зрения архитектуры) приоритета между set и reset. С этой точки зрения полезно поглядеть темплейты - там все эти тонкости учтены.

 

Share this post


Link to post
Share on other sites
Ваш случай может происходить, например, из-за неоптимального (с точки зрения архитектуры) приоритета между set и reset. С этой точки зрения полезно поглядеть темплейты - там все эти тонкости учтены.

Я бы не стал доверять темплейтам, как-то раз захотел взять оттуда знаковый сумматор, а там флаг переноса объявлен как unsigned, и без приведения суммируется со знаковыми операндами. А мы ведь знаем, что в Verilog, если хотя бы один аргумент выражения беззнаковый, то и результат будет беззнаковым, и сумматор в итоге неверно распространял знаковый разряд. Обида прошла, но осадочек остался. Кроме того, Template не всегда учитывают архитектуру: им все равно, 4-х входовый LUT у ПЛИС, или 6-ти ... А разница существенна. Плюс, в некоторых архитектурах в LE включены выделенные полные сумматоры, а в некоторых нет. Так на стратикс можно одновременно складывать три вектора, а вот в циклоне, лучше конвейер сделать, если, конечно, важно быстродействие.

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

Share this post


Link to post
Share on other sites
Потому прошу подсказать литературу. Device Handbook и "Recommended HDL Coding Styles" уже прочитаны. Хочется большего.

Quartus Prime Standard Handbook v15.1.1, стр. 778:

Avoid Asynchronous Register Control Signals

Avoid using an asynchronous load signal if the design target device architecture does not include registers with dedicated circuitry for asynchronous loads.

Also, avoid using both asynchronous clear and preset if the architecture provides only one of these control signals.

Some Altera devices directly support an asynchronous clear function, but not a preset or load function.

When the target device does not directly support the signals, the synthesis or placement and routing software must use combinational logic to implement the same functionality.

In addition, if you use signals in a priority other than the inherent priority in the device architecture, combinational logic may be required to implement the necessary control signals.

Combinational logic is less efficient and can cause glitches and other problems; it is best to avoid these implementations.

Share this post


Link to post
Share on other sites

blackfin, спасибо за участие, но как раз про каналы асинхронного сброса мне известно из "Recommended HDL Coding Styles" (по сути часть той же книжки, что вы предложили).

Вот сейчас мучает вопрос.

В LAB есть так называемые LAB-Wide сигналы, так сказать широковещательные сигналы в пределах одного LAB. Среди них сигнал синхронной загрузки, сигнал синхронной очистки сигнал разрешения и другие (всего их 8). Когда делаешь HDL описания триггера (или регистра) и используешь эти сигналы у компилятора два пути, он может для создания этого функционала использовать LUT, а может непосредственно LAB-Wide. В книжке написано, что для того, что бы были задействованы именно LAB-Wide нужно делать описание с учетом приоритетов этих сигналов (имеется ввиду цепочка if (aclr).. else if(ena)...else if ... ), но у меня никак не получается задействовать эти сигналы и высвободить LUT.

    always @(posedge clk or posedge aclr)
    if (aclr)
        q <= 1'b0;
    else if(ena)
        if (sclr)
            q <= 0;
        else 
            q <= d;

Что я делаю не так?

Share this post


Link to post
Share on other sites
Что я делаю не так?

Ндя. мыши плакали, кололись....... (с) Сразу сказал вам, читайте хендбук и немного подумайте. В хендбуке черным по белому написано с какими кубиками вы работаете. Например для сыклона 3

 

Cyclone III Device Handbook -> 2. Logic Elements andLogic Array Blocks in Cyclone III Devices -> LABs -> Topology

Each LAB consists of the following features:

16 LEs

 

Cyclone III Device Handbook -> 2. Logic Elements and Logic Array Blocks in Cyclone III Devices -> LABs -> LAB Control Signals

Each LAB contains dedicated logic for driving control signals to its LEs. The control signals include:

 

Two clocks

Two clock enables

Two asynchronous clears

One synchronous clear

One synchronous load

 

You can use up to eight control signals at a time. Register packing and synchronous load cannot be used simultaneously. Each LAB can have up to four non-global control signals. You can use additional LAB control signals as long asthey are global signals.

 

Synchronous clear and load signals are useful for implementing counters and other functions. The synchronous clear and synchronous load signals are LAB-wide signals that affect all registers in the LAB.

 

Each LAB can use two clocks and two clock enable signals. The clock and clock enable signals of each LAB are linked. For example, any LE in a particular LAB using the labclk1signal also uses the labclkena1. If the LAB uses both the rising and falling edges of a clock, it also uses both LAB-wide clock signals. Deasserting the clock enable signal turns off the LAB-wide clock.

 

Смысл квартусу "убивать" 15 ть LE (т.к. их регистры после этого уже нельзя использовать), ради одного вашего триггера, если он может спокойно реализовать то, что вам надо, на люте?

Share this post


Link to post
Share on other sites
Ндя. мыши плакали, кололись....... (с) Сразу сказал вам, читайте хендбук и немного подумайте. В хендбуке черным по белому написано с какими кубиками вы работаете. Например для сыклона 3

 

Смысл квартусу "убивать" 15 ть LE (т.к. их регистры после этого уже нельзя использовать), ради одного вашего триггера, если он может спокойно реализовать то, что вам надо, на люте?

В общем, мыши -- странный народец.

Хендбук читал и думал ... много. С архитектурой ячеек знаком. В том-то и дело, что проблема возникла не на сферическом триггере в вакуме, а с многоразрядными регистрами. Какой смысл квартусу "убивать" 16 ть LUT, если их можно заменить одной LAB-Wire ?

Share this post


Link to post
Share on other sites
В том-то и дело, что проблема возникла не на сферическом триггере в вакуме, а с многоразрядными регистрами. Какой смысл квартусу "убивать" 16 ть LUT, если их можно заменить одной LAB-Wire ?

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

Share this post


Link to post
Share on other sites

А что за use case такой, где надо иметь и асинхронный сброс и асинхронную установку?

 

Вообще есть рекомендации по написанию синтезируемого кода. Могу ошибаться, с Альтерой давно не работал, но Xilinx явно не рекомендует больше одного сброса/установки на триггер. Всё, что больше одного, имитируется с помощью увеличения LUT/FF Usage.

Share this post


Link to post
Share on other sites
но Xilinx явно не рекомендует больше одного сброса/установки на триггер.

от семейства ПЛИС зависит

Share this post


Link to post
Share on other sites
от семейства ПЛИС зависит

+1. Все древние семейства - APEX20K, FLEX10K, FLEX8000, FLEX6000, MAX7000, MAX3000A, MAX5000 - имели в каждом триггере из LE два отдельных сигнала для асинхронного сброса (CLRN) и установки (PRN).

Share this post


Link to post
Share on other sites
А что за use case такой, где надо иметь и асинхронный сброс и асинхронную установку?

 

Вообще есть рекомендации по написанию синтезируемого кода. Могу ошибаться, с Альтерой давно не работал, но Xilinx явно не рекомендует больше одного сброса/установки на триггер. Всё, что больше одного, имитируется с помощью увеличения LUT/FF Usage.

Это был пример аппаратно зависимого синтеза. Алтера не рекомендует использовать одновременно асинхронный и синхронный сброс, это написано в хендбуке.

Вопрос в другом. В идеале хочется делать код, который по минимуму зависит от платформы, а на практике получается, что для того, что бы все улеглось в кристалл оптимальным (по плотности и/или быстродействию) образом, требуется учитывать архитектуру. Причем реализации будут так нехило отличаться (сравниваю Stratix и Cyclone). Я удивлен? Нет, я не удивлен. Просто просил помощи с литературой, где были бы эти особенности доступно описаны. Хендбуки прочитаны, и на ПЛИС и на Квартус. Рекомендованные дизайны изучены. Вопросов осталось много. Как бы эти непонятки реализации текущего проекта не мешают, но хочется разобраться. Поэтому, в свободное время экспериментирую, составляю конспект.

 

 

Share this post


Link to post
Share on other sites

Как показала практика, если код изначально написан вдумчиво, то он одинаково быстр и компактен, что на Альтере, что на Ксайлинкс одинаковых поколений. Единственно, у Ксайлинкса есть локальная память внутри плитки. А у Альтеры она появилась лишь в последних семействах. Да и то, не совсем прямая. В результате, некоторый код на Ксайлинкс занимает значительно меньше места. И с Альтерой так не прокатит, как ни переписывай.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this