71 lines
1.8 KiB
Systemverilog
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
|