Jump to content
    

Параметризация в Verilog

Добрый день

 

Исправляю чужой код, где обнаружил вот такое

 

module agg_dwrr (

i_sys_clk,

i_arst_N,

i_srst_N,

 

i_2D5M_CLK ,

i_P_pn_RTLMT ,

.......

);

....

parameter [31:0] NB_QUEUES = 32'd4;

input [15:0] i_P_pn_RTLMT [NB_QUEUES-1:0];

....

 

это всё не компилируется , но тем не менее

Возможно ли в Verilog параметром для модуля задавать кол-во его портов ?

Share this post


Link to post
Share on other sites

Возможно ли в Verilog параметром для модуля задавать кол-во его портов ?

 

да возможно

Share this post


Link to post
Share on other sites

да возможно

 

А пример можно ?

 

чтобы N входов с разрядностью 16

Share this post


Link to post
Share on other sites

Форум с аналогичным вопросом

 

Если английский дается с трудом, то там написано, что в Verilog'е поддерживается параметризация регистров и цепей. А параметризация i/o портов поддерживается в SystemVerilog.

Share this post


Link to post
Share on other sites

А пример можно ?

 

чтобы N входов с разрядностью 16

 

 

хммм, вы же сами привели пример с параметризуемым количеством портов модуля, поставте NB_QUEUES = 16 и будет то что вы хотите.

 

только учтите что это System Verilog, не все синтезаторы поддерживают, в т.ч. ISE в пролете(и похоже надолго) %)

Share this post


Link to post
Share on other sites

А пример можно ?

 

чтобы N входов с разрядностью 16

Все дело в том, что в Verilog можно на входе использовать только одномерное представление массива, но никто не мешает представлять двумерный массив, как одномерный, это может быть и не красиво, но другого выхода нет. Например:

module test 
      #(parameter N = 100, //N - number of ports
                  B_W = 16 //B_W - bus width
       )  
      ( 
       input [(B_W*N-1):0] InBus
       
      );

      wire [(B_W-1):0] SubBus [(N-1):0]; 
      
      generate
        genvar i;
        for (i=0; i<=(N-1); i=i+1)
        
        begin: SubBusAssignCycle
          assign SubBus[i] = InBus[(i*B_W-1):i];
        end 
      endgenerate      
      
      //.......
      //.......
      //.......
      
endmodule

Share this post


Link to post
Share on other sites

только учтите что это System Verilog, не все синтезаторы поддерживают, в т.ч. ISE в пролете(и похоже надолго) %)

 

А почему? Как Вы думаете? :-)

А я думаю - потому, что он (SV) так и умрет не родившишь здоровым.

Share this post


Link to post
Share on other sites

А почему? Как Вы думаете? :-)

А я думаю - потому, что он (SV) так и умрет не родившишь здоровым.

 

Предлагаю вам написать ваши соображения в соответствующую тему форума, там и поговорим %) Что по мне, так я обоими руками за поддержку BSV :)

Share this post


Link to post
Share on other sites

Все дело в том, что в Verilog можно на входе использовать только одномерное представление массива, но никто не мешает представлять двумерный массив, как одномерный, это может быть и не красиво, но другого выхода нет. Например:

module test 
      #(parameter N = 100, //N - number of ports
                  B_W = 16 //B_W - bus width
       )  
      ( 
       input [(B_W*N-1):0] InBus
       
      );

      wire [(B_W-1):0] SubBus [(N-1):0]; 
      
      generate
        genvar i;
        for (i=0; i<=(N-1); i=i+1)
        
        begin: SubBusAssignCycle
          assign SubBus[i] = InBus[(i*B_W-1):i];
        end 
      endgenerate      
      
      //.......
      //.......
      //.......
      
endmodule

 

 

Да это хорошая идея - чуть с индексами поправил и все выглядит так как нужно

Спасибо :a14:

input   [((16*NB_QUEUES)-1):0]  i_P_pn_RTLMT;          
wire [15:0] i_wire_P_pn_RTLMT[NB_QUEUES-1:0];

generate                                          // one dimesion to 2 dimesion input conversion
genvar i;
for (i=0;i<=(NB_QUEUES-1);i=i+1)
  begin 
   assign i_wire_P_pn_RTLMT[i]=i_P_pn_RTLMT[i*16+15:i*16];
  end 
endgenerate

Share this post


Link to post
Share on other sites

Да это хорошая идея - чуть с индексами поправил и все выглядит так как нужно

 

что то мне подсказывает что должно быть так

 

assign i_wire_P_pn_RTLMT=i_P_pn_RTLMT[i*16+16:i*16];

Share this post


Link to post
Share on other sites

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

 

Да это хорошая идея - чуть с индексами поправил и все выглядит так как нужно

 

Начитавшись комментариев страстных любителей Verilog в адрес тех кто пишет на VHDL не могу удержаться, сорри.

 

Да Вам на VHDL пора переходить - там двумерные массивы не роскошь, а средство разработки :smile3009:

 

:biggrin:

Share this post


Link to post
Share on other sites

Да Вам на VHDL пора переходить - там двумерные массивы не роскошь

Не на VHDL, ни в коем разе, а на SV.

Share this post


Link to post
Share on other sites

что то мне подсказывает что должно быть так

 

assign i_wire_P_pn_RTLMT=i_P_pn_RTLMT[i*16+16:i*16];

 

как кто-то кому-то отвечал: "то, что Вам подсказывает не право".

Share this post


Link to post
Share on other sites

и в SV тоже нельзя передавать в другой модуль двумерный массив, как в AHDL ?

к примеру,

module_1                            // HA SV
..........
wire [7:0] I [0:3];

module_2 L (
                .dout (I [0:3]),
                           ...........
                );
defparam
      ....
endmodule
//--------------------------------------------------------------------------------------------------------------------
module_2             // HA SV
            (Dout);
....
output wire [7:0] Dout [0:3];
........
endmodule
//---------------------------------------
module_2             // HA AHDL
....
Dout[3..0][7..0] : output;
........
endmodule

Edited by stu

Share this post


Link to post
Share on other sites

как кто-то кому-то отвечал: "то, что Вам подсказывает не право".

особенно если учесть что должно быть

assign i_wire_P_pn_RTLMT[i]=i_P_pn_RTLMT[i*16 +:16];

 

и в SV тоже нельзя передавать в другой модуль двумерный массив, как в AHDL ?

всю жизнь передавали

 

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...