verilator/test_regress/t/t_interface_inout_tristate.v

71 lines
1.8 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2026 PlanV GmbH
// SPDX-License-Identifier: CC0-1.0
// verilog_format: off
`define stop $stop
`define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
`ifdef verilator
`define no_optimize(v) $c(v)
`else
`define no_optimize(v) (v)
`endif
// verilog_format: on
// verilator lint_off MULTIDRIVEN
interface ifc;
// Tristate net resolved across an inout port connected hierarchically to
// this interface signal (iface.data <-> dut inout port).
wire [7:0] data;
endinterface
module dut (
inout wire [7:0] data,
input bit oe,
input logic [7:0] val
);
// The inout port drives the interface net when enabled, releases it (Z) otherwise.
assign data = oe ? val : 8'hzz;
endmodule
module t;
ifc ifc0 ();
bit oe, top_oe;
logic [7:0] val, topval;
// A second driver from the top, so resolution is observable from both sides.
assign ifc0.data = top_oe ? topval : 8'hzz;
dut u (
.data(ifc0.data),
.oe(oe),
.val(val)
);
initial begin
// dut drives the interface net through the inout port.
oe = `no_optimize(1'b1);
val = `no_optimize(8'hA5);
top_oe = `no_optimize(1'b0);
topval = `no_optimize(8'h00);
#1;
`checkh(ifc0.data, 8'hA5);
// top drives, dut releases.
oe = `no_optimize(1'b0);
top_oe = `no_optimize(1'b1);
topval = `no_optimize(8'h3C);
#1;
`checkh(ifc0.data, 8'h3C);
// Neither drives: net floats to Z.
oe = `no_optimize(1'b0);
top_oe = `no_optimize(1'b0);
#1;
`checkh(ifc0.data, 8'hzz);
$write("*-* All Finished *-*\n");
$finish;
end
endmodule