2016-12-30 32 views
-2

我沒那麼多在verilog 我試圖調用模塊裏面,如果語句 我找不到答案在谷歌或我可能不明白我應該怎麼做我的代碼模塊裏面,如果在verilog

我的代碼是一個全加器除了 我需要的IF,因爲我想添加其他的東西

這是我的代碼:

module top (a,b,cin,Cout,Ctemp,sum,clk,X); 
input [3:0] a,b; 
input X; 
input cin,clk; 
output reg[3:0] sum; 
output reg[2:0] Ctemp; 
output reg Cout; 
[email protected](posedge clk) 
begin 
generate 
if (X==1) 
add bit0(a[0], b[0], cin, sum[0], Ctemp[0]); //here i need to call add module 
add bit1(a[1], b[1], Ctemp[0], sum[1], Ctemp[1]); 
add bit2(a[2], b[2], Ctemp[1], sum[2], Ctemp[2]); 
add bit3(a[3], b[3], Ctemp[2], sum[3], Cout); 
end 
endgenerate 
endmodule 

module add(a, b, cin, sum, cout); 
input a; 
input b; 
input cin; 
output sum; 
output cout; 
assign sum = (~a*~b*cin)+(~a*b*~cin)+(a*~b*~cin)+(a*b*cin); 
assign cout = (a*b)+(a*cin)+(b*cin); 
endmodule 
+1

您不能在'always'塊中使用'generate'塊。你不「調用」模塊,你「實例化」它們,並且你不能在always塊中實例化一個模型。 – Greg

+0

所以我的工作大部分都是錯誤的:/ ..謝謝你@Greg –

回答

0

我給一些提示。您需要將模塊實例移至always塊(上方或下方)之外。然後爲模塊的輸出添加額外的wire聲明。我建議將模塊實例化端口連接修改爲顯式(按名稱連接)而不是隱式(按順序連接)。通過這種方式即使端口順序發生變化,連接也會保持不變。對於有很多端口的模塊非常有用。 您的頂層模塊的主體應該看起來是這樣的:

// ... 
add bit3(.a(a[3]), .b(b[3]), .cin(Ctemp[2]), .sum(pre_sum[3]), .cout(pre_cout)); 
[email protected](posedge clk) 
begin 
    if (X==1) begin 
    sum <= pre_sum; 
    Cout <= pre_cout; 
    end 
end 

其他推薦:使用ANSI風格模塊頭;它更少打字,更容易維護。在本世紀之前,真正的舊仿真需要非ANSI風格。例如:

module top (
    input [3:0] a, b, 
    input  cin, 
    output reg  Cout, 
    output  [2:0] Ctemp, 
    output reg [3:0] sum, 
    input clk, 
    input X);