目录
sign( )使用
如果想把a、b作为有符号数来运算,那么就得在a、b数据定义的时候用signed修改,或者在计算的时候用$signed()来修饰
在有符号数运算的时候常常需要扩位,比如verilog中的加法和乘法操作前,会先对操作数据扩位成结果相同的位宽,然后进行加法或者乘法处理。假如a和b都为4位数据,c为5位数据,c = a + b,这个运算的时候会先把a和b扩位成5位,然后按照无符号加法进行相加。
有符号位的二进制表示
用-2来举例:
首先求2的补码(计算2二进制的反码后+1)
10(原码)→01(反码)→10(补码)
然后一般我们再在最高位赋1 (代表负数)最后结果就是110
有符号数扩位方法
这里需要特别注意,扩位的时候,把扩充的位数全部当做符号位
如果需要扩位到16bit,需要把前面所有位都作为符号位,全赋1,最后结果是
1111_1111_1111_1110
代码验证
reg signed [15:0] a;
wire signed [15:0] b;
initial begin
a = -2;
$display("a = %b", a);
a = 3;
$display("a = %b", a);
end
$signed( )和$unsigned( ) 函数
在进行有符号数运算的代码设计时,往往需要用到2个系统函数$signed()和$unsigned()。$signed()是把无符号数当做有符号数运算
$unsigned()是把有符号数当做无符号数运算
还是用-2举例,输入无符号位的16'b1111_1111_1111_1110
无符号位 结果是65534,有符号位结果-2
reg [15:0] data0;
initial begin
data0 = 16'b1111_1111_1111_1110;
$display("data0 = %0d", data0);
$display("data0 = %0d", $signed(data0));
end
还是用-2举例,输入有符号位的16'b1111_1111_1111_1110
无符号位 结果是65534,有符号位结果-2
reg signed [15:0] data0;
initial begin
data0 = 16'b1111_1111_1111_1110;
$display("data0 = %0d", data0);
$display("data0 = %0d", $unsigned(data0));
end