assign {Cout,S}=A+B+Cin;
reg [7:0]S;
reg Cout;
integer i;
always @(*) begin
S=0;
{Cout,S[0]}=A[0]+B[0]+Cin;
for(i=1;i<=7;i=i+1)
begin
{Cout,S[i]}=A[i]+B[i]+Cout;
end
end
reg [7:0]alu_res;
reg OF;
reg ZF;
reg SF;
reg CF;
integer i;
//减法器相关定义
reg [7:0]C;
always @(*) begin
case(aluop)
4'b0000:
begin
ZF=0;
OF=0;
SF=0;
CF=0;
/*运算部分*/
for(i=0;i<=7;i=i+1)
{CF,alu_res[i]}=A[i]+B[i]+CF;
/*检验是否溢出*/
if(CF^((A[7]+B[7])!=alu_res[7]))
OF=1;
/*ZF*/
if(alu_res==0)
ZF=1;
/*SF*/
SF=alu_res[7];
end
4'b0001:
begin
ZF=0;
OF=0;
SF=0;
CF=0;
if(B[7]==1) begin
{C[7],C[6:0]}=~{B[7],B[6:0]}+8'b00000001;
end
if(B[7]==0)
C=~{B[7],B[6:0]}+8'b00000001;
/*运算部分*/
for(i=0;i<=7;i=i+1)
{CF,alu_res[i]}=A[i]+C[i]+CF;
/*检验是否溢出*/
if(CF^((A[7]+C[7])!=alu_res[7]))
OF=1;
/*ZF*/
if(alu_res==0)
ZF=1;
/*SF*/
SF=alu_res[7];
CF=~CF;
end
4'b0010:begin
ZF=0;
OF=0;
SF=0;
CF=0;
alu_res=A&B;
if(alu_res==0)
ZF=1;
end
4'b0011:begin
ZF=0;
OF=0;
SF=0;
CF=0;
alu_res=A|B;
if(alu_res==0)
ZF=1;
end
4'b0100:begin
ZF=0;
OF=0;
SF=0;
CF=0;
alu_res=~A;
if(alu_res==0)
ZF=1;
end
4'b0101:begin
ZF=0;
OF=0;
SF=0;
CF=0;
alu_res=A^B;
if(alu_res==0)
ZF=1;
end
4'b0110:begin
ZF=0;
OF=0;
SF=0;
CF=0;
alu_res=A<<B[2:0];
if(alu_res==0)
ZF=1;
end
4'b0111:begin
ZF=0;
OF=0;
SF=0;
CF=0;
alu_res=A>>B[2:0];
if(alu_res==0)
ZF=1;
end
4'b1000:begin
ZF=0;
OF=0;
SF=0;
CF=0;
alu_res=A>>B[2:0];
alu_res[7:5]={3{A[7]}};
if(alu_res==0)
ZF=1;
end
4'b1001:begin
ZF=0;
OF=0;
SF=0;
CF=0;
alu_res=($signed(A)<$signed(B))?1:0;
if(alu_res==0)
ZF=1;
end
4'b1010:begin
ZF=0;
OF=0;
SF=0;
CF=0;
alu_res=(A<B)?1:0;
if(alu_res==0)
ZF=1;
end
endcase
end
reg [15:0] Prod;
always @(*) begin
if(Signed)
Prod=$signed(A)*$signed(B);
else
Prod=A*B;
end
reg [7:0] out; // 相当于SystemVerilog中“logic [7:0] out;”
reg result_is_zero; // 相当于SystemVerilog中“logic result_is_zero;”
always @(*) begin
case (do_sub)
0: out = a+b;
1: out = a-b;
endcase
if (out)
result_is_zero = 0;
else
result_is_zero=1;
end