Mad_kvmg 0 15 октября, 2019 Опубликовано 15 октября, 2019 · Жалоба Вроде все по любимой книжке 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, что не так то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 16 октября, 2019 Опубликовано 16 октября, 2019 · Жалоба А какая разрядность out Было бы неплохо показать больше кода. А то как обычно опять угадыванием занимаемся. Если выход длинной в байт, то нужно и присвоить байт: assign out = dreg.packet.A или вообще бит, если у него такова разрядность Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 16 октября, 2019 Опубликовано 16 октября, 2019 · Жалоба 19 minutes ago, Nick_K said: А какая разрядность out Было бы неплохо показать больше кода. А то как обычно опять угадыванием занимаемся. Если выход длинной в байт, то нужно и присвоить байт: assign out = dreg.packet.A или вообще бит, если у него такова разрядность Кода под рукой нет, но с разрядностью out все ок 3 байта под всю структуру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 16 октября, 2019 Опубликовано 16 октября, 2019 · Жалоба 1 minute ago, Mad_kvmg said: но с разрядностью out все ок 3 байта под всю структуру Вот тут может быть проблема. Если массив неупакованный (output [3:0] out [7:0]) или синтезатор/среда моделирования с приколами - то может и не прожевать. В идеале выход нужно объявить как структуру cell_t, тогда проблем не должно возникнуть. Или в Юнионе использовать тип как в воходном порте (или третьим элементом его задать). Или в тупую перебрать через цикл. Пробуйте и так и этак Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 16 октября, 2019 Опубликовано 16 октября, 2019 · Жалоба 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; опечатался Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться