module test (
input signed [7:0] A0,
input signed [7:0] A1,
input signed [15:0] A2,
input [7:0] B0,
input [7:0] B1
);
wire [8:0] C0,C1,C2,C3;
wire signed [8:0] D0,D1,D2,D3;
wire [15:0] E0,E1,E2,E3;
wire signed [15:0] F0,F1,F2,F3;
wire signed [15:0] G0,G1,G4,G5;
wire signed [16:0] G2,G3;
assign C0 = B0 + B1;
assign C1 = B0 + A0;
assign C2 = B1 + A1;
assign C3 = A0 + A1;
assign D0 = B0 + B1;
assign D1 = B0 + A0;
assign D2 = B1 + A1;
assign D3 = A0 + A1;
assign E0 = B0 * B1;
assign E1 = B0 * A0;
assign E2 = B1 * A1;
assign E3 = A0 * A1;
assign F0 = B0 * B1;
assign F1 = B0 * A0;
assign F2 = B1 * A1;
assign F3 = A0 * A1;
assign G0 = {A0,A1}>>>2;
assign G1 = {A0,B0}>>>2;
assign G2 = {A0,A1} + A2;
assign G3 = {A0,B0} + A2;
assign G4 = {A0,A1};
assign G5 = {A0,B0};
endmodule
module test_tb(
);
reg signed [15:0] A2;
reg signed [7:0] A0,A1;
reg [7:0] B0,B1;
test test1(
.A0(A0),
.A1(A1),
.A2(A2),
.B0(B0),
.B1(B1)
);
initial begin
A0 = -100;
B0 = 80;
A1 = -20;
B1 = 120;
A2 = -12000;
#2
$stop;
end
endmodule
设计代码和仿真代码如上。
内容一:
A0为-100,若视作无符号数为156。A1为-20,若视作无符号数为236。
查看C系列结果,C系列显示设置为无符号数
查看D系列结果,D系列显示设置为有符号数
观察C,D系列在十六进制显示下的值,发现是相同的。
观察D系列和F系列验证,两系列均设置显示为无符号数
结论:无符号数和无符号数,无符号数和有符号数运算时,均将两者视作无符号数进行运算。有符号和有符号数运算时,才按照有符号数的规则进行运算。同样,运算操作位于赋值操作中时,被赋值变量的类型不影响运算结果。
实验二:
观察系列G的结果,可以发现拼接两个变量后,无论是两个有符号数还是一个有符号数和无符号数,得到结果均不发生算术右移,而是逻辑右移。
A2为-12000,对应无符号数为51536。以下均设置为无符号数显示。