151 lines
4.4 KiB
Coq
151 lines
4.4 KiB
Coq
|
|
`begin_keywords "1364-2005"
|
||
|
|
// -- test force/release of:
|
||
|
|
// a wire assigned to a reg
|
||
|
|
// a wire with no assignment
|
||
|
|
// a whole bus (assigned to a reg),
|
||
|
|
// a single bit of a bus (assigned to a reg)
|
||
|
|
// -- make sure the force/release is passed into the hierarchy
|
||
|
|
//
|
||
|
|
// -- run with
|
||
|
|
// iverilog -Wall tt.v
|
||
|
|
// vvp a.out
|
||
|
|
// -- to see debug display statements, use
|
||
|
|
// iverilog -Wall -DDISPLAY tt.v
|
||
|
|
//
|
||
|
|
module top ();
|
||
|
|
|
||
|
|
reg [31:0] ii;
|
||
|
|
reg bitfail, bitnafail, busfail, busbitfail;
|
||
|
|
reg a;
|
||
|
|
reg [1:0] b;
|
||
|
|
wire bit = a;
|
||
|
|
wire bitna;
|
||
|
|
wire [1:0] bus = b;
|
||
|
|
wire [1:0] ibus = b;
|
||
|
|
wire subfail, subfailna;
|
||
|
|
|
||
|
|
// call in a lower level module
|
||
|
|
subtop U1 (
|
||
|
|
.subbit(bit),
|
||
|
|
.subbus(bus),
|
||
|
|
.subfail(subfail)
|
||
|
|
);
|
||
|
|
subtop U2 (
|
||
|
|
.subbit(bitna),
|
||
|
|
.subbus(bus),
|
||
|
|
.subfail(subfailna)
|
||
|
|
);
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
a = 1'b1;
|
||
|
|
b = 2'b01;
|
||
|
|
#5; b = 2'b10;
|
||
|
|
#10; b = 2'b11;
|
||
|
|
end
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
#2;
|
||
|
|
force bit = 0;
|
||
|
|
force bitna = 0;
|
||
|
|
force bus = 0;
|
||
|
|
//$display("\n ****** force/release to ibus[0] commented; expect bit[0] failure ******* ");
|
||
|
|
force ibus[0] = 0;
|
||
|
|
#10;
|
||
|
|
release bit;
|
||
|
|
force bitna = 1;
|
||
|
|
release bus;
|
||
|
|
#5;
|
||
|
|
release ibus[0];
|
||
|
|
end
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
bitfail = 0; bitnafail = 0; busfail = 0; busbitfail = 0;
|
||
|
|
`ifdef DISPLAY
|
||
|
|
$display("");
|
||
|
|
$display("expecting bit, bus,ibus to be 1 at T=1");
|
||
|
|
$display("then changing to 0 at T=2");
|
||
|
|
$display("then bit and bus are 0 from T=3 to T=11, while");
|
||
|
|
$display("ibus changes to 2 at T=5 and remains 2 through to T=16");
|
||
|
|
$display("bit changes to 1 at T=12 and remains 1 from then on.");
|
||
|
|
$display("bus changes to 2 at T=12");
|
||
|
|
$display("then 2 from T=13 to T=14");
|
||
|
|
$display("then changing to 3 at T=15");
|
||
|
|
$display("then 3 from T=16 on");
|
||
|
|
$display("ibus changes to 3 at T=17 and remains 3 from then on");
|
||
|
|
$display("");
|
||
|
|
`endif
|
||
|
|
for(ii = 0; ii < 20; ii = ii + 1) begin
|
||
|
|
// bit
|
||
|
|
if((ii == 1) && (bit !== 1)) bitfail = 1;
|
||
|
|
if((ii > 2) && (ii < 12) && (bit !== 0)) bitfail = 1;
|
||
|
|
if((ii > 12) && (bit !== 1)) bitfail = 1;
|
||
|
|
// bitna
|
||
|
|
if((ii == 1) && (bitna !== 1'bz)) bitnafail = 1;
|
||
|
|
if((ii > 2) && (ii < 12) && (bitna !== 0)) bitnafail = 1;
|
||
|
|
if((ii > 12) && (bitna !== 1)) bitnafail = 1;
|
||
|
|
// bus
|
||
|
|
if((ii == 1) && (bus !== 1)) busfail = 1;
|
||
|
|
if((ii > 2) && (ii < 12) && (bus !== 0)) busfail = 1;
|
||
|
|
if((ii > 12) && (ii < 14) && (bus !== 2'b10)) busfail = 1;
|
||
|
|
if((ii > 15) && (bus !== 2'b11)) busfail = 1;
|
||
|
|
// ibus
|
||
|
|
if((ii == 1) && (ibus !== 2'b01)) busbitfail = 1;
|
||
|
|
if((ii > 2) && (ii < 4) && (ibus !== 2'b00)) busbitfail = 1;
|
||
|
|
if((ii > 5) && (ii < 17) && (ibus !== 2'b10)) busbitfail = 1;
|
||
|
|
if((ii > 17) && (ibus !== 2'b11)) busbitfail = 1;
|
||
|
|
`ifdef DISPLAY
|
||
|
|
$display("time: %0t, a: %b, bit: %b, bitna %b, b: %b, bus: %b, ibus: %b",$time,a,bit,bitna,b,bus,ibus);
|
||
|
|
`endif
|
||
|
|
#1;
|
||
|
|
end
|
||
|
|
if(bitfail || bitnafail || busfail || busbitfail || subfail || subfailna) begin
|
||
|
|
$display("\n\t--------- force test failed ---------");
|
||
|
|
if(bitfail) $display("force to single wire assigned to a reg failed");
|
||
|
|
if(bitnafail) $display("force to single unassigned wire failed");
|
||
|
|
if(busfail) $display("force to whole of 2-bit bus failed");
|
||
|
|
if(busbitfail) $display("force to bit[0] of 2-bit bus failed");
|
||
|
|
if(!bitfail && !bitnafail && !busfail && !busbitfail) begin
|
||
|
|
if(subfail) $display("force did not affect U1 hierarchy");
|
||
|
|
if(subfailna) $display("force did not affect U2 hierarchy");
|
||
|
|
end
|
||
|
|
$display("\n");
|
||
|
|
|
||
|
|
end else $display("PASSED");
|
||
|
|
end
|
||
|
|
|
||
|
|
endmodule
|
||
|
|
|
||
|
|
module subtop(
|
||
|
|
subbit,
|
||
|
|
subbus,
|
||
|
|
subfail
|
||
|
|
);
|
||
|
|
|
||
|
|
input subbit;
|
||
|
|
input [1:0] subbus;
|
||
|
|
output subfail;
|
||
|
|
|
||
|
|
reg subfail;
|
||
|
|
reg [31:0] ii;
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
subfail = 0;
|
||
|
|
for(ii = 0; ii < 20; ii = ii + 1) begin
|
||
|
|
// subbit
|
||
|
|
if((ii == 1) && (subbit !== 1) && (subbit !== 1'bz)) subfail = 1;
|
||
|
|
if((ii > 2) && (ii < 12) && (subbit !== 0)) subfail = 1;
|
||
|
|
if((ii > 12) && (subbit !== 1)) subfail = 1;
|
||
|
|
// subbus
|
||
|
|
if((ii == 1) && (subbus !== 1)) subfail = 1;
|
||
|
|
if((ii > 2) && (ii < 12) && (subbus !== 0)) subfail = 1;
|
||
|
|
if((ii > 12) && (ii < 14) && (subbus !== 2'b10)) subfail = 1;
|
||
|
|
if((ii > 15) && (subbus !== 2'b11)) subfail = 1;
|
||
|
|
`ifdef DISPLAY
|
||
|
|
$display("\t\t\t\t\ttime: %0t, subbit: %b, subbus: %b",$time,subbit,subbus);
|
||
|
|
`endif
|
||
|
|
#1;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
endmodule
|
||
|
|
`end_keywords
|