使用generate调用Verilog中的模块

时间:2015-11-24 06:29:02

标签: module compilation verilog

我试图将我编写的两个模块组合起来创建一个加法器/减法器模块,但我遇到了将它拼凑在一起的问题。以下是我到目前为止:

`include "invert.v"          //since I'll be using 2s complement for subtraction
`include "add.v"             //basic add which also produces an overflow bit

module addsub(A,B,O,overflow);

input  [7:0] A,B;
output [7:0] O;
output       overflow;

wire [7:0] notB;
                    //active high
generate
   if(B[7] == 1)
     invert iv1(B,notB);
     add ad1(A,notB,O,overflow);
   else(B[7] == 0)
     add ad2(A,B,O,overflow);
endgenerate

endmodule

这些是我收到的错误:

错误 - 先前声明的[MPD]模块   该模块先前已声明:   " invert.v",3   稍后将重新宣布:   " invert.v",3:令牌是'反转'   模块反转(in,out);                ^   请删除其中一个声明并重新编译。

返回文件' add.v'。 返回文件' addsub.v'。

错误 - [SE]语法错误   以下verilog源有语法错误:   " addsub.v",17:令牌是'否则'      别的(B [7] == 0)          ^ 2个错误

我是verilog的新手,所以非常感谢任何帮助!

下面列出了

-edit-adder和invert:

//adder  
module add(A,B,O,co);

input  [7:0] A,B;
output [7:0] O;
output reg co;

wire [8:0] tmp;

assign tmp = A+B;
assign O = tmp[7:0];

always@*
begin
  if(tmp[8] == 1)
    assign co = 1;
  else if(tmp[8] == 0)
    assign co = 0;
end

endmodule

//inverter
module invert(in,out);

input     [7:0] in;
output    [7:0] out;

assign out[0] =  ~in[0];
assign out[1] =  ~in[1];
assign out[2] =  ~in[2];
assign out[3] =  ~in[3];
assign out[4] =  ~in[4];
assign out[5] =  ~in[5];
assign out[6] =  ~in[6];
assign out[7] =  ~in[7];

endmodule

1 个答案:

答案 0 :(得分:1)

在合成时评估生成语句。这意味着if语句中的if语句必须是常量。它们可以由模块PARAMETERS更改,但不能由INPUTS更改,因为参数是常量但输入是可变的。

您需要的不是生成语句,而是一些多路复用器。您可以实例化两个加法器并根据B [7]切换O和溢出,或者您可以实例化一个加法器并根据B [7]切换B输入。

所以要么

`include "invert.v"          //since I'll be using 2s complement for subtraction
`include "add.v"             //basic add which also produces an overflow bit

module addsub(A,B,O,overflow);

input  [7:0] A,B;
output [7:0] O;
output       overflow;

wire [7:0] notB;

wire [7:0] O1, O2;
wire ovf1, ovf2;

invert iv1(B,notB);
add ad1(A,notB,O1,ovf1);
add ad2(A,B,O2,ovf2);

assign O = B[7] ? O1 : O2;
assign overflow = B[7] ? ovf1 : ovf2;

endmodule

`include "invert.v"          //since I'll be using 2s complement for subtraction
`include "add.v"             //basic add which also produces an overflow bit

module addsub(A,B,O,overflow);

input  [7:0] A,B;
output [7:0] O;
output       overflow;

wire [7:0] notB;

wire [7:0] B2;

invert iv1(B,notB);

assign B2 = B[7] ? notB : B;

add ad1(A,B2,O,overflow);

endmodule

如果您愿意,也可以将多路复用器[s]移动到单独的模块中。