Этот особый синтаксис называется с индексированной частью выбора. Это очень полезно, когда вам нужно выбрать фиксированное количество бит из смещения переменной в многобитовом регистре.
Вот пример синтаксиса:
reg [31:0] dword;
reg [7:0] byte0;
reg [7:0] byte1;
reg [7:0] byte2;
reg [7:0] byte3;
assign byte0 = dword[0 +: 8]; // Same as dword[7:0]
assign byte1 = dword[8 +: 8]; // Same as dword[15:8]
assign byte2 = dword[16 +: 8]; // Same as dword[23:16]
assign byte3 = dword[24 +: 8]; // Same as dword[31:24]
Самым большим преимуществом этого синтаксиса является то, что вы можете использовать переменную для индекса. Для нормальной части в Verilog требуется константа. Таким образом, попытка сделать что-то вроде dword[i+7:i]
не допускается.
Итак, если вы хотите выбрать конкретный байт с помощью выбора переменной, вы можете использовать функцию индексированной части.
Пример использования переменной:
reg [31:0] dword;
reg [7:0] byte;
reg [1:0] i;
// This is illegal due to the variable i, even though the width is always 8 bits
assign byte = dword[(i*8)+7 : i*8]; // ** Not allowed!
// Use the indexed part select
assign byte = dword[i*8 +: 8];
Я думаю, вы хотите заменить 'i' на' select' в вашем втором примере. – nguthrie