verilator/test_regress/t/t_func_wide_out.v

126 lines
3.7 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2023 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
`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);
typedef bit signed [11:0] s12_t;
typedef bit unsigned [11:0] u12_t;
typedef bit signed [69:0] s70_t;
typedef bit unsigned [69:0] u70_t;
import "DPI-C" context function void dpii_inv_s12(input s12_t in, output s12_t out);
import "DPI-C" context function void dpii_inv_u12(input u12_t in, output u12_t out);
import "DPI-C" context function void dpii_inv_s70(input s70_t in, output s70_t out);
import "DPI-C" context function void dpii_inv_u70(input s70_t in, output u70_t out);
class Cls #(type T = bit);
static function void get(inout T value);
`ifdef TEST_NOINLINE
// verilator no_inline_task
`endif
value = ~value;
endfunction
endclass
module t;
parameter MSG_PORT_WIDTH = 4350;
localparam PAYLOAD_MAX_BITS = 4352;
reg [MSG_PORT_WIDTH-1:0] msg;
function void func (output bit [PAYLOAD_MAX_BITS-1:0] data);
`ifdef TEST_NOINLINE
// verilator no_inline_task
`endif
data = {PAYLOAD_MAX_BITS{1'b1}};
endfunction
s12_t ds12;
u12_t du12;
s70_t ds70;
u70_t du70;
s12_t qs12;
u12_t qu12;
s70_t qs70;
u70_t qu70;
initial begin
// Operator TASKREF 'func' expects 4352 bits on the Function Argument, but Function Argument's VARREF 'msg' generates 4350 bits.
// verilator lint_off WIDTHEXPAND
func(msg);
if (msg !== {MSG_PORT_WIDTH{1'b1}}) $stop;
begin
// narrow connect to wide
ds12 = 12'h234;
Cls#(s70_t)::get(ds12);
`checkh(ds12, 12'hdcb);
ds12 = 12'he34; // negative if signed
Cls#(s70_t)::get(ds12);
`checkh(ds12, 12'h1cb);
du12 = 12'h244;
Cls#(u70_t)::get(du12);
`checkh(du12, 12'hdbb);
du12 = 12'he34; // negative if signed
Cls#(u70_t)::get(du12);
`checkh(du12, 12'h1cb);
// wie connect to narrow
ds70 = 12'h254;
Cls#(s12_t)::get(ds70);
`checkh(ds70, 70'h3ffffffffffffffdab);
ds70 = 12'he34; // negative if signed
Cls#(s12_t)::get(ds70);
`checkh(ds70, 70'h0000000000000001cb);
du70 = 12'h264;
Cls#(u12_t)::get(du70);
`checkh(du70, 70'h000000000000000d9b);
du70 = 12'he34; // negative if signed
Cls#(u12_t)::get(du70);
`checkh(du70, 70'h0000000000000001cb);
end
begin
// narrow connect to wide
ds12 = 12'h234;
dpii_inv_s70(ds12, qs12);
`checkh(qs12, 12'hdcb);
ds12 = 12'he34; // negative if signed
dpii_inv_s70(ds12, qs12);
`checkh(qs12, 12'h1cb);
du12 = 12'h244;
dpii_inv_u70(du12, qu12);
`checkh(qu12, 12'hdbb);
du12 = 12'he34; // negative if signed
dpii_inv_u70(ds12, qs12);
`checkh(qs12, 12'h1cb);
// wie connect to narrow
ds70 = 12'h254;
dpii_inv_s12(ds70, qs70);
`checkh(qs70, 70'h3ffffffffffffffdab);
ds70 = 12'he34; // negative if signed
dpii_inv_s12(ds70, qs70);
`checkh(qs70, 70'h0000000000000001cb);
du70 = 12'h264;
dpii_inv_u12(du70, qu70);
`checkh(qu70, 70'h000000000000000d9b);
du70 = 12'he34; // negative if signed
dpii_inv_u12(du70, qu70);
`checkh(qu70, 70'h0000000000000001cb);
end
$write("*-* All Finished *-*\n");
$finish;
end
endmodule