2014-12-26 106 views
0

我想在Verilog中創建一個模塊,它必須在端口中獲得一個32位寬的寄存器變量。這個變量將被用來計數時鐘週期。然後這個模塊將在另一個模塊中實例化。例如:當我修復計數器的值時,該模塊必須從該值開始計數。Verilog中的端口聲明中的寄存器變量

當我模擬這個代碼中,我得到一個錯誤:

Non-net port count cannot be of mode input

module case_1(input clk , input [31:0] counter); 
    reg [31:0] counter; 

    always @ (posedge clk) 
    begin 
     counter <=counter +1 
    end 

endmodule 

module counter (input clk , input [31:0] counter) 
    reg [31:0] counter; 
    case_1 h1 (.clk(clk) , .counter(counter)) 
endmodule 
+0

您在同一時刻將'counter'定義爲'input'信號和一個寄存器。這不可能。 – Qiu

+0

但我怎麼能做到這一點..請你可以糾正這個 – Misal313

+1

'case_1'你有計數器作爲輸入,然後驅動一個值到它。如果你駕駛的價值應該不是輸出? – Morgan

回答

2

如果模塊的輸入,那麼你不能給它驅動的價值。將價值推動到一個輸入是沒有意義的。它需要是一個輸出。

它認爲Verilog中的regwire類型可能存在一些混淆。這些類型不跨模塊接口。一個較低的(子)模塊作爲一個reg類型驅動其輸出。下一層電線連接到端口。

從你的例子中,計數器接收到一個使用子模塊case_1來實現計數器的時鐘。計數器值然後被驅動(首先作爲一個reg)然後作爲一個電線在頂層。

module case_1( 
    input clk , 
    output reg [31:0] counter 
); 

    initial begin 
    counter = 'b0; 
    end 

    always @ (posedge clk) begin 
    counter <=counter +1; 
    end 

endmodule 

module counter (input clk , output wire [31:0] counter); 
    case_1 h1 (.clk(clk) , . counter(counter)); 
endmodule 

EDA Playground實施例。