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

Quartus, SV, определение размеров структур в битах

Добрый день. Возник такой вопрос.

 

Есть файл 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 дают одинаково неправильные результаты.

 

Если не затруднит, не подскажете, с чем может быть связано, как с этим бороться, и какие еще тонкости могут вылезти?

Заранее спасибо.

 

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


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

Для проверки результата функции $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:

 

 

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


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

Для проверки результата функции $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

 

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


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

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

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

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

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

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

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

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

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

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