2014-04-21 52 views
1

我在Verilog中設計了一個模塊(A),我需要在頂層模塊中實例化它四次。這兩個模塊相互之間以及其他一些模塊進行通信。 'A'發出了'A'的另一個實例應該接受的一些信號。信號通過接口或總線發送。我不想通過整合任何標準總線協議來使設計複雜化。我創建了一個inout端口,以避免輸入和輸出具有相同類型的端口。爲Verilog模塊分配一個ID號或代碼

是否有任何方法爲每個實例分配一個id或一個代碼,以便每個實例都檢查該id並接受來自與自身不同的ID的信號。目前沒有id或標準總線協議,模塊也接受它們自己的信號,這不應該發生。

回答

0

下面的方法可以做到這一點:

  1. 添加ID輸入端口
    當此端口渡過一個常數,在上電時該設備可以檢測到其ID。從技術上講,你可以用這個做動態ID,但通常你只需要將端口連接到一個常量值。這是最靈活的選擇,特別是如果您希望將最終產品用作可配置組件。
    module A (/* your_ports */, input [1:0] ID); 
    /* ... code ... */ 
    endmodule 
    module top; 
    A inst0 (.ID(2'd0), .*); 
    A inst1 (.ID(2'd1), .*); 
    A inst2 (.ID(2'd2), .*); 
    A inst3 (.ID(2'd3), .*); 
    endmodule
  2. 不同的是值是硬編碼創建ID參數
    模擬到ID輸入端口和所述實例知道在編譯時的ID值,之前模擬或設備上電。獨特的參數值生成獨特的模塊。如果ID是0,則它將與ID爲1的物理上不同。
    module A #(parameter ID) (/* your_ports */); 
    /* ... code ... */ 
    endmodule 
    module top; 
    A #(.ID(0)) inst0 (.*); 
    A #(.ID(1)) inst1 (.*); 
    A #(.ID(2)) inst2 (.*); 
    A #(.ID(3)) inst3 (.*); 
    endmodule 
    
0

爲什麼不爲每個模塊設置參數並將其用作ID?然後設置參數唯一爲每個實例:

module A; 
    parameter ID = 0; //default value 
    case (ID) 
     0: //specific code for ID0 
     1: //specific code for ID1 
     2: //specific code for ID2 
     3: //specific code for ID3 
    endcase 
endmodule 

,而最模塊:

module top; 

    A #(.ID(0)) inst_0 (...); 
    A #(.ID(1)) inst_1 (...); 
    A #(.ID(2)) inst_2 (...); 
    A #(.ID(3)) inst_3 (...); 

endmodule 

一對夫婦的其他有用的觀點:

您可能要檢查generate blockvectorized/array module instantiation,這讓你實例化一個模塊數組。

另外,請注意,一般情況下,每個模塊都可以看到整個層次結構。每個模塊裏面,你可以使用hierarchical expression接入信號:

module A; 
    reg s; 
    .... 
    initial $display("The initial value of signal s in instance A_2 is:", top.inst_2.s); 
endmodule 

要小心的是不建議這樣做,因爲你的模塊描述是具體到您的層次結構。