如何在verilog中动态声明输入/输出端口(显示/不显示)?

时间:2016-11-21 09:46:54

标签: verilog

我的意思是除了使用参数和端口数组(或展平数组方法)之外,是否可以动态启用/禁用输入/输出端口? 更具体地说,给定如下的简单模块,是否可以仅显示 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

3 个答案:

答案 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,你也不能拥有可变端口。

即使您使用defineifdef宏,它们仍然是预处理程序指令 合成后,您将只有一个带固定端口的硬件。

  

您可以随时忽略不必要的端口,但不能拥有变量   端口。

答案 2 :(得分:-1)

您可以使用预处理程序指令(如`ifdef`ifndef)来控制运行时的编译。

http://www.asic-world.com/verilog/compiler1.html

任何进一步的参考资料,您都可以浏览本网站。