我是Verilog / System Verilog的新手,我想实现平方和立方小数。考虑以下示例
module test(
input wire [31:0] input,
output reg [63:0] output
);
reg [63:0] temp;
always @ (*) begin
temp = input*input;
output <= temp*input;
end
endmodule
因此,当我的input
是 32'h0_C7AE147 时(在hexadecimal
数字系统中,使用32位表示并假设_
等于.
(在Verilog中),我期望output
为 32'h0_797C3D6 (在decimal
编号系统中为0.4745)
但是我得到{strong> 64'hD546_4A9C_ED94_2917
的output
此外,如何处理乘法中增加的位大小?
当我们将两个 N 位宽的操作数相乘时,将得到宽度为 2N 位的输出。当我们将这个 2N 位宽的数字与一个 k 位宽的数字相乘时,我们得到了多个宽度 2N + k 位宽的数字,这个过程还在继续。
答案 0 :(得分:2)
您的意思是要用32位定点表示法用4位整数部分+ 28位小数部分表示小数吗?为什么需要64位的输出?
无论如何,我认为您需要为每个乘法将乘积右移28位。
尝试:
temp = input * input >> 28;
output <= temp * input >> 28;
如果需要适当的舍入,请在每次移位之前进行。