verilog Signed与赋值形式
`timescale 1ns/1ps module test; reg signed[3:0] uu; reg signed[3:0] dd; reg [2:0] extract; reg [4:0] sum; initial begin uu=-7; dd=3; extract=uu[2:0] sum=uu+dd; #10 uu=7; dd=-3; extract=uu[2:0] sum=uu+dd; #10 uu=-7; dd=-3; extract=uu[2:0] sum=uu+dd; end endmodule
如上述代码,当声明的reg sign通过整数形式赋值,实际得到的是所看到的值的补码形式,如uu=-7,则uu的实际存储值为4‘b1001,即-7在4bit下的补码,即有符号数4’b1111的补码4‘b1001,然后使用补码进行运算。
`timescale 1ns/1ps module test; reg signed[3:0] uu; reg signed[3:0] dd; reg [2:0] extract; reg [4:0] sum; initial begin uu=4'b1111; dd=4'b0011; extract=uu[2:0] sum=uu+dd; #10 uu=4'b0111; dd=4'b1011; extract=uu[2:0] sum=uu+dd; #10 uu=4'b1111; dd=4'b1011; extract=uu[2:0] sum=uu+dd; end endmodule
当reg signed通过上述方式进行赋值时,则默认直接使用编程用户已经进行了原码到补码的转换,此时所写即所存,仍然为补码的形式保存和进行后续计算,这一点区别于使用整数型的值进行赋值。