Перейти к содержанию
    

Verilog. Параметризируемые функции.

Верилог:

вот давно мучает вопрос как бы написать функцию чтобы можно было указать локально для неё ширину входящих/выходящих данных при том чтобы для каждой копии эта ширина задавалась отдельно (т.е. какбы шаблон функции)

попробую пояснить: хочу например написать функцию взятия абсолютного значения

в файле function_package.v:

function bit[operand_width-2:0] abs (input bit[operand_width-1:0] operand);

...

endfunction

 

при этом если устаносить эту функцию в модуле все локальные для модуля переменные будут видны внутри функции, поэтому фокус с operand_width прокатывает

module x();

byte a;

localparam operand_width=$bits(a);

`include"function_package.v"

...

c=abs (.operand(a));

endmodule

 

module z();

int b;

localparam operand_width=$bits( b );

`include"function_package.v"

...

c=abs (.operand( b ));

endmodule

 

но при этом из сигнатуры функции не видно что она требует параметр ширины операнда, и как неотрывное приложение к испольхованию функции приходится постоянно прописывать localparam operand_width=... в каждом модуле где функция включена, а хотелось бы что-то наподобии

 

module x();

byte a;

`include"function_package.v"

...

c=abs #(.operand_width($bits(a))) (.operand(a));

endmodule

 

может есть какие-нибудь способы делать параметры локальными для функций?

спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Верилог:

вот давно мучает вопрос как бы написать функцию чтобы можно было указать локально для неё ширину входящих/выходящих данных при том чтобы для каждой копии эта ширина задавалась отдельно (т.е. какбы шаблон функции)

может есть какие-нибудь способы делать параметры локальными для функций?

спасибо

 

New Verilog-2001 Techniques for Creating Parameterized Models

(or Down With `define and Death of a defparam!)

Clifford E. Cummings

Sunburst Design, Inc.

 

Искать на www.sunburst-design.com

Если не найдете, могу прислать по почте...

Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

New Verilog-2001 Techniques for Creating Parameterized Models

(or Down With `define and Death of a defparam!)

Clifford E. Cummings

Sunburst Design, Inc.

 

Искать на www.sunburst-design.com

Если не найдете, могу прислать по почте...

Удачи!

так эта...там речь про совсем другое

вот в самом начале

Creating reusable models typically requires that

general-purpose models be written with re-definable

parameters such as SIZE, WIDTH and DEPTH.

With respect to coding parameterized Verilog models,

two Verilog constructs that are over-used and abused are

the global macro definition (`define) and the infinitely

abusable parameter redefinition statement (defparam).

This paper will detail techniques for coding proper

parameterized models, detail the differences between

parameters and macro definitions, present guidelines for

using macros, parameters and parameter definitions,

discourage the use of defparams, and detail Verilog-2001

enhancements to enhance coding and usage of

parameterized models.

параметризация модулей, а совсем не функций

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может мое мнение не "в струе" современных технологий программирования и начинал я с Verilog, а не VHDL

 

но нафига козе баян? в смысле параметризация функций для нетипизированного языка?

 

передавайте длину как еще один параметр (типа как strncmp в С) а входные выходные данные, как 32х битный int

 

конечно это не так круто, как библиотеки в VHDL, но в принципе работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

передавайте длину как еще один параметр (типа как strncmp в С) а входные выходные данные, как 32х битный int

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Очень жаль что в систем верилоге не ввели перегрузки функций (ведь сделали же перегрузку операторов), но это могло убить обратную совместимость. Или хотя бы сделать механизм констант времени исполнения.

 

Но, по крайней мере для фпга на верилоге должен проходить фокус с автоматическим приведением разрядности операторов. тогда можно было бы сделать 1 прототип функции с заведомо большей разрядность. Синтезаторы усекают такие вещи достаточно правильно (хотя с signed возможны проблемы).

 

Удачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поздновато конечно, но натолкнулся на такой случай.

 

сначала использовал типизацию для унификации функции, но получалось кривовато.

 

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

 

