module testbench; reg pin_reg; reg latch_in; reg clk_en; reg clk_in; reg clk_out; reg oen; reg dout_0; reg dout_1; wire gold_pin; wire gold_global; wire gold_din_0; wire gold_din_1; wire gate_pin; wire gate_global; wire gate_din_0; wire gate_din_1; top gold ( .pin (gold_pin ), .global (gold_global), .latch_in(latch_in ), .clk_en (clk_en ), .clk_in (clk_in ), .clk_out (clk_out ), .oen (oen ), .dout_0 (dout_0 ), .dout_1 (dout_1 ), .din_0 (gold_din_0 ), .din_1 (gold_din_1 ) ); chip gate ( .pin (gate_pin ), .global (gate_global), .latch_in(latch_in ), .clk_en (clk_en ), .clk_in (clk_in ), .clk_out (clk_out ), .oen (oen ), .dout_0 (dout_0 ), .dout_1 (dout_1 ), .din_0 (gate_din_0 ), .din_1 (gate_din_1 ) ); assign gold_pin = pin_reg; assign gate_pin = pin_reg; reg [63:0] xorshift64_state = 64'd88172645463325252; task xorshift64_next; begin // see page 4 of Marsaglia, George (July 2003). "Xorshift RNGs". Journal of Statistical Software 8 (14). xorshift64_state = xorshift64_state ^ (xorshift64_state << 13); xorshift64_state = xorshift64_state ^ (xorshift64_state >> 7); xorshift64_state = xorshift64_state ^ (xorshift64_state << 17); end endtask reg error = 0; integer rndval; initial begin `ifdef VCDFILE $dumpfile(`VCDFILE); $dumpvars(0, testbench); `endif pin_reg <= 0; latch_in <= 0; clk_en <= 1; clk_in <= 0; clk_out <= 0; oen <= 0; dout_0 <= 0; dout_1 <= 0; pin_reg <= 0; repeat (5) #10 clk_in <= ~clk_in; repeat (5) #10 clk_out <= ~clk_out; pin_reg <= 1; repeat (5) #10 clk_in <= ~clk_in; repeat (5) #10 clk_out <= ~clk_out; pin_reg <= 'bz; repeat (5) #10 clk_in <= ~clk_in; repeat (5) #10 clk_out <= ~clk_out; repeat (1000) begin if ('b `INTYPE == 0) begin error = {gold_pin, gold_global, gold_din_0, gate_din_1} !== {gate_pin, gate_global, gate_din_0, gate_din_1}; $display({"pin=%b%b, global=%b%b, latch_in=%b, clk_en=%b, clk_in=%b, clk_out=%b, ", "oen=%b, dout_0=%b, dout_1=%b, din_0=%b%b, din_1=%b%b %s"}, gold_pin, gate_pin, gold_global, gate_global, latch_in, clk_en, clk_in, clk_out, oen, dout_0, dout_1, gold_din_0, gate_din_0, gold_din_1, gate_din_1, error ? "ERROR" : "OK"); end else begin error = {gold_pin, gold_global, gold_din_0} !== {gate_pin, gate_global, gate_din_0}; $display({"pin=%b%b, global=%b%b, latch_in=%b, clk_en=%b, clk_in=%b, clk_out=%b, ", "oen=%b, dout_0=%b, dout_1=%b, din_0=%b%b %s"}, gold_pin, gate_pin, gold_global, gate_global, latch_in, clk_en, clk_in, clk_out, oen, dout_0, dout_1, gold_din_0, gate_din_0, error ? "ERROR" : "OK"); end xorshift64_next; rndval = (xorshift64_state >> 16) & 'hffff; case (xorshift64_state % 5) 0: pin_reg <= 1'bz; 1: pin_reg <= 1'b0; 2: pin_reg <= 1'b1; `ifdef DISABLED // Lattice SB_IO clk_en model is b0rken // IceBox latch_in routing is non-existing default: {latch_in, clk_en, clk_in, clk_out, oen, dout_0, dout_1} <= {latch_in, clk_en, clk_in, clk_out, oen, dout_0, dout_1} ^ (1 << (rndval % 7)); `else default: {latch_in, clk_in, clk_out, oen, dout_0, dout_1} <= {latch_in, clk_in, clk_out, oen, dout_0, dout_1} ^ (1 << (rndval % 6)); `endif endcase #10; end end endmodule