251 lines
5.5 KiB
Systemverilog
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
|