我的意思是除了使用参数和端口数组(或展平数组方法)之外,是否可以动态启用/禁用输入/输出端口? 更具体地说,给定如下的简单模块,是否可以仅显示 B_IN,B_OUT仅在需要时(B_EN = 1)?
例如
module WEIRD_MOD#(
parameter integer WIDTH_A=8,
parameter integer B_EN=0,
parameter integer WIDTH_B=13;
)
(
input [WIDTH_A-1:0] A_IN,
output [WIDTH_A-1:0] A_OUT,
// ******************************//
// only valid/show when B_EN =1 //
// ******************************//
//input [WIDTH_B-1:0] B_IN,
//output [WIDTH_B-1:0] B_OUT,
);
genvar idx_bit;
generate
for( idx_bit=0; idx_bit<WIDTH_A; idx_bit= idx_bit+1)
begin
bit_inv inv_inst(.IN(A_OUT[idx_bit]),.OUT(A_OUT[idx_bit]));
end
if(B_EN)
begin
for( idx_bit=0; idx_bit<WIDTH_B; idx_bit= idx_bit+1)
begin
bit_buf buf_inst(.IN(B_OUT[idx_bit]),.OUT(B_OUT[idx_bit]));
end
end
endgenerate
endmodule
答案 0 :(得分:1)
不,Verilog不允许您使用参数更改端口数量或方向。使用`ifdef
和`define
等宏只能为所有实例更改它们。
您可以做的一件事是在启用B_EN时将A和B端口的宽度合并为一个端口。
module WEIRD_MOD#(
parameter integer WIDTH_A=8,
parameter integer B_EN=0,
parameter integer WIDTH_B=13;
)
(
input [WIDTH_A-1 + (B_EN ? WIDTH_B : 0) :0] AB_IN,
output [WIDTH_A-1 + (B_EN ? WIDTH_B : 0) :0] AB_OUT,
);
genvar idx_bit;
generate
for( idx_bit=0; idx_bit<WIDTH_A; idx_bit= idx_bit+1)
begin
bit_inv inv_inst(.IN(A_OUT[idx_bit]),.OUT(A_OUT[idx_bit]));
end
if(B_EN)
begin
for( idx_bit=0; idx_bit<WIDTH_B; idx_bit= idx_bit+1)
begin
bit_buf buf_inst(.IN(B_OUT[idx_bit+WIDTH_A]),.OUT(B_OUT[idx_bit+WIDTH_A]));
end
end
endgenerate
endmodule
答案 1 :(得分:0)
不,你不能这样做。请注意,Verilog是HDL,因此它是开发硬件而不是软件。而且在硬件中你可以拥有可变数量的引脚,类似于Verilog,你也不能拥有可变端口。
即使您使用define
或ifdef
宏,它们仍然是预处理程序指令
合成后,您将只有一个带固定端口的硬件。
您可以随时忽略不必要的端口,但不能拥有变量 端口。
答案 2 :(得分:-1)
您可以使用预处理程序指令(如`ifdef
,`ifndef
)来控制运行时的编译。
http://www.asic-world.com/verilog/compiler1.html
任何进一步的参考资料,您都可以浏览本网站。