Jump to content
    

Как создать модуль с переменным кол-вом портов?

Хочу создать модуль с 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 автоматом добавлялось/уменьшалось?

Share this post


Link to post
Share on other sites

Как написать на верилоге такой модуль, чтобы менять только какойнить параметр и кол-во портов in автоматом добавлялось/уменьшалось?

Через предпроцессор попробовать разве что.

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Использовать вместо input, output интерфейсы. В них можно сгенерировать сколько угодно каких угодно портов да плюс логики наворотить. Мегавещь, очень рекомендую.

Share this post


Link to post
Share on other sites

Использовать вместо input, output интерфейсы. В них можно сгенерировать сколько угодно каких угодно портов да плюс логики наворотить. Мегавещь, очень рекомендую.

Это да. Мегарулёз. Но это уже SystemVerilog а не просто верилог. Но квартус умеет.

Share this post


Link to post
Share on other sites

Использовать вместо input, output интерфейсы. В них можно сгенерировать сколько угодно каких угодно портов да плюс логики наворотить. Мегавещь, очень рекомендую.

Количество портов все-равно не изменишь с помощью параметра (и ничего "сгенерировать" не получится). Надо менять сам интерфейс.

Share this post


Link to post
Share on other sites

Хочу создать модуль с n портов, каждый из которых будет шириной w бит. С шириной разобрался, вот заготовка с одним портом входа шириной по умолчаний в 2 бита.

n*w - это логичнее оформлять, как массив длины n из шин шириной w. Проблема, что в простом Верилоге запрещены порты-массивы, но можно запаковать массив в один порт параметризованной длины n*w, а внутри модуля распаковать в нормальный массив.

Share this post


Link to post
Share on other sites

Количество портов все-равно не изменишь с помощью параметра (и ничего "сгенерировать" не получится). Надо менять сам интерфейс.

Если интерефейс идет через несколько модулей, то проще добавить дополнительно сигнал в интерфейс а не добавлять сигналы в каждый модуль. Плюс когда сигналов много, это достает шокапец. Пример альтеровский.

 

        .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 до нас дойдут, альтера и интерфейс к нему сделает вменяемый.

 

Извиняюсь. Наболело.

Share this post


Link to post
Share on other sites

Количество портов все-равно не изменишь с помощью параметра (и ничего "сгенерировать" не получится). Надо менять сам интерфейс.

А надо шашечки (модуль с портами) или ехать (иметь возможность передавать в модуль и из него сигналы)? У объекта интерфейса меняется параметр и все дела.

 

Это да. Мегарулёз. Но это уже SystemVerilog а не просто верилог.

Насколько знаю, деление на Verilog/SystemVerilog скорее условное. Стандарты до 2005 года - это V, с этого года и далее - SV. Т.е. разделения, как, например, С и C++ нету, V и SV - это один и тот же язык, название, скорее, отмечает фазу развития.

 

Но квартус умеет.

Дык, эт самое главное - главное, чтобы инструментарий поддерживал. Если поддерживает, то и надо использовать это штатное очень эффективное средство, а не городить костыли.

Share this post


Link to post
Share on other sites

Насколько знаю, деление на Verilog/SystemVerilog скорее условное. Стандарты до 2005 года - это V, с этого года и далее - SV. Т.е. разделения, как, например, С и C++ нету, V и SV - это один и тот же язык, название, скорее, отмечает фазу развития.

Тут я не в курсе. В Квартусе надо указывать какого именно стандарта файл. Но не видел чтобы что-то переставало работать, если .v файл назначил .sv, в отличии от C++/C

 

Дык, эт самое главное - главное, чтобы инструментарий поддерживал. Если поддерживает, то и надо использовать это штатное очень эффективное средство, а не городить костыли.

Вот бы еще Альтера начала использовать собственный инструментарий, а то от их примера работы с PCI, волосы выпасть могут.

Share this post


Link to post
Share on other sites

Вот бы еще Альтера начала использовать собственный инструментарий, а то от их примера работы с PCI, волосы выпасть могут.

Ну, пример на то и пример. Просто синтезатор с поддержкой SV интерфейсов пишут одни индусы, а примеры - другие. :) А что мешает под себя переписать так, как нравится?

Share this post


Link to post
Share on other sites

Ну, пример на то и пример. Просто синтезатор с поддержкой SV интерфейсов пишут одни индусы, а примеры - другие. :) А что мешает под себя переписать так, как нравится?

Тем что не хочется этим заниматься каждый раз когда они чегонить апдейтят или ошибки правят. Сейчас какой-то компромисс нашел, но судя по всему если я еще буду заниматься PCIe, то к моменту выхода пятой арии или циклона, придется все переписывать. Они все вроде как менять собираются.

Share this post


Link to post
Share on other sites

А надо шашечки (модуль с портами) или ехать (иметь возможность передавать в модуль и из него сигналы)? У объекта интерфейса меняется параметр и все дела.

От параметра количество портов не изменится. А чтобы собрать/разобрать упакованный массив - для этого SV и интерфейсы не нужны.

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