verilog:有符号乘法无法正常工作

verilog:有符号乘法无法正常工作,verilog,multiplication,signed,vivado,Verilog,Multiplication,Signed,Vivado,我使用vivado v2016.4行为模拟来模拟下面显示的verilog代码。测试夹具代码也显示在主verilog代码下面 控制台输出显示: A = -13 B = 4 C = 16332 此外,如果我遍历寄存器变量,我会看到以下内容: ff3 for A 004 for B 003fcc for C 如果改用-52或ffffcc,则乘法会给出正确的结果 C[23:0] = $signed(A[11:0])*signed(B[11:0]); 或 为什么我需要使用$sig

我使用vivado v2016.4行为模拟来模拟下面显示的verilog代码。测试夹具代码也显示在主verilog代码下面

控制台输出显示:

A =   -13
B =     4
C =     16332
此外,如果我遍历寄存器变量,我会看到以下内容:

ff3 for A
004 for B
003fcc for C
如果改用-52或ffffcc,则乘法会给出正确的结果

C[23:0] = $signed(A[11:0])*signed(B[11:0]);

为什么我需要使用$signed来获得正确的结果

斯蒂芬

主Verilog代码:

module test1(
           input CLK,
           input RST_AL,
           input signed [11:0]A,
           input signed [11:0]B
    );
    
reg signed [10:0]z;
reg signed [4:0]x;
reg signed [4:0]y;

reg signed [23:0]C;  

initial x = 0;
   
always @(posedge CLK, negedge RST_AL) begin    
    if(RST_AL == 0) begin
        x[4:0] <= 0;
        y[4:0] <= 0;
        z[10:0] <= 0;
        C[23:0] <= 0;
    end else begin
        C[23:0] = A[11:0]*B[11:0];
        $display("A = %d",A);
        $display("B = %d",B);
        $display("C = %d",C);
    end
end

endmodule
module test1_testfix;
    reg RST_AL;
    reg CLK;
    reg signed [11:0]A;
    reg signed [11:0]B;    

    
    test1 uut (
        CLK,
        RST_AL,
        A,
        B
     );
     
    initial begin
        // Initialize Inputs
       RST_AL = 0;
       CLK = 0;
       A = -13;
       B = 4;  
       #100
       RST_AL = 1;
       #100000000
       RST_AL = 1;
     end
     
     
     always 
        #5 CLK =  ! CLK;
endmodule

这是因为信号的一部分总是无符号的。即使在选择整个范围时也是如此。所以最好不要使用零件选择。你可以写:

 C = A *B;

这是因为信号的一部分总是无符号的。即使在选择整个范围时也是如此。所以最好不要使用零件选择。你可以写:

 C = A *B;

谢谢我没有意识到这一点。这是违反直觉的,因为在我的案例中,我选择了整个寄存器。最好将信号作为一个整体使用,而不选择部分来显示这是您的意图。此外,如果更改宽度,则只有一个位置可以进行更改。如果你忘记了或犯了错误,那就很难找到了。谢谢。我没有意识到这一点。这是违反直觉的,因为在我的案例中,我选择了整个寄存器。最好将信号作为一个整体使用,而不选择部分来显示这是您的意图。此外,如果更改宽度,则只有一个位置可以进行更改。如果你忘记了或犯了错误,就很难找到。