verilator/test_regress/t/t_interface_hierparam_bits.v

68 lines
1.7 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// $bits() of interface member signals used as a child module parameter value.
// $bits reads the type, not the hierarchical value, so it is legal in a
// parameter (IEEE 1800-2023 6.20.2 forbids hierarchical values only).
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2026 Wilson Snyder
// 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)
// verilog_format: on
interface axi_if #(
parameter int ID_W = 8,
parameter int ADDR_W = 32
);
logic [ID_W-1:0] AWID;
logic [ADDR_W-1:0] AWADDR;
logic [7:0] AWLEN;
endinterface
module chkmod #(
parameter int PAYLOAD_WIDTH = 1,
parameter int EXPECT = 1
);
initial `checkh(PAYLOAD_WIDTH, EXPECT);
endmodule
module bridge #(
parameter int EXPECT = 1
) (
axi_if axi
);
// $bits of a concat of interface members
chkmod #(
.PAYLOAD_WIDTH($bits({axi.AWID, axi.AWADDR, axi.AWLEN})),
.EXPECT(EXPECT)
) u_concat ();
// $bits of a single interface member
chkmod #(
.PAYLOAD_WIDTH($bits(axi.AWADDR)),
.EXPECT(EXPECT - 12 - 8)
) u_single ();
endmodule
module t;
axi_if #(
.ID_W(12),
.ADDR_W(64)
) if0 (); // 12 + 64 + 8 = 84
axi_if #(
.ID_W(12),
.ADDR_W(16)
) if1 (); // 12 + 16 + 8 = 36
bridge #(.EXPECT(84)) dut0 (.axi(if0));
bridge #(.EXPECT(36)) dut1 (.axi(if1));
initial begin
#1;
$write("*-* All Finished *-*\n");
$finish;
end
endmodule