在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: 2441697316

[求助] Verilog补码乘法

[复制链接]
发表于 2024-9-27 15:04:16 | 显示全部楼层
Thanks
 楼主| 发表于 2024-9-27 15:37:34 | 显示全部楼层


liuguangxi 发表于 2024-9-27 14:46
当然可以综合,主流EDA工具都支持



您看看我写的代码,位宽处理有没有问题
//////
wire signed [7:0] byte3_a;
wire signed [7:0] byte2_a;
wire signed [7:0] byte1_a;
wire signed [7:0] byte0_a;


wire signed [7:0] byte3_b;
wire signed [7:0] byte2_b;
wire signed [7:0] byte1_b;
wire signed [7:0] byte0_b;


assign byte3_a [7:0] = data_in_a[31:24];

assign byte2_a [7:0] = data_in_a[23:16];

assign byte1_a [7:0] = data_in_a[15: 8];



assign byte0_a [7:0] = data_in_a[ 7: 0];



assign byte3_b [7:0] = data_in_b[31:24];

assign byte2_b [7:0] = data_in_b[23:16];
assign byte1_b [7:0] = data_in_b[15: 8];

assign byte0_b [7:0] = data_in_b[ 7: 0];


///////

wire signed [7:0] byte3_a_sgn;
wire signed [7:0] byte2_a_sgn;
wire signed [7:0] byte1_a_sgn;
wire signed [7:0] byte0_a_sgn;


wire signed [7:0] byte3_b_sgn;
wire signed [7:0] byte2_b_sgn;
wire signed [7:0] byte1_b_sgn;
wire signed [7:0] byte0_b_sgn;



assign byte3_a_sgn [7:0] = {sign_a && byte3_a[7] , byte3_a[6:0]};

assign byte2_a_sgn [7:0] = {sign_a && byte2_a[7] , byte2_a[6:0]};
assign byte1_a_sgn [7:0] = {sign_a && byte1_a[7] , byte1_a[6:0]};


assign byte0_a_sgn [7:0] = {sign_a && byte0_a[7] , byte0_a[6:0]};



assign byte3_b_sgn [7:0] = {sign_b && byte3_b[7] , byte3_b[6:0]};

assign byte2_b_sgn [7:0] = {sign_b && byte2_b[7] , byte2_b[6:0]};
assign byte1_b_sgn [7:0] = {sign_b && byte1_b[7] , byte1_b[6:0]};

assign byte0_b_sgn [7:0] = {sign_b && byte0_b[7] , byte0_b[6:0]};



/////

reg signed [15:0] mult_byte3;
reg signed [15:0] mult_byte2;
reg signed [15:0] mult_byte1;
reg signed [15:0] mult_byte0;

always@(...)begin
    if(!rstn)begin
        mult_byte3[15:0] <= 16'b0;
        mult_byte2[15:0] <= 16'b0;
        mult_byte1[15:0] <= 16'b0;
        mult_byte0[15:0] <= 16'b0;
    end
    else if(mult_flag)begin

        mult_byte3[15:0] <= byte3_a_sgn[7:0] * byte3_b_sgn[7:0] ;
        mult_byte2[15:0] <= byte2_a_sgn[7:0] * byte2_b_sgn[7:0] ;
        mult_byte1[15:0] <= byte1_a_sgn[7:0] * byte1_b_sgn[7:0] ;
        mult_byte0[15:0] <= byte0_a_sgn[7:0] * byte0_b_sgn[7:0] ;
    end

end


/////

reg signed [17:0] mult_byte_sum;

always@(...)begin
    if(!rstn)
        mult_byte_sum[17:0] <= 18'b0;
    else if(mult_sum_flag)

        mult_byte_sum[17:0] <= mult_byte3[15:0] +
                                             mult_byte2[15:0] +
                                             mult_byte1[15:0] +
                                             mult_byte0[15:0];
end



/////


