2016-12-30 33 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);