Verilog码符号Mag加法器的综合问题

Verilog码符号Mag加法器的综合问题,verilog,fpga,Verilog,Fpga,我用Verilog描述了一个符号mag加法器,但我在合成时得到了以下错误: `timescale 1ns / 1ps module Signadder( input wire [3:0] a, input wire [3:0] b, output reg [3:0] sum ); reg [2:0] mag_a, mag_b,mag_sum, max, min; reg sign_a, sign_b, sign_sum; alw

我用Verilog描述了一个符号mag加法器,但我在合成时得到了以下错误:

`timescale 1ns / 1ps
module Signadder(
    input wire [3:0] a,
    input wire [3:0] b,
    output reg [3:0] sum
    );

    reg [2:0] mag_a, mag_b,mag_sum, max, min;
    reg sign_a, sign_b, sign_sum;
    
    always @*
    begin 
        mag_a = [2:0]a;
        mag_b = [2:0]b;
        sign_a = [3]a;
        sign_b = [3]b;
            
        if(mag_a>mag_b) 
            begin 
             max = mag_a;
             min = mag_b;
             sign_sum = sign_a; 
            end
        else 
            begin 
             max = mag_b;
             min = mag_a;
             sign_sum = sign_b;
            end
        if (sign_a == sign_b)
         mag_sum = mag_a +mag_b;
        else
         mag_sum = max - min;
        assign sum = {sign_sum,mag_sum};
        end
        
endmodule
我在我的Verilog代码中找不到任何语法错误,对于“a不是任务”,我使用中间寄存器修复它:

Line 35: Syntax error near "[".
Line 36: Syntax error near "[".
Line 33: a is not a task
Line 34: b is not a task

但是,它仍然不起作用。我希望有人知道原因。

语法错误是由于以下几行造成的:

reg [3:0] a1;
reg [3:0]b1;
a1 = a;
b1 = b;
信号名称应位于方括号的左侧:

 mag_a = [2:0]a;
 mag_b = [2:0]b;
 sign_a = [3]a;
 sign_b = [3]b;

除此之外,对于可合成代码,您没有遵循良好的编码实践

您不应在
始终
块中使用
分配
关键字

始终
块中有组合反馈循环。您不应读取和分配同一信号。例如,
mag_a

    mag_a = a[2:0];
    mag_b = b[2:0];
    sign_a = a[3];
    sign_b = b[3];

代码是工作。我真的很感谢你。事实上,我正在学习FPGA设计,并根据Pong P.Chu的书“Verilog示例的FPGA原型设计”编写代码,我认为这本书中的一些代码出了问题。
mag_a = a[2:0];
max = mag_a;