module scale #(parameter int iw = 8, ow = 8) (input logic [iw-1:0] i, output logic [ow-1:0] o);
  always_comb begin
    if (iw < ow) 
      o = {i, {ow-iw{1'b0}}};
    else // iw >= ow
      o = i[iw-1:iw-ow];
  end 
endmodule  

scale #($size(dat2scale),$size(dat4scale)) sc (dat2scale, dat4scale);

 

конечно для симуляции не пойдет, но для ртлного кода катит вполне %)

 

Удачи!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сначала использовал типизацию для унификации функции, но получалось кривовато.

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

такие костыли не новость. вот этого как раз и не хотелось: функция как блок комдинаторной логики читается в коде её вызывающем намного приятнее нежле отдель ностоящий инстанс модуля

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

такие костыли не новость. вот этого как раз и не хотелось: функция как блок комдинаторной логики читается в коде её вызывающем намного приятнее нежле отдель ностоящий инстанс модуля

 

 

таки нашел более менее красивое решение проблемы

 

interface sc #(parameter int iw = 8, ow = 8);
    
  function automatic logic [ow-1:0] scale (input logic [iw-1:0] i); 
    if (iw < ow) 
      scale = {i, {ow-iw{1'b0}}};
    else // if (iw >= ow)
      scale = i[iw-1:iw-ow];
  endfunction 

endinterface 

module pipa(a, b); 

    parameter integer aw = 20; 
    parameter integer bw = 10; 

    input wire [aw-1:0] a; 
    output wire [bw-1:0] b;     
    
    sc #($size(a), $size(b)) sc ();
    
    assign b = sc.scale(a); 

endmodule

 

PS. Но такое работает только в прецижене. Ква юзерс, даже не смотря на то что в хелпе указано

 

Quartus II Support for SystemVerilog 2005 -> Section 20—Interfaces -> 20.6 Tasks and functions in interfaces : Supported

 

могут не обольщаться %(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

таки нашел более менее красивое решение проблемы

остроумно. респект. :)

я вроде б в повестках дня нового стандарта видел вопрос о параметризации функций. проверю ещё раз, если нет, напишу в коммитет писмецо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

таки нашел более менее красивое решение проблемы

 

..........

 

PS. Но такое работает только в прецижене. Ква юзерс, даже не смотря на то что в хелпе указано

 

Quartus II Support for SystemVerilog 2005 -> Section 20—Interfaces -> 20.6 Tasks and functions in interfaces : Supported

 

могут не обольщаться %(

 

Действительно круто :) :a14:

а то что не пашет в ква, то это ничего старый метод с инклудом есть или просто ждать когда в ква "всё хорошо будет" :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

таки нашел более менее красивое решение проблемы

 

interface sc #(parameter int iw = 8, ow = 8);
    
  function automatic logic [ow-1:0] scale (input logic [iw-1:0] i); 
    if (iw < ow) 
      scale = {i, {ow-iw{1'b0}}};
    else // if (iw >= ow)
      scale = i[iw-1:iw-ow];
  endfunction 

endinterface 

module pipa(a, b); 

    parameter integer aw = 20; 
    parameter integer bw = 10; 

    input wire [aw-1:0] a; 
    output wire [bw-1:0] b;     
    
    sc #($size(a), $size(b)) sc ();
    
    assign b = sc.scale(a); 

endmodule

 

удивительно, сейчас просматривал переписку коммитета по этому вопросу и как раз перед выходом стандарта в 2005 году была жаркая дискуссия по вопросу параметризируемости функций (решили эту идею в стандарт тогда не вводить - мало времени оставалость). и самымы элегантным элегантным способом решения этой задачи признали именно решение с использованием интерфейсов :)

судя по всему (из переписки) эта проблема останется без элегантного решения и в нововом стандарте - а жаль (вот в новом ВХДЛ разрешено параметризировать очень много всего /даже пакеты/)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... сейчас просматривал переписку коммитета по этому вопросу ..........

 

Если не секрет а как можно подписаться на подобную переписку ?

Вообще что касается параметризуемости функций то мне кажеться это удобной, но не критичной фичей.

 

Ведь наиболее всего это нужно для синтеза, а т.к. синтезируемая функция/таск исполняется атомарно (как я понял в bluspec SV таск может быть не атомарным), то это ограничивает количество слоев логики (сложность функции). Если потребуется разогнать частоту и затык будет именно в этой функции, то все равно потребуется разрабатывать модуль с другой реализацией.

 

Для тестирования при наличии параметризуемых классов подобные возможности вообще не нужны %)

 

судя по всему (из переписки) эта проблема останется без элегантного решения и в нововом стандарте - а жаль (вот в новом ВХДЛ разрешено параметризировать очень много всего /даже пакеты/)

 

А что драфт стандарта (именно стандарта, а не обзорные статьи/презенташки) уже выложили ?

 

Сев за SV+DPI я перестал интересоваться альтернативными ХДЛ языками и немного не в теме :)

 

Хотя судя по публикациям того же ментора будующее за С++ и SV + OVM %))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не секрет а как можно подписаться на подобную переписку ?

как подписаться, не знаю. сейчас вообще деятельность комитета не для простых смертных, поэтому приходится пользоваться методами аналитической разведки (процесс, согласитесь не для слабонервных :) ). http://www.eda-stds.org/sv-bc/hm/ - вот на этой страничке наиболее компактно размещены сведения по их мыльной переписке (есть база данных рассматримаемых вопросов, но она закрыта; удалось с этого же сайта достать Draft 6 в pdf-ке, но он закрыт паролем - сейчас пытаюсь декриптовать, но боюсь не достаточно имею навыков для этого).

Вообще что касается параметризуемости функций то мне кажеться это удобной, но не критичной фичей.

 

Ведь наиболее всего это нужно для синтеза, а т.к. синтезируемая функция/таск исполняется атомарно (как я понял в bluspec SV таск может быть не атомарным), то это ограничивает количество слоев логики (сложность функции). Если потребуется разогнать частоту и затык будет именно в этой функции, то все равно потребуется разрабатывать модуль с другой реализацией.

да некритичной, но практика показала, что некоторые комплексные арифметические операции намного ускоряются за счёт ручного побитового доведения их до ума. и даже такая примитивная функция как взятие абсолютного значения числа при исполнение его как XOR со знаковым разрядом с последующим суммированием с ним даёт значительное сбережение ресурсов и разгон логики по сравнению с "программистским" вариантом исполнения abs().

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

(кстати, самый простой пример необходимости параметризации функции - это переворачивание шины

как было бы удобно иметь средства для написания нечта подобного этому:

function #(parameter bus_width=8) bit [bus_width-1:0] bus_flip (bit [bus_width-1:0] bus);

for (int i=0; i<bus_width; i++) bus_flip=bus[bus_width-1-i];

endfunction

)

как видите о таком благе как неатомарность речи нет, а даже такую простецкую атомарность некриво описать не возможно

 

А что драфт стандарта (именно стандарта, а не обзорные статьи/презенташки) уже выложили ?

нет не выложили. этот коммитет тоже хорошо забарикадировался. к тому же у меня есть ощущение, что новый ВХДЛ ранше 4ого квартала тоже не появится. но даже по тому, что есть, понятно, что новый ВХДЛ не дотягивает по своей функциональности даже до SV-2005. кроме публикашек, если вы заметили по ветке с обсуждением нового стандарта на ВХДЛ, уже появилась книжка обсуждающая все его новшества и то, что отложено на следующий за ближайшим стандарт (классы, рандомизация, AVM-библиотека, функциональное покрытие и все их последствия для методики)

 

Сев за SV+DPI я перестал интересоваться альтернативными ХДЛ языками и немного не в теме

Хотя судя по публикациям того же ментора будующее за С++ и SV + OVM %))

