juvf 17 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Хочу создать модуль с n портов, каждый из которых будет шириной w бит. С шириной разобрался, вот заготовка с одним портом входа шириной по умолчаний в 2 бита. module muxU(clk, in, out); parameter WIDTH = 2; input clk; input [WIDTH:0]in; output reg [WIDTH:0]out; always @ (posedge clk) begin out <= in; end endmodule Есть потребность в будущем блок с 2-мя входными портами module muxU(clk, in1, in2, out); parameter WIDTH = 2; input clk; input [WIDTH:0]in1; input [WIDTH:0]in2; output reg [WIDTH:0]out; always @ (posedge clk) begin out <= in2; end endmodule Как написать на верилоге такой модуль, чтобы менять только какойнить параметр и кол-во портов in автоматом добавлялось/уменьшалось? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба количество портов не может зависить от параметра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Как написать на верилоге такой модуль, чтобы менять только какойнить параметр и кол-во портов in автоматом добавлялось/уменьшалось? Через предпроцессор попробовать разве что. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stu 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба module muxU(clk, in, out); parameter n = 1; parameter WIDTH = 2; input clk; input [WIDTH:0]in[n:0]; output reg [WIDTH:0]out; always @ (posedge clk) begin out <= in[n]; end endmodule а лучше так: module muxU #(parameter n = 1 , WIDTH = 2 ) ( input wire clk , output wire [WIDTH:0] in [n:0] , output reg out ); always @ (posedge clk) begin out <= in[n]; end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eugen_pcad_ru 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Для этого обычно используют скриптовые языки:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 67 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Использовать вместо input, output интерфейсы. В них можно сгенерировать сколько угодно каких угодно портов да плюс логики наворотить. Мегавещь, очень рекомендую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Использовать вместо input, output интерфейсы. В них можно сгенерировать сколько угодно каких угодно портов да плюс логики наворотить. Мегавещь, очень рекомендую. Это да. Мегарулёз. Но это уже SystemVerilog а не просто верилог. Но квартус умеет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Использовать вместо input, output интерфейсы. В них можно сгенерировать сколько угодно каких угодно портов да плюс логики наворотить. Мегавещь, очень рекомендую. Количество портов все-равно не изменишь с помощью параметра (и ничего "сгенерировать" не получится). Надо менять сам интерфейс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Хочу создать модуль с n портов, каждый из которых будет шириной w бит. С шириной разобрался, вот заготовка с одним портом входа шириной по умолчаний в 2 бита. n*w - это логичнее оформлять, как массив длины n из шин шириной w. Проблема, что в простом Верилоге запрещены порты-массивы, но можно запаковать массив в один порт параметризованной длины n*w, а внутри модуля распаковать в нормальный массив. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Количество портов все-равно не изменишь с помощью параметра (и ничего "сгенерировать" не получится). Надо менять сам интерфейс. Если интерефейс идет через несколько модулей, то проще добавить дополнительно сигнал в интерфейс а не добавлять сигналы в каждый модуль. Плюс когда сигналов много, это достает шокапец. Пример альтеровский. .npor (npor), // npor.npor .pin_perst (pin_perst), // .pin_perst .test_in (test_in), // hip_ctrl.test_in .simu_mode_pipe (simu_mode_pipe), // .simu_mode_pipe .pld_clk (pld_clk), // pld_clk.clk .coreclkout (coreclkout), // coreclkout_hip.clk .refclk (refclk), // refclk.clk .rx_in0 (rx_in0), // hip_serial.rx_in0 .rx_in1 (rx_in1), // .rx_in1 .rx_in2 (rx_in2), // .rx_in2 .rx_in3 (rx_in3), // .rx_in3 .tx_out0 (tx_out0), // .tx_out0 .tx_out1 (tx_out1), // .tx_out1 .tx_out2 (tx_out2), // .tx_out2 .tx_out3 (tx_out3), // .tx_out3 .rx_st_valid (rx_st_valid), // rx_st.valid .rx_st_sop (rx_st_sop), // .startofpacket .rx_st_eop (rx_st_eop), // .endofpacket .rx_st_empty (rx_st_empty), // .empty .rx_st_ready (rx_st_ready), // .ready .rx_st_err (rx_st_err), // .error .rx_st_data (rx_st_data), // .data .rx_st_bar (rx_st_bar), // rx_bar_be.rx_st_bar .rx_st_mask (rx_st_mask), // .rx_st_mask .tx_st_valid (tx_st_valid), // tx_st.valid .tx_st_sop (tx_st_sop), // .startofpacket .tx_st_eop (tx_st_eop), // .endofpacket .tx_st_empty (tx_st_empty), // .empty .tx_st_ready (tx_st_ready), // .ready .tx_st_err (tx_st_err), // .error .tx_st_data (tx_st_data), // .data .tx_fifo_empty (tx_fifo_empty), // tx_fifo.fifo_empty .tx_cred_datafccp (tx_cred_datafccp), // tx_cred.tx_cred_datafccp .tx_cred_datafcnp (tx_cred_datafcnp), // .tx_cred_datafcnp .tx_cred_datafcp (tx_cred_datafcp), // .tx_cred_datafcp .tx_cred_fchipcons (tx_cred_fchipcons), // .tx_cred_fchipcons .tx_cred_fcinfinite (tx_cred_fcinfinite), // .tx_cred_fcinfinite .tx_cred_hdrfccp (tx_cred_hdrfccp), // .tx_cred_hdrfccp .tx_cred_hdrfcnp (tx_cred_hdrfcnp), // .tx_cred_hdrfcnp .tx_cred_hdrfcp (tx_cred_hdrfcp), // .tx_cred_hdrfcp .sim_pipe_pclk_in (sim_pipe_pclk_in), // hip_pipe.sim_pipe_pclk_in .sim_pipe_rate (sim_pipe_rate), // .sim_pipe_rate .sim_ltssmstate (sim_ltssmstate), // .sim_ltssmstate .eidleinfersel0 (eidleinfersel0), // .eidleinfersel0 .eidleinfersel1 (eidleinfersel1), // .eidleinfersel1 .eidleinfersel2 (eidleinfersel2), // .eidleinfersel2 .eidleinfersel3 (eidleinfersel3), // .eidleinfersel3 .powerdown0 (powerdown0), // .powerdown0 .powerdown1 (powerdown1), // .powerdown1 .powerdown2 (powerdown2), // .powerdown2 .powerdown3 (powerdown3), // .powerdown3 .rxpolarity0 (rxpolarity0), // .rxpolarity0 .rxpolarity1 (rxpolarity1), // .rxpolarity1 .rxpolarity2 (rxpolarity2), // .rxpolarity2 .rxpolarity3 (rxpolarity3), // .rxpolarity3 .txcompl0 (txcompl0), // .txcompl0 .txcompl1 (txcompl1), // .txcompl1 .txcompl2 (txcompl2), // .txcompl2 .txcompl3 (txcompl3), // .txcompl3 .txdata0 (txdata0), // .txdata0 .txdata1 (txdata1), // .txdata1 .txdata2 (txdata2), // .txdata2 .txdata3 (txdata3), // .txdata3 .txdatak0 (txdatak0), // .txdatak0 .txdatak1 (txdatak1), // .txdatak1 .txdatak2 (txdatak2), // .txdatak2 .txdatak3 (txdatak3), // .txdatak3 .txdetectrx0 (txdetectrx0), // .txdetectrx0 .txdetectrx1 (txdetectrx1), // .txdetectrx1 .txdetectrx2 (txdetectrx2), // .txdetectrx2 .txdetectrx3 (txdetectrx3), // .txdetectrx3 .txelecidle0 (txelecidle0), // .txelecidle0 .txelecidle1 (txelecidle1), // .txelecidle1 .txelecidle2 (txelecidle2), // .txelecidle2 .txelecidle3 (txelecidle3), // .txelecidle3 .txswing0 (txswing0), // .txswing0 .txswing1 (txswing1), // .txswing1 .txswing2 (txswing2), // .txswing2 .txswing3 (txswing3), // .txswing3 .txmargin0 (txmargin0), // .txmargin0 .txmargin1 (txmargin1), // .txmargin1 .txmargin2 (txmargin2), // .txmargin2 .txmargin3 (txmargin3), // .txmargin3 .txdeemph0 (txdeemph0), // .txdeemph0 .txdeemph1 (txdeemph1), // .txdeemph1 .txdeemph2 (txdeemph2), // .txdeemph2 .txdeemph3 (txdeemph3), // .txdeemph3 .phystatus0 (phystatus0), // .phystatus0 .phystatus1 (phystatus1), // .phystatus1 .phystatus2 (phystatus2), // .phystatus2 .phystatus3 (phystatus3), // .phystatus3 .rxdata0 (rxdata0), // .rxdata0 .rxdata1 (rxdata1), // .rxdata1 .rxdata2 (rxdata2), // .rxdata2 .rxdata3 (rxdata3), // .rxdata3 .rxdatak0 (rxdatak0), // .rxdatak0 .rxdatak1 (rxdatak1), // .rxdatak1 .rxdatak2 (rxdatak2), // .rxdatak2 .rxdatak3 (rxdatak3), // .rxdatak3 .rxelecidle0 (rxelecidle0), // .rxelecidle0 .rxelecidle1 (rxelecidle1), // .rxelecidle1 .rxelecidle2 (rxelecidle2), // .rxelecidle2 .rxelecidle3 (rxelecidle3), // .rxelecidle3 .rxstatus0 (rxstatus0), // .rxstatus0 .rxstatus1 (rxstatus1), // .rxstatus1 .rxstatus2 (rxstatus2), // .rxstatus2 .rxstatus3 (rxstatus3), // .rxstatus3 .rxvalid0 (rxvalid0), // .rxvalid0 .rxvalid1 (rxvalid1), // .rxvalid1 .rxvalid2 (rxvalid2), // .rxvalid2 .rxvalid3 (rxvalid3), // .rxvalid3 .reset_status (reset_status), // hip_rst.reset_status .serdes_pll_locked (serdes_pll_locked), // .serdes_pll_locked .pld_clk_inuse (pld_clk_inuse), // .pld_clk_inuse .pld_core_ready (pld_core_ready), // .pld_core_ready .testin_zero (testin_zero), // .testin_zero .lmi_addr (lmi_addr), // lmi.lmi_addr .lmi_din (lmi_din), // .lmi_din .lmi_rden (lmi_rden), // .lmi_rden .lmi_wren (lmi_wren), // .lmi_wren .lmi_ack (lmi_ack), // .lmi_ack .lmi_dout (lmi_dout), // .lmi_dout .pm_auxpwr (pm_auxpwr), // power_mngt.pm_auxpwr .pm_data (pm_data), // .pm_data .pme_to_cr (pme_to_cr), // .pme_to_cr .pm_event (pm_event), // .pm_event .pme_to_sr (pme_to_sr), // .pme_to_sr .reconfig_to_xcvr (reconfig_to_xcvr), // reconfig_to_xcvr.reconfig_to_xcvr .busy_xcvr_reconfig (busy_xcvr_reconfig), // .busy_xcvr_reconfig .reconfig_from_xcvr (reconfig_from_xcvr), // reconfig_from_xcvr.reconfig_from_xcvr .app_msi_num (app_msi_num), // int_msi.app_msi_num .app_msi_req (app_msi_req), // .app_msi_req .app_msi_tc (app_msi_tc), // .app_msi_tc .app_msi_ack (app_msi_ack), // .app_msi_ack .app_int_sts_vec (app_int_sts_vec), // .app_int_sts .tl_hpg_ctrl_er (tl_hpg_ctrl_er), // config_tl.hpg_ctrler .tl_cfg_ctl (tl_cfg_ctl), // .tl_cfg_ctl .cpl_err (cpl_err), // .cpl_err .tl_cfg_add (tl_cfg_add), // .tl_cfg_add .tl_cfg_sts (tl_cfg_sts), // .tl_cfg_sts .cpl_pending (cpl_pending), // .cpl_pending .tl_cfg_ctl_wr (tl_cfg_ctl_wr), // .tl_cfg_ctl_wr .tl_cfg_sts_wr (tl_cfg_sts_wr), // .tl_cfg_sts_wr .dl_current_speed (dl_current_speed), // hip_status.currentspeed .derr_cor_ext_rcv0 (derr_cor_ext_rcv0), // .derr_cor_ext_rcv .derr_cor_ext_rpl (derr_cor_ext_rpl), // .derr_cor_ext_rpl .derr_rpl (derr_rpl), // .derr_rpl .dlup_exit (dlup_exit), // .dlup_exit .dl_ltssm (dl_ltssm), // .ltssmstate .ev128ns (ev128ns), // .ev128ns .ev1us (ev1us), // .ev1us .hotrst_exit (hotrst_exit), // .hotrst_exit .int_status (int_status), // .int_status .l2_exit (l2_exit), // .l2_exit .lane_act (lane_act), // .lane_act .ko_cpl_spc_header (ko_cpl_spc_header), // .ko_cpl_spc_header .ko_cpl_spc_data (ko_cpl_spc_data), // .ko_cpl_spc_data .rx_in4 (1'b0), // (terminated) .rx_in5 (1'b0), // (terminated) .rx_in6 (1'b0), // (terminated) .rx_in7 (1'b0), // (terminated) .tx_out4 (), // (terminated) .tx_out5 (), // (terminated) .tx_out6 (), // (terminated) .tx_out7 (), // (terminated) .rx_fifo_empty (), // (terminated) .rx_fifo_full (), // (terminated) .rx_bar_dec_func_num (), // (terminated) .rx_st_be (), // (terminated) .tx_fifo_full (), // (terminated) .tx_fifo_rdp (), // (terminated) .tx_fifo_wrp (), // (terminated) .eidleinfersel4 (), // (terminated) .eidleinfersel5 (), // (terminated) .eidleinfersel6 (), // (terminated) .eidleinfersel7 (), // (terminated) .powerdown4 (), // (terminated) .powerdown5 (), // (terminated) .powerdown6 (), // (terminated) .powerdown7 (), // (terminated) .rxpolarity4 (), // (terminated) .rxpolarity5 (), // (terminated) .rxpolarity6 (), // (terminated) .rxpolarity7 (), // (terminated) .txcompl4 (), // (terminated) .txcompl5 (), // (terminated) .txcompl6 (), // (terminated) .txcompl7 (), // (terminated) .txdata4 (), // (terminated) .txdata5 (), // (terminated) .txdata6 (), // (terminated) .txdata7 (), // (terminated) .txdatak4 (), // (terminated) .txdatak5 (), // (terminated) .txdatak6 (), // (terminated) .txdatak7 (), // (terminated) .txdetectrx4 (), // (terminated) .txdetectrx5 (), // (terminated) .txdetectrx6 (), // (terminated) .txdetectrx7 (), // (terminated) .txelecidle4 (), // (terminated) .txelecidle5 (), // (terminated) .txelecidle6 (), // (terminated) .txelecidle7 (), // (terminated) .txswing4 (), // (terminated) .txswing5 (), // (terminated) .txswing6 (), // (terminated) .txswing7 (), // (terminated) .txmargin4 (), // (terminated) .txmargin5 (), // (terminated) .txmargin6 (), // (terminated) .txmargin7 (), // (terminated) .txdeemph4 (), // (terminated) .txdeemph5 (), // (terminated) .txdeemph6 (), // (terminated) .txdeemph7 (), // (terminated) .phystatus4 (1'b0), // (terminated) .phystatus5 (1'b0), // (terminated) .phystatus6 (1'b0), // (terminated) .phystatus7 (1'b0), // (terminated) .rxdata4 (8'b00000000), // (terminated) .rxdata5 (8'b00000000), // (terminated) .rxdata6 (8'b00000000), // (terminated) .rxdata7 (8'b00000000), // (terminated) .rxdatak4 (1'b0), // (terminated) .rxdatak5 (1'b0), // (terminated) .rxdatak6 (1'b0), // (terminated) .rxdatak7 (1'b0), // (terminated) .rxelecidle4 (1'b0), // (terminated) .rxelecidle5 (1'b0), // (terminated) .rxelecidle6 (1'b0), // (terminated) .rxelecidle7 (1'b0), // (terminated) .rxstatus4 (3'b000), // (terminated) .rxstatus5 (3'b000), // (terminated) .rxstatus6 (3'b000), // (terminated) .rxstatus7 (3'b000), // (terminated) .rxvalid4 (1'b0), // (terminated) .rxvalid5 (1'b0), // (terminated) .rxvalid6 (1'b0), // (terminated) .rxvalid7 (1'b0), // (terminated) .sim_pipe_pclk_out (), // (terminated) .pm_event_func (3'b000), // (terminated) .hip_reconfig_clk (1'b0), // (terminated) .hip_reconfig_rst_n (1'b0), // (terminated) .hip_reconfig_address (10'b0000000000), // (terminated) .hip_reconfig_byte_en (2'b00), // (terminated) .hip_reconfig_read (1'b0), // (terminated) .hip_reconfig_readdata (), // (terminated) .hip_reconfig_write (1'b0), // (terminated) .hip_reconfig_writedata (16'b0000000000000000), // (terminated) .ser_shift_load (1'b0), // (terminated) .interface_sel (1'b0), // (terminated) .app_msi_func (3'b000), // (terminated) .serr_out (), // (terminated) .aer_msi_num (5'b00000), // (terminated) .pex_msi_num (5'b00000), // (terminated) .cpl_err_func (3'b000) // (terminated) ); В этом найти быстро что-то вообще реально? Но процесс пошел, альтера у себя уже переименовала некоторые файлы с .v в .sv может быть что пока циклоны и арии с третим PCIe до нас дойдут, альтера и интерфейс к нему сделает вменяемый. Извиняюсь. Наболело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 67 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Количество портов все-равно не изменишь с помощью параметра (и ничего "сгенерировать" не получится). Надо менять сам интерфейс. А надо шашечки (модуль с портами) или ехать (иметь возможность передавать в модуль и из него сигналы)? У объекта интерфейса меняется параметр и все дела. Это да. Мегарулёз. Но это уже SystemVerilog а не просто верилог. Насколько знаю, деление на Verilog/SystemVerilog скорее условное. Стандарты до 2005 года - это V, с этого года и далее - SV. Т.е. разделения, как, например, С и C++ нету, V и SV - это один и тот же язык, название, скорее, отмечает фазу развития. Но квартус умеет. Дык, эт самое главное - главное, чтобы инструментарий поддерживал. Если поддерживает, то и надо использовать это штатное очень эффективное средство, а не городить костыли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Насколько знаю, деление на Verilog/SystemVerilog скорее условное. Стандарты до 2005 года - это V, с этого года и далее - SV. Т.е. разделения, как, например, С и C++ нету, V и SV - это один и тот же язык, название, скорее, отмечает фазу развития. Тут я не в курсе. В Квартусе надо указывать какого именно стандарта файл. Но не видел чтобы что-то переставало работать, если .v файл назначил .sv, в отличии от C++/C Дык, эт самое главное - главное, чтобы инструментарий поддерживал. Если поддерживает, то и надо использовать это штатное очень эффективное средство, а не городить костыли. Вот бы еще Альтера начала использовать собственный инструментарий, а то от их примера работы с PCI, волосы выпасть могут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 67 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Вот бы еще Альтера начала использовать собственный инструментарий, а то от их примера работы с PCI, волосы выпасть могут. Ну, пример на то и пример. Просто синтезатор с поддержкой SV интерфейсов пишут одни индусы, а примеры - другие. :) А что мешает под себя переписать так, как нравится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Ну, пример на то и пример. Просто синтезатор с поддержкой SV интерфейсов пишут одни индусы, а примеры - другие. :) А что мешает под себя переписать так, как нравится? Тем что не хочется этим заниматься каждый раз когда они чегонить апдейтят или ошибки правят. Сейчас какой-то компромисс нашел, но судя по всему если я еще буду заниматься PCIe, то к моменту выхода пятой арии или циклона, придется все переписывать. Они все вроде как менять собираются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба А надо шашечки (модуль с портами) или ехать (иметь возможность передавать в модуль и из него сигналы)? У объекта интерфейса меняется параметр и все дела. От параметра количество портов не изменится. А чтобы собрать/разобрать упакованный массив - для этого SV и интерфейсы не нужны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться