#system-verilog #synplify
Вопрос:
В SystemVerilog Я МОГУ сделать
typedef logic [15:0] bus16;
typedef reg [15:0] reg16;
interface myif;
bus16 mybus;
wor [15:0] myotherbus;
endinterface
Но я НЕ МОГУ этого сделать
typedef wor [15:0] wor16;
interface myif;
wor16 myotherbus;
endinterface
Я получаю «тип объявления неизвестной переменной».
Похоже, по крайней мере, в моей версии Synplicity, ввод «wor» не разрешен.
Является ли это ограничением, определенным в спецификации IEEE1800, или, возможно, это ошибка?
Ответ №1:
SystemVerilog отделяет понятия типов сети/сети (которые похожи на разрешенные сигналы в VHDL) и переменных (неразрешенных) от типов данных. Типы сетей wire
wand
, wor
, и т.д. имеют встроенные функции разрешения с типом данных по умолчанию . logic
Следующие чистые объявления эквивалентны:
wor [15:0] w;
wor logic [15:0] w;
typedef logic [15:0] bus16;
wor bus16 w;
Аналогично, следующие объявления переменных эквивалентны:
logic [15:0] v;
var logic [15:0] v;
typedef logic [15:0] bus16;
var bus16 v;
bus16 v;
В большинстве мест var
ключевое слово неявно при объявлении переменных.
Существует nettype
объявление, которое связывает тип данных с определенной пользователем функцией разрешения. К сожалению, нет способа определить a nettype
с помощью одной из встроенных функций разрешения, поэтому вам придется написать свою собственную функцию или.
Комментарии:
1. Итак, вы говорите (в своем первом примере), что логика имеет подразумеваемую функцию, подобную wor?
2. @JasonM , да, проводной-или и проводной-и являются двумя встроенными функциями логического разрешения. Базовый
wire
-это просто победы с наивысшей силой.
Ответ №2:
Это запрещено, поскольку стандарт System Verilog не позволяет использовать nets
в typedef
s. Извините, другого объяснения нет.
Вы можете ознакомиться с синтаксисом в пункте 6.18. Следуйте data_type
определению. Он основан на системном верилоге var
s, но не включает net
s (6.8).
Вы можете определить новый тип сети с помощью nettype
конструкции, но она по-прежнему не позволяет использовать другие типы сетей. Однако вы можете создавать их с помощью пользовательского режима разрешения (проверьте 6.6.7). Это особый синтаксис и не подходит для простого переименования. Кстати, wor
ни то, ни другое не поддается синтезу.
Итак, вам лучше всего использовать макросы: `define wor16 wor[15:0]
Комментарии:
1. В моем мире «wor» можно синтезировать. Это приводит к появлению элемента ИЛИ для каждого из сигналов шины от каждого источника. Спасибо за совет и объяснение. Я новичок в SystemVerilog (я действительно знаю VHDL)