22 May 12:32
gggg
module mytestbenchmodule();
reg CLK;
initial CLK = 0;
always #5 CLK = ~CLK; // szybszy zegar dla testów
reg RST;
initial begin
RST = 1;
#20 RST = 0;
end
integer fi, fo;
integer count;
reg error;
integer f1, f2, f3, f4;
reg [31:0] vec_Are, vec_Aim, vec_Bre, vec_Bim, vec_Cre, vec_Cim;
// sygnały handshake
reg I_STB;
wire I_ACK;
wire O_STB;
reg O_ACK;
wire [31:0] Cre, Cim;
initial begin
fi = $fopen("input.txt", "r");
fo = $fopen("output.txt", "r");
I_STB = 0;
O_ACK = 0;
error = 0;
@(negedge RST); // czekaj aż reset się skończy
forever begin
// czytaj dane wejściowe
count = $fscanf(fi, "%d %d %d %d\n", f1, f2, f3, f4);
if (count != 4) begin
$display("Koniec danych wejściowych.");
$finish;
end
vec_Are = f1;
vec_Aim = f2;
vec_Bre = f3;
vec_Bim = f4;
// podaj dane do modułu
I_STB = 1;
wait (I_ACK == 1);
I_STB = 0;
// czekaj na dane wyjściowe
wait (O_STB == 1);
O_ACK = 1; // sygnał odbioru
#10 O_ACK = 0;
// czytaj oczekiwany wynik
count = $fscanf(fo, "%d %d\n", vec_Cre, vec_Cim);
if (count != 2) begin
$display("Koniec danych wyjściowych.");
$finish;
end
// porównaj wynik
if ((vec_Cre !== Cre) || (vec_Cim !== Cim)) begin
$display("❌ Błąd: %d != %d lub %d != %d", vec_Cre, Cre, vec_Cim, Cim);
error = error + 1;
end else begin
$display("✅ OK: %d == %d, %d == %d", vec_Cre, Cre, vec_Cim, Cim);
end
#20; // czekaj chwilę między testami
end
end
// instancja modułu
complex_mul cmul (
.CLK(CLK),
.RST(RST),
.I_STB(I_STB),
.I_ACK(I_ACK),
.I_ARE(vec_Are),
.I_AIM(vec_Aim),
.I_BRE(vec_Bre),
.I_BIM(vec_Bim),
.O_STB(O_STB),
.O_ACK(O_ACK),
.O_CRE(Cre),
.O_CIM(Cim)
);
endmodule