在verilog中使用仿真软件modesim,可以实现定点小数的十进制显示。
但是,有符号定点小数的计算结果表示却要和语法配合好
例如
reg signed filter_in=13‘b0100001010110;
parameter signed [24:0] x1_step1_xoffset1 = 25'h10a4000; //sfix25_en24
// 内部信号声明
reg signed [25:0] filter_in1; //sfix26_en24
filter_in1 <= {filter_in,{12{1'b0}}}- x1_step1_xoffset1;
用modesim表示小数的时候记得选取有符号24位小数位,如图
本来计算出来是0.520996093750000-(-0.9599609375)=1.480957031250000
但是,由于最后我在加位宽后,没有加$signed,导致modesim识别不出来符号位,所以看上去二进制是正确的,但是定点表示的小数却是错误的
修改后的代码
reg signed filter_in=13‘b0100001010110;
parameter signed [24:0] x1_step1_xoffset1 = 25'h10a4000; //sfix25_en24
// 内部信号声明
reg signed [25:0] filter_in1; //sfix26_en24
filter_in1 <= $signed({filter_in,{12{1'b0}}}) - x1_step1_xoffset1; //没有加$signed不能识别出来是否有符号位
正确结果如图
总结:切记,加大位宽后,一定要再次声明是有符号数
还有一点就是modesim用十进制表示定点小数,好像在小数位位宽为30bit之后就表示出来不正确了,不知道为什么。。。。。。