verilog 中关于乘法结果的有无符号计算、比较的有无符号、数值的表示形式
1、示例代码:
(
input clk,
input rst_n,
output [7:0] out0,
output [7:0] out1,
output [7:0] out2
);
wire [3:0] a;
wire [3:0] b;
assign a = 4'b1001;
assign b = 4'b0001;
// 如果两个乘数有一个是无符号数,则结果为无符号数;
wire [7:0] out0;
assign out0 = a * b; // out0 = 'h09 = 'b0000_1001
wire[7:0] out1;
assign out1 = $signed(a) * b; //out1 = 'h09 = 'b0000_1001
// 若两者都为有符号数,则结果为有符号数
wire[7:0] out2;
assign out2 = $signed(a) * $signed(b); // out2 = 'hf9 = 'b1111_1001,有符号数和无符号乘法的区别在于【位扩展时补0还是补符号位】
// 波形窗口radix改为 signed decimal,可以看到结果为 -9
/*********** 直接比较会被当作无符号数来比较 *******************/
wire sign0;
assign sign0 = (out2>0)?1'b1:1'b0; // sign0 = 1
wire sign1;
assign sign1 = ($signed(out2)>0)?1'b1:1'b0; // 带上$signed()变有符号数的比较,sign1 = 0
/************************ verilog 中的数据是用补码来表示的 *********************************/
wire [3:0] c;
wire [3:0] d;
assign c = -4'd3; // c = 'hd = 4'b 1101 (-3的补码)
assign d = 4'd1;
wire [7:0] out00;
assign out00 = c * d; // out00 = 'h0d = 'b0000_1101
wire[7:0] out01;
assign out01 = $signed(c) * d; // out01 = 'h0d = 'b0000_1101
wire[7:0] out02;
assign out02 = $signed(c) * $signed(d); // out2 = 'hfd = 'b1111_1101,波形窗口radix改为 signed decimal,可以看到结果为 -3
wire sign00;
assign sign00= (out02>0)?1'b1:1'b0; // sign00 = 1,两个比较数当作无符号数处理
wire sign01;
assign sign01 = ($signed(out02)>0)?1'b1:1'b0; // sign01 = 0,有符号数的比较
endmodule
/************************ 结论 **********************************/
/*
Verilog乘法:
1、如果两个乘数有一个是无符号数,则结果为无符号数
2、若两者都为有符号数,则结果为有符号数。$signed(a)*signed(b)
3、有符号数和无符号乘法的区别在于【位扩展时补0还是补符号位】。波形窗口radix改为 signed decimal,可以看到对应的十进制结果
Verilog比较:
1、两个数直接比较会被当作无符号数来比较
2、带上$signed()变有符号数的比较。if($signed(a) > $signed(b))
Verilog 数制:
1、Verilog中间计算数据以补码形式存在,如 -4'd3 显示为 'hd = 4'b 1101 (-3的补码)
*/
/************************ End **********************************/
2、仿真结果
3、结论
3.1、Verilog乘法:
1、如果两个乘数有一个是无符号数,则结果为无符号数
2、若两者都为有符号数,则结果为有符号数。$signed(a)*signed(b)
3、有符号数和无符号乘法的区别在于【位扩展时补0还是补符号位】。波形窗口radix改为 signed decimal,可以看到对应的十进制结果
3.2、Verilog比较:
1、两个数直接比较会被当作无符号数来比较
2、带上$signed()变有符号数的比较。if($signed(a) > $signed(b))
3.3、Verilog 数制:
1、Verilog中间计算数据以补码形式存在,如 -4'd3 显示为 'hd = 4'b 1101 (-3的补码)