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

SystemVerilog Union

Вроде все по любимой книжке Stuart Sutherland, по примеру:

 
typedef struct packed {
        bit [7:0]                            A                              ; 
        bit [7:0]                            B                              ; 
        bit [7:0]                            C                              ; 
    } cell_t;

    typedef union packed {
        cell_t                              packet                          ;
        bit [2:0] [7:0]                     bytes                           ;
    } dreg_t;

	dreg_t									dreg							;

    always_ff @ (posedge clk) begin
        if (en) begin
            dreg.bytes[cnt] <= bytes_in									    ;
        end
    end

В симуляторе наблюдаю заполнение данными, дальше хочу использовать весь вектор из трех байт.

Как только не пробовал

assign out = dreg;
assign out = dreg.packet;

по нулям out, что не так то? 

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


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

А какая разрядность out Было бы неплохо показать больше кода. А то как обычно опять угадыванием занимаемся. Если выход длинной в байт, то нужно и присвоить байт: assign out = dreg.packet.A или вообще бит, если у него такова разрядность

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


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

19 minutes ago, Nick_K said:

А какая разрядность out Было бы неплохо показать больше кода. А то как обычно опять угадыванием занимаемся. Если выход длинной в байт, то нужно и присвоить байт: assign out = dreg.packet.A или вообще бит, если у него такова разрядность

Кода под рукой нет, но с разрядностью out все ок 3 байта под всю структуру. 

 

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


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

1 minute ago, Mad_kvmg said:

но с разрядностью out все ок 3 байта под всю структуру

Вот тут может быть проблема. Если массив неупакованный (output [3:0] out [7:0]) или синтезатор/среда моделирования с приколами - то может и не прожевать. В идеале выход нужно объявить как структуру cell_t, тогда проблем не должно возникнуть. Или в Юнионе использовать тип как в воходном порте (или третьим элементом его задать).

Или в тупую перебрать через цикл. Пробуйте и так и этак

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


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

21 hours ago, Mad_kvmg said:

Вроде все по любимой книжке Stuart Sutherland, по примеру:

 

typedef struct packed {
        bit [7:0]                            A                              ; 
        bit [7:0]                            B                              ; 
        bit [7:0]                            C                              ; 
    } cell_t;

    typedef union packed {
        cell_t                              packet                          ;
        bit [2:0] [7:0]                     bytes                           ;
    } dreg_t;

	dreg_t									dreg							;

    always_ff @ (posedge clk) begin
        if (en) begin
            dreg.bytes[cnt] <= bytes_in									    ;
        end
    end

В симуляторе наблюдаю заполнение данными, дальше хочу использовать весь вектор из трех байт.

Как только не пробовал


assign out = dreg;
assign out = dreg.packet;

по нулям out, что не так то? 

Мда, не пишите RTL по ночам, все работает как и должно 

assign out = dreg;

опечатался

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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