mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-12-25 15:30:03 +00:00
212 lines
4.5 KiB
Verilog
212 lines
4.5 KiB
Verilog
// This file ONLY is placed into the Public Domain, for any use,
|
|
// without warranty, 2008 by Lane Brooks
|
|
|
|
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);
|
|
pullup(Z2);
|
|
pullup(Z3);
|
|
pullup(Z4);
|
|
pullup(Z5);
|
|
pullup(Z6);
|
|
pulldown(Z7);
|
|
pullup(Z8);
|
|
pulldown(Z9);
|
|
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
|
|
|