Почему проводной или тип сигнала (wor) запрещен для типов в SystemVerilog

#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)