1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
  
     | 
    
      // 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
 
     |