Обработка параметризации в пакетах SystemVerilog

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

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

package my_pkg;
    parameter ADDR_MSB = 7;
    parameter DATA_MSB = 31;

    typedef struct {
        logic [ADDR_MSB:0] address;
        logic [DATA_MSB:0] data;
    } simple_struct_t;

endpackage

Кто-нибудь нашел более чистый способ справиться с этим? Я хотел бы услышать об этом, поскольку я считаю, что пакеты - очень мощное дополнение к SV, позволяющее более безопасное повторное использование кода, но это ограничение довольно серьезное.


person JeffW    schedule 09.10.2010    source источник


Ответы (7)


У меня есть пара мыслей. Во-первых, я бы склонился к моделированию своих данных с использованием классов вместо структур. Классы могут быть параметризованы, динамически распределены, рандомизированы, содержат группы покрытия и т. Д. Я использую структуры только тогда, когда мне нужна упакованная структура. Упакованные структуры прекрасны, потому что вы можете назначить им как обычный вектор, а затем получить доступ к данным, используя именованные поля. Очень хорошо. :)

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

person Steve K    schedule 23.10.2010
comment
Достаточно справедливо, но меня больше интересовал код проектирования, а не код тестовой среды, и на сегодняшний день классы невозможно синтезировать. - person JeffW; 23.10.2010
comment
Также, что касается комментария к макросу, я не понимаю, как это на самом деле что-то меняет. Используя макросы или параметры, вы можете изменить код, чтобы переопределить или изменить значение во время компиляции. Фактически, для параметров это изменение значения может быть отложено на время разработки, которое является немного более гибким. В любом случае код сбивает с толку, поскольку используемое значение будет неочевидно для обозревателя. - person JeffW; 23.10.2010

Да я согласен. Это недостающая функция пакетов.

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

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

person GlobalReset    schedule 17.10.2010

Вы можете использовать параметризованные макросы для обозначения типа с определенной шириной:

`define SIMPLE_STRUCT(NAME) \
   simple_struct_t_``NAME``

`define SIMPLE_STRUCT_DEF(NAME, ADDR_MSB, DATA_MSB) \
 typedef struct { \
        logic [ADDR_MSB``:0] address; \
        logic [DATA_MSB:0] data; \
    } `SIMPLE_STRUCT(NAME)

Затем в каком-то месте вашего кода вы можете определить нужную структуру (ы):

`SIMPLE_STRUCT_DEF(narrow, 7, 31)
`SIMPLE_STRUCT_DEF(wide, 15, 63)

А затем используйте его там, где вам это нужно, используя только имя:

`SIMPLE_STRUCT(narrow) narrow1, narrow2;
narrow1.data = 0;
narrow2 = narrow1;
...
person Stan    schedule 31.08.2013

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

Пример есть на http://www.doulos.com/knowhow/sysverilog/tutorial/interfaces/

person Andy    schedule 19.03.2011
comment
Это должно быть хорошим обходным путем, но в спецификации есть некоторые несоответствия. В разделе интерфейса есть образец, который показывает доступ к типам в интерфейсе по иерархическому имени, например my_ifc.inner_type. Однако синтаксис этого не поддерживает - посмотрите на def data_type и type_identifier в синтаксисе; type_identifier - это простое имя (зависит от того, как обрабатывается разрешение типов). Я думаю, что синопсис, возможно, позволил это, но каденция не позволила примерно год назад в последнем. Так что используйте осторожно. - person JeffW; 20.03.2011

У меня был тот же вопрос, и мой коллега предложил следующее:

//defines.sv:

`ifndef MY_DEFINES
  `define MY_DEFINES
     `define TYPEDEF_VECTOR_T typedef logic [WIDTH-1:0] vector_t;
`endif

//mod_sub.sv:

`include "defines.sv"
module mod_sub #(parameter WIDTH = 32);
...
   `TYPEDEF_VECTOR_T
   vector_t some_reg;
...
endmodule

//mod_top.sv:

module mod_top;

   mod_sub #(.WIDTH(8))  mod_sub8;
   mod_sub #(.WIDTH(64)) mod_sub64;

endmodule

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

person user2382841    schedule 18.07.2013

Я бы не сказал, что это недостающая функция. То, что вы пытаетесь сделать, было сделано с помощью макросов в Verilog на протяжении десятилетий. Проблема в том, что вы должны быть довольно уникальными в том, как вы называете вещи, чтобы избежать конфликтов между пакетами. Это неприятно, но работает.

Параметры немного другие. Они предназначены для настройки от экземпляра к экземпляру (например, универсальные шаблоны VHDL). Либо на модулях для логики, либо на классах для стендов. Моя единственная критика в их адрес заключается в том, что как только вы начинаете их использовать, они имеют тенденцию распространяться по всей вашей иерархии, а синтаксис не совсем компактный. Тем не менее, очень мощный и отлично подходит для повторного использования кода.

person Paul S    schedule 08.11.2010
comment
Проблема здесь связана с параметризованными типами, которые используются в разных областях одного и того же проекта. Вы можете сделать их, как я показал выше, или вы можете использовать defines but neither works when different areas in the design require different param values for the same type (e.g. like a different address width). In theory you could use define и не забыть сбросить или undef после модуля компиляции, но полагаться на это, по моему опыту, вызывает проблемы. - person JeffW; 09.11.2010
comment
Это определенно недостающая функция! Добавление возможностей в язык, которые раньше были возможны только при довольно ужасных злоупотреблениях макросами (например, параметрами типа), постепенно делает HDL пригодными для использования ... Теперь, если бы только поставщики инструментов действительно поддерживали некоторые из этих функций;) - person Chiggs; 21.03.2014

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

См. Раздел 5.6.7 в: http://www.sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf

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

Может ли кто-нибудь убедиться, что это жизнеспособное решение? Спасибо!

person miles.sherman    schedule 03.09.2014
comment
Это работает в Synopsys DC. Я подал запрос в службу поддержки, чтобы это тоже было добавлено в Synplify. - person nachum; 29.01.2015
comment
Я вижу, как можно параметризовать аргументы функции, но как использовать это решение для параметризации структуры? - person Ari; 14.04.2015