|  | 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 |