105 lines
2.5 KiB
Coq
105 lines
2.5 KiB
Coq
|
|
`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
|