novartis 0 Четверг в 06:34 Опубликовано Четверг в 06:34 · Жалоба Есть структура и битовый вектор localparam C_MAX_MSG_REG_LEN = 512; reg [C_MAX_MSG_REG_LEN -1:0] msg_reg = 0; typedef struct { reg [255:0] field_1; reg [159:0] field_2; reg [31:0] field_3; } struct_msg; struct_msg msg; Хочу извлечь из msg_reg поля и засунуть в структуру: msg.field1 = msg_reg[255:0]; msg.field2 = msg_reg[415:256]; msg.field3 = msg_reg[447:416]; Таких структур много, у всех структур разный набор полей, длина полей у всех разная. Сидеть и считать смещения каждого поля не охота. Как это можно сделать быстрым и удобным способом? Написал такую функцию: function automatic struct_msg f_unpack_struct_msg_from_vec(input logic [C_MAX_MSG_REG_LEN-1:0] data); struct_msg ret; integer L = C_MAX_MSG_REG_LEN; integer d = 0; integer s = 0; s = s+d; d = 256; ret.field1 = data[L-s-1:L-s-d]; s = s+d; d = 160; ret.field1 = data[L-s-1:L-s-d]; s = s+d; d = 32; ret.field1 = data[L-s-1:L-s-d]; return ret; endfunction Квеста ругается: Range width must be constant expression Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 28 Четверг в 07:40 Опубликовано Четверг в 07:40 · Жалоба 1 hour ago, novartis said: Квеста ругается: Range width must be constant expression переписать на что-то подобное: s = s+d; d = 256; ret.field1 = data[L-s-1 -:256]; 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novartis 0 Четверг в 07:53 Опубликовано Четверг в 07:53 · Жалоба 12 minutes ago, _4afc_ said: переписать на что-то подобное: s = s+d; d = 256; ret.field1 = data[L-s-1 -:256]; спасибо, так получилось Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 8 Четверг в 12:11 Опубликовано Четверг в 12:11 · Жалоба на всякий случай Если структура packed typedef struct packed { и поля в ней переставить, чтобы как-то lsb соблюдалось ... field_3; ... ... field_1; то можно msg=msg_reg; или msg_reg=msg; Если размеры l-value r-value не совпадают, то лишние биты не будут использоватся, недостающие не поменяются Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 69 Пятница в 02:46 Опубликовано Пятница в 02:46 · Жалоба +1 за пакованную структуру. Описываете всё свои структуры как packed, и спокойно присваиваете им значение вашего "вектора" (в SV "вектор" называется пакованным массивом). Дальше пользуетесь полями структуры. Всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться