为什么我在endmodule附近收到语法错误

时间:2019-12-28 09:23:23

标签: verilog

我正在尝试编写一个模块Inc_dec(L),该模块接收和编号a,以及两位inc和dec,并根据a + inc + dec的总和更新总和和上溢/下溢。如果发生溢出,则总和更新为0,如果发生下溢,则总和为L-1,否则保持不变。

这是我的代码:

module Inc_Dec(a, inc, dec, sum, overflow, underflow);

parameter L = 10;
parameter N = $clog2(L);

input [N-1:0] a;
input inc, dec;
output reg [N-1:0] sum;
output overflow, underflow;

wire [1:0] sum_inc;
wire [N-1:0] sum_adder;
wire co;
wire ci;
reg dec_exp;
reg dec_reg;
reg of;
reg uf;

assign overflow = of;
assign underflow = uf;
//assign sum = sum_adder; 


Adder #(2) add1 ({0,inc}, {dec_exp,dec_reg}, 0, sum_inc, co);  
Adder #(N) add2 (a, { {(N-2){1'b0}},sum_inc }, 0, sum_adder, co); 

always @(*) begin
        if (dec > 0) begin
            dec_reg = 1;
            dec_exp = 1;
        end 
        else begin
            dec_reg = 0;
            dec_exp = 0;
  `         end
        if({co,sum_adder} >= L) begin
            of = 1;
            uf = 0;
            sum = 0;
        end
        else if({co,sum_adder} < 0) begin
            uf = 1;
            of = 0;
            sum = L-1;
        end
        else begin
            of = 0;
            uf = 0;
            sum = sum_adder[N-1:0];
        end
end 

endmodule

但是我在endmodule附近收到语法错误,还有一些其他我不明白的错误,例如: 未定义宏。 有人可以帮我找到问题吗?

1 个答案:

答案 0 :(得分:1)

第一个问题是您在第37行中引用了

  `         end
  ^ Here 

下一个可能弹出的问题是您有一个信号co用于以下用途:

Adder #(2) add1 ({0,inc}, {dec_exp,dec_reg}, 0, sum_inc, co);  
Adder #(N) add2 (a, { {(N-2){1'b0}},sum_inc }, 0, sum_adder, co); 

我不知道加法器的代码,我可能是自欺欺人,但我的猜测是加法器的最后一个端口是输出。在这种情况下,您会遇到问题:在两种情况下都将co用于输出,因此将其分配了两次值。或所谓的“多重驱动”。你应该解决这个问题。

在查看您的代码时,我还发现了其他一些问题:

请使用新的端口定义格式:

module Inc_Dec
#(parameter L = 10,
            N = $clog2(L)
 )
( input [N-1:0] a,
  input inc, dec,
  output reg [N-1:0] sum,
  output overflow, underflow
  );

实例化模块时也是如此:

Adder #(2) add1 (
    .portname1 ( {0,inc} ),         
    .portname2 ( {dec_exp,dec_reg} ),
    .portname3 ( 0 ),
    ...
  );

同样,我不知道加法器的代码,但是在一个地方使用了:{0,inc},它不会添加任何内容,只是您可能对传递正确大小的向量有些挑剔。但这与使用0,作为参数的情况稍有不同,因为这是一个32位宽的值。

默认值是无符号的,因此:

if({co,sum_adder} < 0)

不起作用。如果您将{co,sum_adder}解释为带符号的值,那么如果设置了co,则它为负。因此,您只需要检查co:

if (co)

我只看了一下您的代码,所以可能会有更多错误,但是我建议您先解决这些问题。

(并补充粘贴真实代码,否则很难找到多余的报价)