ну, конечно, SV+DPI=sila, но нос по ветру всё равно держать нужно

на счёт публикаций того же ментора о будущем, которое за С++, то это нескромный, достаточно беспочвенный маркетинговый ход для Катапульты (но это сильно в оффтопик, если хотите могём пофлудить в соответствующей ветке о Катапульте или о недавней московской выставке EDA)

 

респект

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да некритичной, но практика показала...

 

за линк спасибо, будет время покурю немного.

 

очень странно, на вхдл я сравнивал синтез в симплифае 3-х видов операции abs:

 

1. y <= x ^ sign(x) + sign(x)

2. y <= (x < 0) ? -x : x

3. y <= abs(x)

 

результат синтеза был одинаков на верилоге не пробывал, похоже что от синтезатора зависит,

 

о практической актуальности я не спорю что введение параметров в функции дело нужное, но не смертельное %) Кстати как вариант можно было пойти по ВХДЛ пути, благо до атрибутов векторов стало возможным достучаться, а автоматическое приведение близких типов было отродясь.

 

нос по ветру всё равно держать нужно ....

пофлудить в соответствующей ветке о Катапульте или о недавней московской выставке EDA)

 

Работы много, времени не хватает %(, Для начала надо полностью DPI и OVM освоить, а там можно и дальше пойти.

 

Насчет пофлудить я поставил себе катапульту, попробую какую нить математику на ней сделать. после этого можно и пофлудить. %)

 

и вам Удачи!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...