Verilog 计算错误 8 位 1 的补码减法器
Verilog Calculation Error 8-bit 1's Complement Subtractor
我正在编写一个 8 位 1 的补码减法器,它不使用像 + 或 - 这样的字级运算符。
我相信它正在工作(在其他值上手动测试它),但作业的最后一部分是让测试平台迭代所有可能的值并将它们加在一起(256*256 或 65,536 个可能的值) (不是所有数字累加起来产生一个非常大的数字,而是 0+1、0+2、... 1+1、1+2 等)并用我的其他模块检查计算值并打印数字正确匹配减法器的值的数量和不正确的值的数量。
我写了下面的代码,没有编译错误,但是还是没有显示正确或错误的计算次数。它为我这边的每个数字显示一个 x。
module refonesub (
output [7:0] subtractionresult ,
output carryoverflow ,
input [7:0] A ,
input [7:0] B ,
input mode
);
wire B0;
wire B1;
wire B2;
wire B3;
wire B4;
wire B5;
wire B6;
wire B7;
wire C0;
wire C1;
wire C2;
wire C3;
wire C4;
wire C5;
wire C6;
wire C7;
xor(B0, B[0], mode);
xor(B1, B[1], mode);
xor(B2, B[2], mode);
xor(B3, B[3], mode);
xor(B4, B[4], mode);
xor(B5, B[5], mode);
xor(B6, B[6], mode);
xor(B7, B[7], mode);
onesub U0(A[0],B0,mode,C0,subtractionresult[0]);
onesub U1(A[1],B1,C0,C1,subtractionresult[1]);
onesub U2(A[2],B2,C1,C2,subtractionresult[2]);
onesub U3(A[3],B3,C2,C3,subtractionresult[3]);
onesub U4(A[4],B4,C3,C4,subtractionresult[4]);
onesub U5(A[5],B5,C4,C5,subtractionresult[5]);
onesub U6(A[6],B6,C5,C6,subtractionresult[6]);
onesub U7(A[7],B7,C6,C7,subtractionresult[7]);
xor (carryoverflow,C6,C7);
endmodule
module onesub ( A ,B ,Cin ,Cout ,S );
output Cout ;
output S ;
input A ;
wire A ;
input B ;
wire B ;
input Cin ;
wire Cin ;
reg Cout;
reg S;
always @(A or B or Cin) begin
case ({A,B,Cin})
0: begin Cout=0; S=0; end
1: begin Cout=0; S=1; end
2: begin Cout=0; S=1; end
3: begin Cout=1; S=0; end
4: begin Cout=0; S=1; end
5: begin Cout=1; S=0; end
6: begin Cout=1; S=0; end
7: begin Cout=1; S=1; end
endcase
end
endmodule
module testbench;
reg [7:0] A;
reg [7:0] B;
reg mode;
wire [7:0] subtractionresult;
reg [7:0] subtractionresult_expect;
wire carryoverflow;
refonesub sub(
.A(A),
.B(B),
.mode(mode),
.subtractionresult(subtractionresult),
.carryoverflow(carryoverflow) );
integer i, j;
initial begin
for (A = 0; i < 256; A = A + 1) begin
for (B = 0; B < 256; B = B + 1) begin
subtractionresult_expect = A+B;
if (subtractionresult == subtractionresult_expect) begin
i = i + 1;
end else begin
j = j + 1;
end
end
end
$display("All cases tested; %d correct, %d failed", i, j);
end
endmodule
它打印:
All cases tested; x correct, x failed
您的测试平台中存在多个错误。
您需要初始化 i 和 j(它们默认为 x)。
您可能想要 A < 255
,而不是 i < 256
。
您需要检查 255,而不是 256。
我在显示之前添加了 #1
以确保打印了一些内容
initial begin
i = 0;
j = 0;
for (A = 0; A < 255; A = A + 1) begin
for (B = 0; B < 255; B = B + 1) begin
subtractionresult_expect = A+B;
if (subtractionresult == subtractionresult_expect) begin
i = i + 1;
end else begin
j = j + 1;
end
end
end
#1 $display("All cases tested; %d correct, %d failed", i, j);
end
我得到了不同的显示,但这可能不是你想要的:
All cases tested; 0 correct, 65025 failed
我正在编写一个 8 位 1 的补码减法器,它不使用像 + 或 - 这样的字级运算符。
我相信它正在工作(在其他值上手动测试它),但作业的最后一部分是让测试平台迭代所有可能的值并将它们加在一起(256*256 或 65,536 个可能的值) (不是所有数字累加起来产生一个非常大的数字,而是 0+1、0+2、... 1+1、1+2 等)并用我的其他模块检查计算值并打印数字正确匹配减法器的值的数量和不正确的值的数量。
我写了下面的代码,没有编译错误,但是还是没有显示正确或错误的计算次数。它为我这边的每个数字显示一个 x。
module refonesub (
output [7:0] subtractionresult ,
output carryoverflow ,
input [7:0] A ,
input [7:0] B ,
input mode
);
wire B0;
wire B1;
wire B2;
wire B3;
wire B4;
wire B5;
wire B6;
wire B7;
wire C0;
wire C1;
wire C2;
wire C3;
wire C4;
wire C5;
wire C6;
wire C7;
xor(B0, B[0], mode);
xor(B1, B[1], mode);
xor(B2, B[2], mode);
xor(B3, B[3], mode);
xor(B4, B[4], mode);
xor(B5, B[5], mode);
xor(B6, B[6], mode);
xor(B7, B[7], mode);
onesub U0(A[0],B0,mode,C0,subtractionresult[0]);
onesub U1(A[1],B1,C0,C1,subtractionresult[1]);
onesub U2(A[2],B2,C1,C2,subtractionresult[2]);
onesub U3(A[3],B3,C2,C3,subtractionresult[3]);
onesub U4(A[4],B4,C3,C4,subtractionresult[4]);
onesub U5(A[5],B5,C4,C5,subtractionresult[5]);
onesub U6(A[6],B6,C5,C6,subtractionresult[6]);
onesub U7(A[7],B7,C6,C7,subtractionresult[7]);
xor (carryoverflow,C6,C7);
endmodule
module onesub ( A ,B ,Cin ,Cout ,S );
output Cout ;
output S ;
input A ;
wire A ;
input B ;
wire B ;
input Cin ;
wire Cin ;
reg Cout;
reg S;
always @(A or B or Cin) begin
case ({A,B,Cin})
0: begin Cout=0; S=0; end
1: begin Cout=0; S=1; end
2: begin Cout=0; S=1; end
3: begin Cout=1; S=0; end
4: begin Cout=0; S=1; end
5: begin Cout=1; S=0; end
6: begin Cout=1; S=0; end
7: begin Cout=1; S=1; end
endcase
end
endmodule
module testbench;
reg [7:0] A;
reg [7:0] B;
reg mode;
wire [7:0] subtractionresult;
reg [7:0] subtractionresult_expect;
wire carryoverflow;
refonesub sub(
.A(A),
.B(B),
.mode(mode),
.subtractionresult(subtractionresult),
.carryoverflow(carryoverflow) );
integer i, j;
initial begin
for (A = 0; i < 256; A = A + 1) begin
for (B = 0; B < 256; B = B + 1) begin
subtractionresult_expect = A+B;
if (subtractionresult == subtractionresult_expect) begin
i = i + 1;
end else begin
j = j + 1;
end
end
end
$display("All cases tested; %d correct, %d failed", i, j);
end
endmodule
它打印:
All cases tested; x correct, x failed
您的测试平台中存在多个错误。
您需要初始化 i 和 j(它们默认为 x)。
您可能想要 A < 255
,而不是 i < 256
。
您需要检查 255,而不是 256。
我在显示之前添加了 #1
以确保打印了一些内容
initial begin
i = 0;
j = 0;
for (A = 0; A < 255; A = A + 1) begin
for (B = 0; B < 255; B = B + 1) begin
subtractionresult_expect = A+B;
if (subtractionresult == subtractionresult_expect) begin
i = i + 1;
end else begin
j = j + 1;
end
end
end
#1 $display("All cases tested; %d correct, %d failed", i, j);
end
我得到了不同的显示,但这可能不是你想要的:
All cases tested; 0 correct, 65025 failed