模块里面如果在verilog中

时间:2016-12-30 22:26:19

标签: if-statement verilog

我在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

1 个答案:

答案 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 );