2016-12-14 33 views
0

我正在試圖用不同的實例名稱多次實例化一個verilog模塊,以便它依賴於宏定義。它是這樣的使用定義宏實例化模塊名稱

`define CHAN_NO 0 
mymodule #(.chan_no(`CHAN_NO)) inst<CHAN_NO> (
    .Addr  (ADDR_A ) 
    ,.Data  (DATA_A ) 
    ,.Clk  (CLK ) 
    ); 

當然這是一個簡化的例子,因爲實例化和宏來自不同的文件。
這是可能的,如果是的話,做這種實例的正確方法是什麼。

回答

2

當然這是可能的。您應該使用生成塊:闡述樹應

genvar i; 
generate 
    for (i = 0; i < `CHAN_NO; i=i+1) 
    begin : mymodule_instance 
     mymodule #(.chan_no(i)) mymodule_inst (
      .Addr  (ADDR_A ) 
      ,.Data  (DATA_A ) 
      ,.Clk  (CLK ) 
     ); 
    end 
endgenerate 

後像這樣(例如CHAN_NO = 3):

mymodule_instance[0] 
    mymodule_inst 
mymodule_instance[1] 
    mymodule_inst 
mymodule_instance[2] 
    mymodule_inst 

編輯: 如果你想有一個實例名稱是依賴於宏,那麼你可以這樣做:

`define INSTANCE_NUM 0  
`define INSTANCE_NAME(x) instance_name``x`` 
    mymodule #(.chan_no(`INSTANCE_NUM)) `INSTANCE_NAME(`INSTANCE_NUM) (
     .Addr  (ADDR_A ) 
    ,.Data  (DATA_A ) 
    ,.Clk  (CLK ) 
    ); 
+0

生成循環是一個選項,但我的意思是特別使用宏 –

+0

我已經更新了我的答案。讓我知道,如果這是你所需要的。 –