Перейти к содержанию
    

System verilog, распаковка структуры из битового вектора

Есть структура и битовый вектор

    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
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, novartis said:

Квеста ругается: 

Range width must be constant expression
 

 

переписать на что-то подобное:

        s = s+d; d = 256;        ret.field1 = data[L-s-1 -:256];

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, _4afc_ said:

 

переписать на что-то подобное:

        s = s+d; d = 256;        ret.field1 = data[L-s-1 -:256];

 

спасибо, так получилось

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на всякий случай

Если структура packed

typedef struct packed {

и поля в ней переставить, чтобы как-то lsb соблюдалось

... field_3;

...

... field_1;

то можно

msg=msg_reg;

или

msg_reg=msg;

Если размеры l-value r-value не совпадают, то лишние биты не будут использоватся, недостающие не поменяются

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

+1 за пакованную структуру. Описываете всё свои структуры как packed, и спокойно присваиваете им значение вашего "вектора" (в SV "вектор" называется пакованным массивом). Дальше пользуетесь полями структуры. Всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...