Verilog 多个不同的模块命名相同的端口
我需要实例化Xilinx的4个收发器,因此我有4个相同的端口模块,但模块名称不同。我想使用“generate”,我尝试了嵌套`ifdef来封装模块名和其他技术,但没有成功。我不想实例化多个模块 生成循环将生成同一模块的多个实例。。这里我们需要用相同的端口实例化不同的模块名称。每个模块将以模具上的IP位置为目标 有没有办法生成? 这里是我尝试的一个例子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;
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 )
);