Ethereal 0 26 марта, 2016 Опубликовано 26 марта, 2016 · Жалоба Добрый день. Возник такой вопрос. Есть файл project_types.v, в котором описана структура: typedef struct packed { bit [ 7: 0]test_01; bit [ 7: 0]test_02; bit [ 7: 0]test_03; bit [ 7: 0]test_04; bit [ 7: 0]test_05; bit [ 7: 0]test_06; bit [ 7: 0]test_07; bit [ 7: 0]test_08; bit [ 7: 0]test_09; bit [ 7: 0]test_10; bit [ 7: 0]test_11; bit [ 7: 0]test_12; bit [ 7: 0]test_13; bit [ 7: 0]test_14; bit [ 7: 0]test_15; } message_not_alligned; typedef struct packed { message_not_alligned data; bit [7: 0]some_var; } message_alligned; Файл инклюдится в другом файле "retranslate.v" module retranslator(...); `include "project_types.v" localparam lp_message_bit_size = $bits(message_alligned); localparam lp_message_byte_size = lp_message_bit_size / 8; localparam lp_byte_count = lp_message_byte_size * lp_max_message_count; ... Модуль сохраняет приходящие друг за другом message в память побайтно. Проблема в том, что в данном случае lp_message_bit_size = 8 lp_message_byte_size = 1 А не 128 и 16, как, по идее, должно быть. Если сделать такую замену typedef struct packed { message_not_alligned data; bit [1: 0]some_var; } message_alligned; , то будет lp_message_bit_size = 2. Если some_var на части typedef struct packed { message_not_alligned data; bit some_var_high; bit [6: 0]some_var_high; } message_alligned; то будет снова 8. А вот если сделать, например, так: typedef struct packed { message_not_alligned data; bit [7: 0 * $bits(message_not_alligned)]some_var; } message_alligned; то lp_message_bit_size = 128 lp_message_byte_size = 16. Моделсим (ASE) правильно определяет размеры структур. Q II 9.1 SP2 и Q II 11.1 дают одинаково неправильные результаты. Если не затруднит, не подскажете, с чем может быть связано, как с этим бороться, и какие еще тонкости могут вылезти? Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy-P 0 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба Для проверки результата функции $bits(message_alligned) использовал следующий пример: module tst_bit_struct ( input wire rst, // Active high reset clk, // Clock d_in, // Serial data input output logic d_out // Serial data output ); typedef struct packed { bit [ 7: 0]test_01; bit [ 7: 0]test_02; bit [ 7: 0]test_03; bit [ 7: 0]test_04; bit [ 7: 0]test_05; bit [ 7: 0]test_06; bit [ 7: 0]test_07; bit [ 7: 0]test_08; bit [ 7: 0]test_09; bit [ 7: 0]test_10; bit [ 7: 0]test_11; bit [ 7: 0]test_12; bit [ 7: 0]test_13; bit [ 7: 0]test_14; bit [ 7: 0]test_15; } message_not_alligned; typedef struct packed { message_not_alligned data; bit [7: 0]some_var; } message_alligned; localparam lp_message_bit_size = $bits(message_alligned); localparam lp_message_byte_size = lp_message_bit_size / 8; initial begin $display("lp_message_bit_size = %0d", lp_message_bit_size); $display("lp_message_byte_size = %0d", lp_message_byte_size); end logic [lp_message_bit_size - 1 : 0] msg_rg; always_ff @ (posedge rst, posedge clk) if (rst) msg_rg <= '0; else msg_rg[lp_message_bit_size - 1 : 0] <= {msg_rg[lp_message_bit_size - 2 : 0], d_in}; assign d_out = msg_rg[lp_message_bit_size - 1]; endmodule QuartusII 13.0.1 для 5M2210ZF256I5 выдал: Info (12127): Elaborating entity "tst_bit_struct" for the top level hierarchy Info (10648): Verilog HDL Display System Task info at tst_bit_struct.sv(36): lp_message_bit_size = 128 Info (10648): Verilog HDL Display System Task info at tst_bit_struct.sv(37): lp_message_byte_size = 16 Info (21057): Implemented 132 device resources after synthesis - the final resource count might be different Info (21058): Implemented 3 input pins Info (21059): Implemented 1 output pins Info (21061): Implemented 128 logic cells Info: Quartus II 64-Bit Analysis & Synthesis was successful. 0 errors, 0 warnings … и он абсолютно прав. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ethereal 0 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба Для проверки результата функции $bits(message_alligned) использовал следующий пример: ... … и он абсолютно прав. :laughing: Спасибо, попробую этот же код на 13. На 11 забавно :) Info: Running Quartus II 64-Bit Analysis & Synthesis Info: Version 11.1 Build 173 11/01/2011 SJ Full Version Info: Processing started: Tue Mar 29 18:31:38 2016 Info: Command: quartus_map --read_settings_files=on --write_settings_files=off test_bits -c test_bits Info (20030): Parallel compilation is enabled and will use 2 of the 2 processors detected Info (12021): Found 1 design units, including 1 entities, in source file tst_bit_struct.v Info (12023): Found entity 1: tst_bit_struct Info (12127): Elaborating entity "tst_bit_struct" for the top level hierarchy Info (10648): Verilog HDL Display System Task info at tst_bit_struct.v(34): lp_message_bit_size = 8 Info (10648): Verilog HDL Display System Task info at tst_bit_struct.v(35): lp_message_byte_size = 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться