verilog中不同算术运算期间的位舍入?
Rounding of bits during different arithmetic operation in verilog?
我是 HDL 编码新手。
我对舍入有疑问,有不同类型的舍入可用,例如 Round half away from zero
、Round half to even
、Round half to odd
等(在 https://en.wikipedia.org/wiki/Rounding
中找到)。我在互联网的帮助下为我的乘法、加法等写了一个四舍五入的 verilog 代码,代码工作正常。但是,我想知道代码执行的是哪种类型的舍入。无论是 Round half to odd 还是 Round half to even 或其他。谁能告诉我代码执行的是什么类型的舍入?下面给出代码
`timescale 1ns / 1ps
module rounding();
parameter x = 16;
parameter y = 8;
reg [(x)-1:0] A=16'b0010011010110011;
reg [(x)-1:0] B;
initial begin
B = (A[y-1:0]) >= (1 << y-1) ? (A >>> y) + 1 : (A >>> y);
$display("%b", B);
end
endmodule
如果我输入A=16'b0010011010110011
;输出为 0000000000100111;
如果 A=16'b0000111100001111;
输出为 0000000000001111
您的代码将输入值 A
除以 256 并四舍五入到最接近的整数:
A=16'b0010011010110011 -> 9907 (dec) -> 9907/256 = 38.69 (round up) ~ 39 -> 0000000000100111
A=16'b0000111100001111 -> 3855 (dec) -> 3855/256 = 15.06 (round down) ~ 15 -> 0000000000001111
我是 HDL 编码新手。
我对舍入有疑问,有不同类型的舍入可用,例如 Round half away from zero
、Round half to even
、Round half to odd
等(在 https://en.wikipedia.org/wiki/Rounding
中找到)。我在互联网的帮助下为我的乘法、加法等写了一个四舍五入的 verilog 代码,代码工作正常。但是,我想知道代码执行的是哪种类型的舍入。无论是 Round half to odd 还是 Round half to even 或其他。谁能告诉我代码执行的是什么类型的舍入?下面给出代码
`timescale 1ns / 1ps
module rounding();
parameter x = 16;
parameter y = 8;
reg [(x)-1:0] A=16'b0010011010110011;
reg [(x)-1:0] B;
initial begin
B = (A[y-1:0]) >= (1 << y-1) ? (A >>> y) + 1 : (A >>> y);
$display("%b", B);
end
endmodule
如果我输入A=16'b0010011010110011
;输出为 0000000000100111;
如果 A=16'b0000111100001111;
输出为 0000000000001111
您的代码将输入值 A
除以 256 并四舍五入到最接近的整数:
A=16'b0010011010110011 -> 9907 (dec) -> 9907/256 = 38.69 (round up) ~ 39 -> 0000000000100111
A=16'b0000111100001111 -> 3855 (dec) -> 3855/256 = 15.06 (round down) ~ 15 -> 0000000000001111