目录
用于计算单符号位定点小数乘法 x × y x×y x×y ,常用于CPU作乘法运算,伪代码如下:
function mult_signed_fix(x,y);
bit [n+1:0] x_ext; //扩位x,双符号位
bit [n:0] y_ext; //扩位y
bit [n+1:0] x_ext_inv; //-扩位x,双符号位
bit [2*n+3:0] pp; //部分积
//------------------------------------------------------------------------------------------
// step 1. 将x和y扩位为 整数位宽和小数位宽一致,记扩位后 x[n+1:n]为双符号位、x[n-1:m]为整数部分、x[m-1:0]为小数部分
//------------------------------------------------------------------------------------------
x_ext[n:0] = extract_bit(x,y); //扩位
x_ext[n+1] = x_ext[n]; //双符号位
y_ext[n:0] = extract_bit(x,y); //扩位
//------------------------------------------------------------------------------------------
// step 2. 计算 双符号位[-x_ext]_补
//------------------------------------------------------------------------------------------
x_ext_inv[n+1:0] = ~x_ext[n+1:0] + 'd1;
//------------------------------------------------------------------------------------------
// step 3. 初始化部分积
//------------------------------------------------------------------------------------------
pp = {(n+2){1'b0},y_ext,1'b0};
//------------------------------------------------------------------------------------------
// step 4. 迭代运算(n+1)次,前n次需要算术右移1位,第n+1次不用移位
//------------------------------------------------------------------------------------------
for i = 1:n+1 begin
if(pp[1:0] == 2'b01)
pp = pp + {x_ext,(n+2){1'b0}}; //部分积高(n+2)位加x_ext_comp
else if(pp[1:0] == 2'b10)
pp = pp + {x_ext_inv,(n+2){1'b0}};
if(i < n+1)
pp = arithmetic_shift_right(pp); //算术右移一位
end
//------------------------------------------------------------------------------------------
// step 5. 整理结果,部分积去掉低2位为最终积。最终积为双符号位,低2*m位为小数部分
//------------------------------------------------------------------------------------------
return pp[2*n+3-1:2*(m-1)+3].pp[2*(m-1)+2:2]; //取单符号位形式
endfunction
例如计算1.5 = 3’b01.1与-2.25 = 5’b101.11步骤如下:
Step 1. 扩位,得到x_ext = 6'b0001.10;y_ext = 5'b101.11;
。得到n = 4;m=2
Step 2. 计算补码,有x_ext_inv = 6'b1110.10;
Step 3. 初始化部分积,有pp = {6'b0,6'b101110};
Step 4. 迭代运算5次。
第1次算得pp = {6'b111101,6'b010111};
第2次算得pp = {6'b111110,6'b101011};
第3次算得pp = {6'b111111,6'b010101};
第4次算得pp = {6'b000010,6'b101010};
第5次算得pp = {6'111100,6'b101010};
Step 5. 整理结果,得到单符号最终积为9'b11100.1010
,即-3.375