Округление битов при различных арифметических c операциях в Verilog? - PullRequest
0 голосов
/ 27 мая 2020

Я новичок в кодировании HDL.

У меня проблема с округлением, и доступны различные типы округления, например Round half away from zero, Round half to even, Round half to odd и c. (находится в https://en.wikipedia.org/wiki/Rounding). Я написал код округления Verilog для моего умножения, сложения и т. Д. c. с помощью inte rnet и код работает нормально. Но я хочу знать, какой тип округления выполняет код. Будь то половина раунда до нечетной или половина раунда до четной или что-то еще. Может ли кто-нибудь сказать мне, какой тип округления выполняет код? Код приведен ниже

`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

1 Ответ

0 голосов
/ 27 мая 2020

Ваш код делит входное значение 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
...