Tests: Add t_stream_integer_type (#2547) (#2548) (#2573)

This commit is contained in:
Victor Besyakov 2020-09-27 19:25:53 -04:00 committed by Wilson Snyder
parent e3a1954e20
commit 222ca4b009
3 changed files with 355 additions and 0 deletions

View File

@ -66,6 +66,7 @@ Tobias Wölfel
Todd Strader Todd Strader
Tomasz Gorochowik Tomasz Gorochowik
Tymoteusz Blazejczyk Tymoteusz Blazejczyk
Victor Besyakov
Vassilis Papaefstathiou Vassilis Papaefstathiou
Veripool API Bot Veripool API Bot
Wilson Snyder Wilson Snyder

View File

@ -0,0 +1,22 @@
#!/usr/bin/env perl
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2003 by Wilson Snyder. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
scenarios(simulator => 1);
compile(
fails => $Self->{vlt_all},
);
#execute(
# check_finished => 1,
# );
ok(1);
1;

View File

@ -0,0 +1,332 @@
// DESCRIPTION: Verilator: Verilog Test module
// Ref. to IEEE Std 1800-2017 11.4.14 & A.8.1
//
// stream pack/unpack for integer_type only
// slice_size ::= simple_type | constant_expression
// simple_type ::=
// integer_type | non_integer_type | ps_type_identifier | ps_parameter_identifier
// non_integer_type ::= shortreal | real | realtime
// integer_type ::=
// integer_vector_type | integer_atom_type
// integer_atom_type ::= byte | shortint | int | longint | integer | time
// integer_vector_type ::= bit | logic | reg
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2020 by Victor Besyakov.
// SPDX-License-Identifier: CC0-1.0
module t (/*AUTOARG*/
// Inputs
clk
);
input clk;
logic [31:0] packed_data_32;
logic [31:0] packed_data_32_ref;
logic [31:0] v_packed_data_32;
logic [31:0] v_packed_data_32_ref;
logic [63:0] packed_data_64;
logic [63:0] packed_data_64_ref;
logic [63:0] v_packed_data_64;
logic [63:0] v_packed_data_64_ref;
logic [127:0] packed_data_128;
logic [127:0] packed_data_128_ref;
logic [127:0] v_packed_data_128;
logic [127:0] v_packed_data_128_ref;
logic [127:0] packed_data_128_i;
logic [127:0] packed_data_128_i_ref;
logic [255:0] packed_data_256;
logic [255:0] packed_data_256_ref;
logic [255:0] packed_time_256;
logic [255:0] packed_time_256_ref;
//
//integer_atom_type
//
byte byte_in[4];
byte byte_out[4];
//
int int_in[4];
int int_out[4];
//
//
shortint shortint_in[4];
shortint shortint_out[4];
//
longint longint_in[4];
longint longint_out[4];
//
integer integer_in[4];
integer integer_out[4];
//
time time_in[4];
time time_out[4];
//integer_vector_type
typedef bit [7:0] test_byte;
typedef bit [15:0] test_short;
typedef bit [31:0] test_word;
typedef bit [63:0] test_long;
//
test_byte bit_in[4];
test_byte bit_out[4];
//
test_short logic_in[4];
test_short logic_out[4];
//
test_word reg_in[4];
test_word reg_out[4];
//
string error = "";
initial begin
//init
$write("*-* START t_stream_pack_unpack *-*\n");
error = test_integer_type_1(error);
`ifdef TEST_VERBOSE
print_all_data("test_integer_type_1");
`endif
error = test_integer_type_2(error);
`ifdef TEST_VERBOSE
print_all_data("test_integer_type_2");
`endif
//
if (error == "") $write("*-* All Finished *-*\n");
else begin
$write("*-* TEST failed error %s *-*:\n", error);
print_data_error(error);
end
$finish;
end // initial begin
function string test_integer_type_1(string error);
automatic string error_;
automatic string function_name_ = "test_integer_type_1";
error_ = error;
if (error_ == "") begin
clean_packed_data ();
init_data();
//pack
packed_data_32 = {<<8{byte_in}};
packed_data_64 = {<<16{shortint_in}};
packed_data_128 = {<<32{int_in}};
packed_data_128_i = {<<32{integer_in}};
packed_data_256 = {<<64{longint_in}};
packed_time_256 = {<<64{time_in}};
v_packed_data_32 = {<<8{bit_in}};
v_packed_data_64 = {<<16{logic_in}};
v_packed_data_128 = {<<32{reg_in}};
//unpack
{<<8{byte_out}} = packed_data_32;
{<<16{shortint_out}} = packed_data_64;
{<<32{int_out}} = packed_data_128;
{<<32{integer_out}} = packed_data_128_i;
{<<64{longint_out}} = packed_data_256;
{<<64{time_out}} = packed_time_256;
{<<8{bit_out}} = v_packed_data_32;
{<<16{logic_out}} = v_packed_data_64;
{<<32{reg_out}} = v_packed_data_128;
error_ = comp_in_out();
end // if (error == "")
return error_;
endfunction : test_integer_type_1
function string test_integer_type_2(string error);
automatic string error_;
automatic string function_name_ = "test_integer_type_2";
error_ = error;
if (error_ == "") begin
clean_packed_data ();
init_data();
//pack
packed_data_32 = {<<byte{byte_in}};
packed_data_64 = {<<shortint{shortint_in}};
packed_data_128 = {<<int{int_in}};
packed_data_128_i = {<<integer{integer_in}};
packed_data_256 = {<<longint{longint_in}};
packed_time_256 = {<<time{time_in}};
v_packed_data_32 = {<<test_byte{bit_in}};
v_packed_data_64 = {<<test_short{logic_in}};
v_packed_data_128 = {<<test_word{reg_in}};
//unpack
{<<byte{byte_out}} = packed_data_32;
{<<shortint{shortint_out}} = packed_data_64;
{<<int{int_out}} = packed_data_128;
{<<integer{integer_out}} = packed_data_128_i;
{<<longint{longint_out}} = packed_data_256;
{<<time{time_out}} = packed_time_256;
{<<test_byte{bit_out}} = v_packed_data_32;
{<<test_short{logic_out}} = v_packed_data_64;
{<<test_word{reg_out}} = v_packed_data_128;
error_ = comp_in_out();
end // if (error_ == "")
return error_;
endfunction : test_integer_type_2
function void clean_packed_data ();
packed_data_32 = 0;
packed_data_64 = 0;
packed_data_128 = 0;
v_packed_data_32 = 0;
v_packed_data_64 = 0;
v_packed_data_128 = 0;
packed_data_128_i = 0;
packed_data_256 = 0;
packed_time_256 = 0;
endfunction : clean_packed_data
function void print_packed_data ();
$display("TEST: packed_data_32=%0h", packed_data_32);
$display("TEST: packed_data_64=%0h", packed_data_64);
$display("TEST: packed_data_128=%0h", packed_data_128);
$display("TEST: packed_data_128_i=%0h", packed_data_128_i);
$display("TEST: packed_data_256=%0h", packed_data_256);
$display("TEST: packed_time_256=%0h", packed_time_256);
//
$display("TEST: v_packed_data_32=%0h", v_packed_data_32);
$display("TEST: v_packed_data_64=%0h", v_packed_data_64);
$display("TEST: v_packed_data_128=%0h", v_packed_data_128);
endfunction : print_packed_data
function void print_data_error (string error);
if (error == "integer_atom_type byte") begin
foreach (byte_in[i]) $display("byte_in[%0d]=%0h, byte_out=%0h ", i, byte_in[i], byte_out[i]);
$display("packed_data_32=%0h, packed_data_32_ref=%0h", packed_data_32, packed_data_32_ref);
end
if (error == "integer_atom_type shortint") begin
foreach (shortint_in[i]) $display("shortint_in[%0d]=%0h, shortint_ou=%0h", i, shortint_in[i], shortint_out[i]);
$display("packed_data_64=%0h, packed_data_64_ref=%0h", packed_data_64, packed_data_64_ref);
end
if (error == "integer_atom_type int") begin
foreach (int_in[i]) $display("int_in[%0d]=%0h, int_out=%0h", i, int_in[i], int_out[i]);
$display("packed_data_128=%0h, packed_data_128_ref=%0h ", packed_data_128, packed_data_128_ref);
end
if (error == "integer_atom_type integer") begin
foreach (integer_in[i]) $display("integer_in[%0d]=%0h, integer_out=%0h", i, integer_in[i], integer_out[i]);
$display("packed_data_128_i=%0h, packed_data_128_i_ref=%0h", packed_data_128_i, packed_data_128_i_ref);
end
if (error == "integer_atom_type longin") begin
foreach (longint_in[i]) $display("longint_in[%0d]=%0h, longint_out=%0h", i, longint_in[i], longint_out[i]);
$display("packed_data_256=%0h, packed_data_256_ref=%0h ", packed_data_256, packed_data_256_ref);
end
if (error == "integer_atom_type time") begin
foreach (time_in[i]) $display("time_in[%0d]=%0h, time_out=%0h", i, time_in[i], time_out[i]);
$display("packed_time_256=%0h, packed_time_256=%0h", packed_time_256, packed_time_256_ref);
end
//
if (error == "integer_vector_type bit") begin
foreach (bit_in[i]) $display("bit_in[%0d]=%0h, bit_out=%0h", i, bit_in[i], bit_out[i]);
$display("v_packed_data_32=%0h, v_packed_data_32_ref=%0h", v_packed_data_32, v_packed_data_32_ref);
end
if (error == "integer_vector_type logic") begin
foreach (logic_in[i]) $display("logic_in[%0d]=%0h, logic_out=%0h", i, logic_in[i], logic_out[i]);
$display("v_packed_data_64=%0h, v_packed_data_64_ref=%0h", v_packed_data_64, v_packed_data_64_ref);
end
if (error == "integer_vector_type reg") begin
foreach (reg_in[i]) $display("reg_in[%0d]%0h, reg_out=%0h", i, reg_in[i], reg_out[i]);
$display("v_packed_data_128=%0h, v_packed_data_128_ref=%0h", v_packed_data_128, v_packed_data_128_ref);
end
endfunction : print_data_error
function void print_all_data (string name = "");
foreach (byte_in[i]) $display(" %s byte_in[%0d]=%0h, byte_out=%0h ", name, i, byte_in[i], byte_out[i]);
$display(" %s packed_data_32=%0h, packed_data_32_ref=%0h", name, packed_data_32, packed_data_32_ref);
foreach (shortint_in[i]) $display(" %s shortint_in[%0d]=%0h, shortint_ou=%0h", name, i, shortint_in[i], shortint_out[i]);
$display(" %s packed_data_64=%0h,packed_data_64_ref=%0h", name, packed_data_64, packed_data_64_ref);
foreach (int_in[i]) $display(" %s int_in[%0d]=%0h, int_out=%0h", name, i, int_in[i], int_out[i]);
$display(" %s packed_data_128=%0h,packed_data_128_ref=%0h ",name, packed_data_128, packed_data_128_ref);
foreach (integer_in[i]) $display(" %s integer_in[%0d]=%0h, integer_out=%0h", name, i, integer_in[i], integer_out[i]);
$display(" %s packed_data_128_i=%0h,packed_data_128_i_ref=%0h", name, packed_data_128_i, packed_data_128_i_ref);
foreach (longint_in[i]) $display(" %s longint_in[%0d]=%0h, longint_out=%0h", name, i, longint_in[i], longint_out[i]);
$display(" %s packed_data_256=%0h, packed_data_256_ref=%0h ", name, packed_data_256, packed_data_256_ref);
foreach (time_in[i]) $display(" %s time_in[%0d]=%0h, time_out=%0h", name, i, time_in[i], time_out[i]);
$display(" %s packed_time_256=%0h,packed_time_256=%0h", name, packed_time_256, packed_time_256_ref);
//
foreach (bit_in[i]) $display(" %s bit_in[%0d]=%0h, bit_out=%0h", name, i, bit_in[i], bit_out[i]);
$display(" %s v_packed_data_32=%0h, v_packed_data_32_ref=%0h", name, v_packed_data_32, v_packed_data_32_ref);
foreach (logic_in[i]) $display(" %s logic_in[%0d]=%0h, logic_out=%0h", name, i, logic_in[i], logic_out[i]);
$display(" %s v_packed_data_64=%0h, v_packed_data_64_ref=%0h", name, v_packed_data_64, v_packed_data_64_ref);
foreach (reg_in[i]) $display(" %s reg_in[%0d]%0h, reg_out=%0h", name, i, reg_in[i], reg_out[i]);
$display(" %s v_packed_data_128=%0h, v_packed_data_128_ref=%0h", name, v_packed_data_128, v_packed_data_128_ref);
endfunction : print_all_data
function void init_data();
foreach (byte_in[i]) byte_in[i] = byte'(i)+1;
foreach (shortint_in[i]) shortint_in[i] = 'h100+shortint'(i)+1;
foreach (int_in[i]) int_in[i] = 'h200+int'(i)+1;
foreach (integer_in[i]) integer_in[i] = 'h300+integer'(i)+1;
foreach (longint_in[i]) longint_in[i] = 'h400+longint'(i)+1;
foreach (time_in[i]) time_in[i] = 'h500+time'(i)+1;
//
foreach (bit_in[i]) bit_in[i] = 'h10+test_byte'(i)+1;
foreach (logic_in[i]) logic_in[i] = 'h700+test_short'(i)+1;
foreach (reg_in[i]) reg_in[i] = 'h800+test_word'(i)+1;
//
packed_data_32_ref = {byte_in[3], byte_in[2], byte_in[1], byte_in[0]};
packed_data_64_ref = {shortint_in[3], shortint_in[2], shortint_in[1], shortint_in[0]};
packed_data_128_ref = {int_in[3], int_in[2], int_in[1], int_in[0]};
packed_data_128_i_ref = {integer_in[3], integer_in[2], integer_in[1], integer_in[0]};
packed_data_256_ref = {longint_in[3], longint_in[2], longint_in[1], longint_in[0]};
packed_time_256_ref = {time_in[3], time_in[2], time_in[1], time_in[0]};
v_packed_data_32_ref = {bit_in[3], bit_in[2], bit_in[1], bit_in[0]};
v_packed_data_64_ref = {logic_in[3], logic_in[2], logic_in[1], logic_in[0]};
v_packed_data_128_ref = {reg_in[3], reg_in[2], reg_in[1], reg_in[0]};
//
packed_data_32 = 0;
packed_data_64 = 0;
packed_data_128 = 0;
packed_data_128_i = 0;
packed_data_256 = 0;
packed_time_256 = 0;
endfunction : init_data
function string comp_in_out();
automatic string error_ = "";
automatic string function_name_ = "comp_in_out";
if (error_ == "") foreach (byte_in[i]) if (byte_in[i] !== byte_out[i]) error_ = "integer_atom_type byte";
if (error_ == "") if (packed_data_32 !== packed_data_32_ref) error_ = "integer_atom_type byte";
if (error_ == "") foreach (shortint_in[i]) if (shortint_in[i] !== shortint_out[i]) error_ = "integer_atom_type shortint";
if (error_ == "") if (packed_data_64 !== packed_data_64_ref) error_ = "integer_atom_type shortint";
if (error_ == "") foreach (int_in[i]) if (int_in[i] !== int_out[i]) error_ = "integer_atom_type int";
if (error_ == "") if (packed_data_128 !== packed_data_128_ref) error_ = "integer_atom_type int";
if (error_ == "") foreach (integer_in[i]) if (integer_in[i] !== integer_out[i]) error_ = "integer_atom_type integer";
if (error_ == "") if (packed_data_128_i !== packed_data_128_i_ref) error_ = "integer_atom_type integer";
if (error_ == "") foreach (longint_in[i]) if (longint_in[i] !== longint_out[i]) error_ = "integer_atom_type longin";
if (error_ == "") if (packed_data_256 !== packed_data_256_ref) error_ = "integer_atom_type longin";
if (error_ == "") foreach (time_in[i]) if (time_in[i] !== time_out[i]) error_ = "integer_atom_type time";
if (error_ == "") if (packed_time_256 !== packed_time_256_ref) error_ = "integer_atom_type time";
//
if (error_ == "") foreach (bit_in[i]) if (bit_in[i] !== bit_out[i]) error_ = "integer_vector_type bit";
if (error_ == "") if (v_packed_data_32 !== v_packed_data_32_ref) error_ = "integer_vector_type bit";
if (error_ == "") foreach (logic_in[i]) if (logic_in[i] !== logic_out[i]) error_ = "integer_vector_type logic";
if (error_ == "") if (v_packed_data_64 !== v_packed_data_64_ref) error_ = "integer_vector_type logic";
if (error_ == "") foreach (reg_in[i]) if (reg_in[i] !== reg_out[i]) error_ = "integer_vector_type reg";
if (error_ == "") if (v_packed_data_128 !== v_packed_data_128_ref) error_ = "integer_vector_type reg";
return error_;
endfunction : comp_in_out
endmodule