reg signed [31:0] sum;
always@(...)begin
    if(!rstn)
        sum[31:0] <= 32'b0;
    else if(sum_flag)

        sum[31:0] <= sum[31:0] + mult_byte_sum[17:0];
    else
        sum[31:0] <= 32'b0;
end








发表于 2024-9-28 15:30:26 来自手机 | 显示全部楼层


2441697316 发表于 2024-9-24 20:50
要能软件配置有符号还是无符号,比如有*有,有*无,无*有,无*无,直接定义signed的电路好像不能复用




复用跟有无符号无关,应该说一般情况下每个*运算符会综合出一个乘法器,除非公共子表达式之类的优化有可能减少乘法器的数量
发表于 2024-9-29 10:38:32 | 显示全部楼层


2441697316 发表于 2024-9-27 15:37
您看看我写的代码,位宽处理有没有问题
//////
wire signed [7:0] byte3_a;


主要还得确认下byte3_a等几个数在表示无符号数时最高位是不是一定为0?

如果是,那么这么写就行;否则需要符号位再扩展一位到9bit。
 楼主| 发表于 2024-10-8 10:44:18 | 显示全部楼层


liuguangxi 发表于 2024-9-29 10:38
主要还得确认下byte3_a等几个数在表示无符号数时最高位是不是一定为0?

如果是,那么这么写就行;否则需 ...


仿真看了下,signed定义的加法怎么是按无符号数算的


/////
这里几个16位有符号数有正有负,加出来的18位结果是无符号加法的结果
reg signed [17:0] mult_byte_sum;
always@(...)begin
    if(!rstn)
        mult_byte_sum[17:0] <= 18'b0;
    else if(mult_sum_flag)
        mult_byte_sum[17:0] <= mult_byte3[15:0] +
                                             mult_byte2[15:0] +
                                             mult_byte1[15:0] +
                                             mult_byte0[15:0];
end
/////
这里也是无符号结果
reg signed [31:0] sum;
always@(...)begin
    if(!rstn)
        sum[31:0] <= 32'b0;
    else if(sum_flag)
        sum[31:0] <= sum[31:0] + mult_byte_sum[17:0];
    else
        sum[31:0] <= 32'b0;
end


 楼主| 发表于 2024-10-8 10:59:21 | 显示全部楼层


liuguangxi 发表于 2024-9-29 10:38
主要还得确认下byte3_a等几个数在表示无符号数时最高位是不是一定为0?

如果是,那么这么写就行;否则需 ...


乘法也是按无符号数规则算的,比如这里



mult_byte3[15:0] <= byte3_a_sgn[7:0] * byte3_b_sgn[7:0] ;

byte3_a_sgn等于0x87(-121

byte3_b_sgn等于0xb4(-76

结果应该是23ec(+9196
但仿真结果是5eec(无符号数0x87 * 0xb4的结果
发表于 2024-10-8 12:22:17 | 显示全部楼层
本帖最后由 liuguangxi 于 2024-10-8 12:23 编辑


2441697316 发表于 2024-10-8 10:59
乘法也是按无符号数规则算的,比如这里


应该写成:


mult_byte3 <= byte3_a_sgn * byte3_b_sgn;


信号一旦使用[:]截取就变成unsigned类型了。

前面加法运算代码同理。
 楼主| 发表于 2024-10-9 09:52:19 | 显示全部楼层


用signed系统函数行不行
mult_byte3[15:0] <= $signed(byte3_a_sgn[7:0]) * $signed(byte3_b_sgn[7:0]) ;


发表于 2024-10-9 13:21:26 | 显示全部楼层


2441697316 发表于 2024-10-9 09:52
用signed系统函数行不行
mult_byte3[15:0]


这样写也行,只是更罗嗦
 楼主| 发表于 2024-10-9 13:36:46 | 显示全部楼层


liuguangxi 发表于 2024-10-9 13:21
这样写也行,只是更罗嗦


了解了,受益匪浅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-15 06:44 , Processed in 0.023819 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表