Verilog 多个不同的模块命名相同的端口

Verilog 多个不同的模块命名相同的端口,verilog,system-verilog,Verilog,System Verilog,我需要实例化Xilinx的4个收发器,因此我有4个相同的端口模块,但模块名称不同。我想使用“generate”,我尝试了嵌套`ifdef来封装模块名和其他技术,但没有成功。我不想实例化多个模块 生成循环将生成同一模块的多个实例。。这里我们需要用相同的端口实例化不同的模块名称。每个模块将以模具上的IP位置为目标 有没有办法生成? 这里是我尝试的一个例子 localparam [3:0]index[3:0] = { 4'h3,4'h2,4'h1,4'h0} ; genvar genid;

我需要实例化Xilinx的4个收发器,因此我有4个相同的端口模块,但模块名称不同。我想使用“generate”,我尝试了嵌套`ifdef来封装模块名和其他技术,但没有成功。我不想实例化多个模块

生成循环将生成同一模块的多个实例。。这里我们需要用相同的端口实例化不同的模块名称。每个模块将以模具上的IP位置为目标

有没有办法生成? 这里是我尝试的一个例子

 localparam [3:0]index[3:0] = { 4'h3,4'h2,4'h1,4'h0}  ;
  genvar genid;
  generate for (genid = 0; genid < 3; genid = genid + 1) begin : gen_common_container
    
`ifdef mac0  
if (index[genid] == 4'h0) 
  freq_cntr_0
 else if (index[genid] == 4'h1) 
  freq_cntr_1
 else if (index[genid] == 4'h2) 
  freq_cntr_2
`endif

//freq_cntr_cm   freq_cntr_inst_cm
freq_cntr_inst_cm (  // system clock & resets
   .i_clk      (sys_clk  ),
   .i_rst      (sys_rst  ),
   // clock to measure
   .i_varclk   (gt_tx_usrclk2  ),
   // measured frequency   (i_clk domain)
   .o_clkval   (freq_cnt  )
);

end
endgenerate
localparam[3:0]索引[3:0]={4'h3,4'h2,4'h1,4'h0};
genvar-genid;
为(genid=0;genid<3;genid=genid+1)开始生成:gen\u common\u容器
`ifdefmac0
if(索引[genid]==4'h0)
频率为0
else if(索引[genid]==4'h1)
频率1
else if(索引[genid]==4'h2)
频率2
`恩迪夫
//频率控制模块频率控制模块
频率指示cm(//系统时钟和复位
.i_clk(系统时钟),
.i_rst(系统),
//测量时钟
.i_varclk(gt_tx_usrclk2),
//测量频率(i_clk域)
.o_clkval(频率)
);
结束
最终生成

只要所有端口始终相同。您可以将端口列表放入
`define
宏或
`include
文件中

混搭示例,用于:


在verilog中没有办法做你想做的事情。可以在生成块中多次实例化同一模块。然而,您的示例似乎寻求在生成块中的不同定义名称之间进行选择。这是不可能的。最好的办法是手动列出所有4个实例,并去掉generate块。顺便说一句,o_clkval似乎是一个输出,对吗?在任何情况下,您都试图以这种方式从多个驱动程序驱动它。
localparam [3:0]index[3:0] = { 4'h3,4'h1,4'h2,4'h0}  ;
genvar genid;
`define freq_cntr_inst_cm_macro \
  freq_cntr_inst_cm \
  // system clock & resets \
  .i_clk      (sys_clk  ), \
  .i_rst      (sys_rst  ), \
  // clock to measure \
  .i_varclk   (gt_tx_usrclk2  ), \
  // measured frequency   (i_clk domain) \
  .o_clkval   (freq_cnt  )

generate for (genvar genid = 0; genid < 3; genid = genid + 1) begin : gen_common_container
  case(index[genid])
    4'h0 : freq_cntr_0 `freq_cntr_inst_cm_macro;
    4'h1 : freq_cntr_1 `include "freq_cntr_inst_cm.vh";
    4'h2 : freq_cntr_2 `freq_cntr_inst_cm_macro;
    4'h3 : freq_cntr_3 `include "freq_cntr_inst_cm.vh";
    default : freq_cntr_0 `freq_cntr_inst_cm_macro;
  endcase
end
endgenerate
freq_cntr_inst_cm (
// system clock & resets
.i_clk      (sys_clk  ),
.i_rst      (sys_rst  ),
// clock to measure
.i_varclk   (gt_tx_usrclk2  ),
// measured frequency   (i_clk domain)
.o_clkval   (freq_cnt  )
);