назначение в SystemVerilog, ошибка компиляции - токен «назначить» - PullRequest
0 голосов
/ 30 октября 2018

У меня есть этот код:

integer [31:0]R;
integer [15:0]R_f1;
integer [15:0]R_f2;

assign R_f1 = R[15:0];
assign R_f2 = R[31:16];

Но он не скомпилирован из-за assign. Какие изменения мне нужно сделать? Это также может быть в заголовочном файле.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018
  1. В зависимости от используемого вами языка. В verilog только типы сетей могут быть назначены с помощью непрерывного назначения. integer не является сетевым типом, поэтому эти назначения не допускаются в verilog. Я полагаю, вы скомпилировали свой код в режиме verilog и получили сообщение об операторах присваивания.
  2. Также не допускаются упакованные размеры на integer типах. Итак, следующая декларация недопустима: integer [31:0]R;. Некоторые компиляторы просто игнорируют объявление. В любом случае все целые числа имеют ширину 32 бита.

Итак, чтобы исправить это в режиме verilog, вместо него можно использовать always @*:

integer R = 10;  
integer R_f1;
integer R_f2;

always @* R_f1 = R[15:0];
always @* R_f2 = R[31:16];

Хотя, исходя из звучания вашего первоначального вопроса, вам нужно использовать другой тип данных, который позволяет вам иметь реальные векторы. В verilog они reg и один из типов сети, т.е. wire. С wires вы можете использовать оператор assign, с reg вы должны всегда использовать блоки. Примерно так:

reg[31:0] R = 10;   
reg[15:0] R_f1;
reg[15:0] R_f2;

always @* R_f1 = R[15:0];
always @* R_f2 = R[31:16];

Поскольку вы пометили свой вопрос как системный verilog, вы можете использовать один из системных типов verilog, то есть logic или bit. Если вы используете их, вы можете применить к ним оба блока assign или always. Кстати, assign также будет работать для целых чисел.

logic[31:0] R = 10;   
logic[15:0] R_f1;
logic[15:0] R_f2;

assign R_f1 = R[15:0];
assign R_f2 = R[31:16];

просто убедитесь, что вы компилируете в режиме системного verilog.

0 голосов
/ 30 октября 2018

В исходной реализации Verilog-XL была ошибка, из-за которой игнорировались упакованные размеры объявлений integer. И integer/int/byte не имел фиксированного размера. По этим причинам SystemVerilog запрещает указывать упакованные размеры для любого из этих встроенных типов. Вместо этого используйте bit или logic.

Кроме того, поскольку вы отметили это с помощью SystemVerilog, убедитесь, что файл имеет суффикс * .sv. Альтернативой тому, что вы пытаетесь сделать, является

integer [31:0]R;

let R_f1 = R[15:0];
let R_f2 = R[31:16];
...