verilog:带符号的乘法不能正常工作

问题描述

我正在使用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]);

C[23:0] = $signed(A[11:0]*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;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...