【问题标题】:Problem in synthesize Verilog code Sign_Mag adder合成 Verilog 代码 Sign_Mag 加法器中的问题
【发布时间】:2021-05-13 02:36:43
【问题描述】:
`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 描述了一个 Sign_mag 加法器,但是在我合成时出现这些错误:

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

我在我的 Verilog 代码中找不到任何语法错误,并且“a 不是任务”,我通过使用中间寄存器来修复它:

reg [3:0] a1;
reg [3:0]b1;
a1 = a;
b1 = b;

但是,它仍然不起作用。我希望有人知道为什么。

【问题讨论】:

    标签: verilog fpga


    【解决方案1】:

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

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

    信号名称应该在方括号的左边:

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

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

    您不应在 always 块内使用 assign 关键字。

    always 块内有组合反馈循环。您不应读取和分配相同的信号。例如mag_a:

    mag_a = a[2:0];
    max = mag_a;
    

    【讨论】:

    • 代码有效。我真诚地感谢你。事实上,我正在学习 FPGA 设计,我根据 Pong P.Chu 的“FPGA 原型设计 by Verilog 示例”一书编写代码,我认为这本书中的某些代码有问题。
    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多