arexol 0 May 7, 2009 Posted May 7, 2009 · Report post Добрый день Исправляю чужой код, где обнаружил вот такое 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 параметром для модуля задавать кол-во его портов ? Quote Share this post Link to post Share on other sites More sharing options...
des00 27 May 7, 2009 Posted May 7, 2009 · Report post Возможно ли в Verilog параметром для модуля задавать кол-во его портов ? да возможно Quote Share this post Link to post Share on other sites More sharing options...
arexol 0 May 7, 2009 Posted May 7, 2009 · Report post да возможно А пример можно ? чтобы N входов с разрядностью 16 Quote Share this post Link to post Share on other sites More sharing options...
lexus.mephi 0 May 7, 2009 Posted May 7, 2009 · Report post Форум с аналогичным вопросом Если английский дается с трудом, то там написано, что в Verilog'е поддерживается параметризация регистров и цепей. А параметризация i/o портов поддерживается в SystemVerilog. Quote Share this post Link to post Share on other sites More sharing options...
des00 27 May 8, 2009 Posted May 8, 2009 · Report post А пример можно ? чтобы N входов с разрядностью 16 хммм, вы же сами привели пример с параметризуемым количеством портов модуля, поставте NB_QUEUES = 16 и будет то что вы хотите. только учтите что это System Verilog, не все синтезаторы поддерживают, в т.ч. ISE в пролете(и похоже надолго) %) Quote Share this post Link to post Share on other sites More sharing options...
cdg 4 May 10, 2009 Posted May 10, 2009 · Report post А пример можно ? чтобы 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 Quote Share this post Link to post Share on other sites More sharing options...
LV26 0 May 10, 2009 Posted May 10, 2009 · Report post только учтите что это System Verilog, не все синтезаторы поддерживают, в т.ч. ISE в пролете(и похоже надолго) %) А почему? Как Вы думаете? :-) А я думаю - потому, что он (SV) так и умрет не родившишь здоровым. Quote Share this post Link to post Share on other sites More sharing options...
des00 27 May 11, 2009 Posted May 11, 2009 · Report post А почему? Как Вы думаете? :-) А я думаю - потому, что он (SV) так и умрет не родившишь здоровым. Предлагаю вам написать ваши соображения в соответствующую тему форума, там и поговорим %) Что по мне, так я обоими руками за поддержку BSV :) Quote Share this post Link to post Share on other sites More sharing options...
arexol 0 May 18, 2009 Posted May 18, 2009 · Report post Все дело в том, что в 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 Quote Share this post Link to post Share on other sites More sharing options...
des00 27 May 18, 2009 Posted May 18, 2009 · Report post Да это хорошая идея - чуть с индексами поправил и все выглядит так как нужно что то мне подсказывает что должно быть так assign i_wire_P_pn_RTLMT=i_P_pn_RTLMT[i*16+16:i*16]; Quote Share this post Link to post Share on other sites More sharing options...
Sefo 0 May 18, 2009 Posted May 18, 2009 · Report post Все дело в том, что в Verilog можно на входе использовать только одномерное представление массива, но никто не мешает представлять двумерный массив, как одномерный, это может быть и не красиво, но другого выхода нет. Да это хорошая идея - чуть с индексами поправил и все выглядит так как нужно Начитавшись комментариев страстных любителей Verilog в адрес тех кто пишет на VHDL не могу удержаться, сорри. Да Вам на VHDL пора переходить - там двумерные массивы не роскошь, а средство разработки :smile3009: Quote Share this post Link to post Share on other sites More sharing options...
SM 15 May 18, 2009 Posted May 18, 2009 · Report post Да Вам на VHDL пора переходить - там двумерные массивы не роскошь Не на VHDL, ни в коем разе, а на SV. Quote Share this post Link to post Share on other sites More sharing options...
stu 0 October 6, 2011 Posted October 6, 2011 · Report post что то мне подсказывает что должно быть так assign i_wire_P_pn_RTLMT=i_P_pn_RTLMT[i*16+16:i*16]; как кто-то кому-то отвечал: "то, что Вам подсказывает не право". Quote Share this post Link to post Share on other sites More sharing options...
stu 0 October 10, 2011 Posted October 10, 2011 (edited) · Report post и в 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 October 10, 2011 by stu Quote Share this post Link to post Share on other sites More sharing options...
des00 27 October 10, 2011 Posted October 10, 2011 · Report post как кто-то кому-то отвечал: "то, что Вам подсказывает не право". особенно если учесть что должно быть assign i_wire_P_pn_RTLMT[i]=i_P_pn_RTLMT[i*16 +:16]; и в SV тоже нельзя передавать в другой модуль двумерный массив, как в AHDL ? всю жизнь передавали Quote Share this post Link to post Share on other sites More sharing options...