2016-11-21 31 views
0

我的意思是在使用參數和端口數組(或扁平數組方法)旁邊,是否可以動態啓用/禁用輸入/輸出端口? 更具體地說,給出如下的簡單模塊,僅在需要時纔可以顯示 B_IN,B_OUT(B_EN = 1)?如何在verilog中動態地聲明輸入/輸出端口(顯示/不顯示)?

例如

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 

回答

-1

您可以使用預處理指令一樣`ifdef`ifndef控制在運行時編譯。

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

任何進一步引用你可以通過這個網站。

+0

'IFDEF,'IFNDEF –

+0

我不能夠正確地鍵入它,它剔的ifdef和蜱IFNDEF –

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 
0

不,你不能那樣做。請注意,Verilog是HDL,因此它是開發硬件而不是軟件。而在硬件中,不能有可變數量的引腳,同樣在Verilog中也不能有可變端口。

即使使用defineifdef宏,它們仍然是預處理器指令 ,並且在合成之後,將只有一個具有固定端口的硬件。

您可以隨時忽略不必要的端口,但不能有變量 端口。