verilator/test_regress/t/t_tri_various.v

251 lines
5.5 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed into the Public Domain, for any use,
// without warranty, 2008 by Lane Brooks.
// SPDX-License-Identifier: CC0-1.0
module t (
clk
);
input clk;
reg [31:0] state;
initial state = 0;
wire A = state[0];
wire OE = state[1];
wire Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8, Z9;
wire [3:0] Z10;
wire Z11;
Test1 test1 ( /*AUTOINST*/
// Inouts
.Z1 (Z1),
// Inputs
.OE (OE),
.A (A));
Test2 test2 ( /*AUTOINST*/
// Inouts
.Z2 (Z2),
// Inputs
.OE (OE),
.A (A));
Test3 test3 ( /*AUTOINST*/
// Inouts
.Z3 (Z3),
// Inputs
.OE (OE),
.A (A));
Test4 test4 ( /*AUTOINST*/
// Outputs
.Z4 (Z4),
// Inouts
.Z5 (Z5));
Test5 test5 ( /*AUTOINST*/
// Inouts
.Z6 (Z6),
.Z7 (Z7),
.Z8 (Z8),
.Z9 (Z9),
// Inputs
.OE (OE));
Test6 test6 ( /*AUTOINST*/
// Inouts
.Z10 (Z10[3:0]),
// Inputs
.OE (OE));
Test7 test7 ( /*AUTOINST*/
// Outputs
.Z11 (Z11),
// Inputs
.state (state[2:0]));
always @(posedge clk) begin
state <= state + 1;
`ifdef TEST_VERBOSE
$write("[%0t] state=%d Z1=%b 2=%b 3=%b 4=%b 5=%b 6=%b 7=%b 8=%b 9=%b 10=%b 11=%b\n", $time,
state, Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8, Z9, Z10, Z11);
`endif
if (state == 0) begin
if (Z1 !== 1'b1) $stop; // tests pullups
if (Z2 !== 1'b1) $stop;
if (Z3 !== 1'b1) $stop;
`ifndef VERILATOR
if (Z4 !== 1'b1) $stop;
`endif
if (Z5 !== 1'b1) $stop;
if (Z6 !== 1'b1) $stop;
if (Z7 !== 1'b0) $stop;
if (Z8 !== 1'b0) $stop;
if (Z9 !== 1'b1) $stop;
if (Z10 !== 4'b0001) $stop;
if (Z11 !== 1'b0) $stop;
end
else if (state == 1) begin
if (Z1 !== 1'b1) $stop; // tests pullup
if (Z2 !== 1'b1) $stop;
if (Z3 !== 1'b1) $stop;
`ifndef VERILATOR
if (Z4 !== 1'b1) $stop;
`endif
if (Z5 !== 1'b1) $stop;
if (Z6 !== 1'b1) $stop;
if (Z7 !== 1'b0) $stop;
if (Z8 !== 1'b0) $stop;
if (Z9 !== 1'b1) $stop;
if (Z10 !== 4'b0001) $stop;
if (Z11 !== 1'b1) $stop;
end
else if (state == 2) begin
if (Z1 !== 1'b0) $stop; // tests output driver low
if (Z2 !== 1'b0) $stop;
if (Z3 !== 1'b1 && Z3 !== 1'bx) $stop; // Conflicts
`ifndef VERILATOR
if (Z4 !== 1'b1) $stop;
`endif
if (Z5 !== 1'b1) $stop;
if (Z6 !== 1'b0) $stop;
if (Z7 !== 1'b1) $stop;
if (Z8 !== 1'b1) $stop;
if (Z9 !== 1'b0) $stop;
if (Z10 !== 4'b0010) $stop;
//if(Z11 !== 1'bx) $stop; // Doesn't matter
end
else if (state == 3) begin
if (Z1 !== 1'b1) $stop; // tests output driver high
if (Z2 !== 1'b1) $stop;
if (Z3 !== 1'b1) $stop;
`ifndef VERILATOR
if (Z4 !== 1'b1) $stop;
`endif
if (Z5 !== 1'b1) $stop;
if (Z6 !== 1'b0) $stop;
if (Z7 !== 1'b1) $stop;
if (Z8 !== 1'b1) $stop;
if (Z9 !== 1'b0) $stop;
if (Z10 !== 4'b0010) $stop;
if (Z11 !== 1'b1) $stop;
end
else if (state == 4) begin
$write("*-* All Finished *-*\n");
$finish;
end
end
pullup (Z1), (Z2);
pullup (Z3);
pullup (Z4);
pullup (Z5);
pullup (Z6);
pulldown (Z7), (Z9);
pullup (Z8);
pulldown pd10[3:0] (Z10);
endmodule
module Test1 (
input OE,
input A,
inout Z1
);
assign Z1 = (OE) ? A : 1'bz;
endmodule
module Test2 (
input OE,
input A,
inout Z2
);
assign Z2 = (OE) ? A : 1'bz;
endmodule
// mixed low-Z and tristate
module Test3 (
input OE,
input A,
inout Z3
);
assign Z3 = (OE) ? A : 1'bz;
assign Z3 = 1'b1;
endmodule
// floating output and inout
`ifndef VERILATOR
// Note verilator doesn't know to make Z4 a tristate unless marked an inout
`endif
module Test4 (
output Z4,
inout Z5
);
endmodule
// AND gate tristates
module Test5 (
input OE,
inout Z6,
inout Z7,
inout Z8,
inout Z9
);
assign Z6 = (OE) ? 1'b0 : 1'bz;
assign Z7 = (OE) ? 1'b1 : 1'bz;
assign Z8 = (OE) ? 1'bz : 1'b0;
assign Z9 = (OE) ? 1'bz : 1'b1;
endmodule
// AND gate tristates
module Test6 (
input OE,
inout [3:0] Z10
);
wire [1:0] i;
Test6a a (
.OE(OE),
.Z({Z10[0], Z10[1]})
);
Test6a b (
.OE(~OE),
.Z({Z10[2], Z10[0]})
);
endmodule
module Test6a (
input OE,
inout [1:0] Z
);
assign Z = (OE) ? 2'b01 : 2'bzz;
endmodule
module Test7 (
input [2:0] state,
output reg Z11
);
always @(*) begin
casez (state)
3'b000: Z11 = 1'b0;
3'b0?1: Z11 = 1'b1;
default: Z11 = 1'bx;
endcase
end
endmodule
// This is not implemented yet
//module Test3(input OE, input A, inout Z3);
// always @(*) begin
// if(OE) begin
// Z3 = A;
// end else begin
// Z3 = 1'bz;
// end
// end
//endmodule