- В зависимости от используемого вами языка. В verilog только типы сетей могут быть назначены с помощью непрерывного назначения.
integer
не является сетевым типом, поэтому эти назначения не допускаются в verilog. Я полагаю, вы скомпилировали свой код в режиме verilog
и получили сообщение об операторах присваивания.
- Также не допускаются упакованные размеры на
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.