Jump to content
    

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
 

Share this post


Link to post
Share on other sites

1 hour ago, novartis said:

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

Range width must be constant expression
 

 

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

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

 

Share this post


Link to post
Share on other sites

12 minutes ago, _4afc_ said:

 

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

typedef struct packed {

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

... field_3;

...

... field_1;

то можно

msg=msg_reg;

или

msg_reg=msg;

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...