我在verilog中没有那么多 我试图在if语句中调用一个模块 我无法在谷歌找到答案,或者我不明白我应该怎样处理我的代码
我的代码是一个完整的加法器 我需要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;
always@(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
答案 0 :(得分:0)
我会给出一些提示。您需要在always
块(上方或下方)之外移动模块实例。然后为您将要崩溃的模块的输出添加额外的wire
声明。我建议将模块实例化端口连接修改为显式(connect-by-name)而不是隐式(按顺序连接)。这种方式即使端口顺序发生变化,也会保持连接。对于具有大量端口的模块非常有用。
顶层模块的主体应如下所示:
// ...
add bit3( .a(a[3]), .b(b[3]), .cin(Ctemp[2]), .sum(pre_sum[3]), .cout(pre_cout));
always@(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 );