iverilog/ivtest/ivltests/br_gh315.v

105 lines
2.5 KiB
Verilog

`timescale 1ns/1ns
module hct74245(
input dir,
input nOE,
inout [7:0] A,
inout [7:0] B,
output [7:0] C // Added to demonstrate that a straight dependency timing works correctly
);
// HCT typical @ 5v according to https://assets.nexperia.com/documents/data-sheet/74HC_HCT245.pdf
specify
(A *> C) = 100; // This delay works OK
(A *> B) = 10; // The rest of these delays do not work
(B *> A) = 10; // not respected
(dir *> A) = 16;// not respected
(dir *> B) = 16;// not respected
(nOE *> A) = 16;// not respected
(nOE *> B) = 16;// not respected
endspecify
assign A=nOE? 8'bzzzzzzzz : dir?8'bzzzzzzzz:B;
assign B=nOE? 8'bzzzzzzzz : dir?A:8'bzzzzzzzz;
assign C=A; // THIS IS DELAYED BY 100
// HAVE TO USE THIS APPROACH TO MAKE TIMINGS WORK AT ALL
// assign #16 A=nOE? 8'bzzzzzzzz :dir?8'bzzzzzzzz:B;
// assign #16 B=nOE? 8'bzzzzzzzz :dir?A: 8'bzzzzzzzz;
endmodule
module tb();
tri [7:0]A;
tri [7:0]B;
tri [7:0]C; // 'C' IS NOT PART OF ORIGINAL DESIGN - HOWEVER THIS TIMING IS RESPECTED COS THERE ARE NO CONDITIONALS IN THE ASSIGNMENT
reg [7:0] Vb=8'b00000000;
reg [7:0] Va=8'b11111111;
reg dir;
reg nOE;
assign B=Vb;
assign A=Va;
hct74245 buf245(.A, .B, .dir, .nOE);
integer timer;
reg failed = 0;
initial begin
$display("disable output , set dir a->b");
dir <= 1; // A->B
nOE <= 1;
Va=8'b11111111;
Vb=8'bzzzzzzzz;
#50 // time to settle
// NOW throw outputs on and time how long it takes for expected output to appear.
// It should take 16 to propagate from nOE -> B but the change is instantaneous
$display("enable output - B will change immediately");
timer=$time;
nOE <= 0;
wait(B === 8'b11111111);
if ($time - timer < 16) begin
$display("%6d", $time, " ERROR TOO QUICK - EXPECTED nOE->B = 16ns - BUT TOOK %-d", ($time - timer));
failed = 1;
end
else
$display("%6d", $time, " OK - TOOK %-d", ($time - timer));
#50 // settle
// Change data in - This should take 10 to propagate A->B but is instantaneous
$display("change A - B will change immediately (but C is delayed as expected by 100)");
Va=8'b00000000;
timer=$time;
nOE <= 0;
wait(B === 8'b00000000);
if ($time - timer < 10) begin
$display("%6d", $time, " ERROR TOO QUICK - EXPECTED A->B = 10ns - BUT TOOK %-d", ($time - timer));
failed = 1;
end
else
$display("%6d", $time, " OK - TOOK %-d", ($time - timer));
if (failed)
$display("FAILED");
else
$display("PASSED");
end
endmodule