2020-08-07 01:56:43 +00:00
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2020 Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
`define checkr(gotv,expv) do if ((gotv) != (expv)) begin $write("%%Error: %s:%0d: got=%f exp=%f\n", `__FILE__,`__LINE__, (gotv), (expv)); $stop; end while(0);
module t ( /*AUTOARG*/
// Inputs
clk
) ;
input clk ;
2021-11-13 15:46:25 +00:00
integer cyc = 0 ;
2020-08-07 01:56:43 +00:00
reg [ 63 : 0 ] crc ;
reg [ 63 : 0 ] sum ;
reg [ 127 : 0 ] in ;
check # ( 48 ) check48 ( . * ) ;
check # ( 31 ) check31 ( . * ) ;
check # ( 32 ) check32 ( . * ) ;
check # ( 63 ) check63 ( . * ) ;
check # ( 64 ) check64 ( . * ) ;
check # ( 96 ) check96 ( . * ) ;
check # ( 128 ) check128 ( . * ) ;
always_comb begin
if ( crc [ 2 : 0 ] = = 0 ) in = '0 ;
else if ( crc [ 2 : 0 ] = = 1 ) in = ~ '0 ;
else if ( crc [ 2 : 0 ] = = 2 ) in = 128 'b1 ;
else if ( crc [ 2 : 0 ] = = 3 ) in = ~ 128 'b1 ;
else begin
in = { crc , crc } ;
if ( crc [ 3 ] ) in [ 31 : 0 ] = '0 ;
if ( crc [ 4 ] ) in [ 63 : 32 ] = '0 ;
if ( crc [ 5 ] ) in [ 95 : 64 ] = '0 ;
if ( crc [ 6 ] ) in [ 127 : 96 ] = '0 ;
if ( crc [ 7 ] ) in [ 31 : 0 ] = ~ '0 ;
if ( crc [ 8 ] ) in [ 63 : 32 ] = ~ '0 ;
if ( crc [ 9 ] ) in [ 95 : 64 ] = ~ '0 ;
if ( crc [ 10 ] ) in [ 127 : 96 ] = ~ '0 ;
end
end
// Test loop
always @ ( posedge clk ) begin
`ifdef TEST_VERBOSE
2021-11-13 15:46:25 +00:00
$write ( " [%0t] cyc==%0d in=%x \n " , $time , cyc , in ) ;
2020-08-07 01:56:43 +00:00
`endif
cyc < = cyc + 1 ;
2021-11-13 15:46:25 +00:00
crc < = { crc [ 62 : 0 ] , crc [ 63 ] ^ crc [ 2 ] ^ crc [ 0 ] } ;
2020-08-07 01:56:43 +00:00
if ( cyc = = 0 ) begin
// Setup
crc < = 64 'h5aef0c8d _d70a4497 ;
sum < = '0 ;
end
else if ( cyc = = 99 ) begin
`checkr ( check48 . sum , 14574057015683440.000000 ) ;
`checkr ( check31 . sum , 114141374814.000000 ) ;
`checkr ( check32 . sum , 236547942750.000000 ) ;
`checkr ( check63 . sum , 513694866079917670400.000000 ) ;
`checkr ( check64 . sum , 1002533584033221181440.000000 ) ;
`checkr ( check96 . sum , 4377373669974269260279175970816.000000 ) ;
`checkr ( check128 . sum , 18358899571808044815012294240949812330496.000000 ) ;
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
end
end
endmodule
module check ( /*AUTOARG*/
// Inputs
in , clk , cyc
) ;
parameter WIDTH = 128 ;
input [ 127 : 0 ] in ;
wire [ WIDTH - 1 : 0 ] ci = in [ WIDTH - 1 : 0 ] ;
wire signed [ WIDTH - 1 : 0 ] cis = in [ WIDTH - 1 : 0 ] ;
real r ;
real rs ;
always_comb r = ci ;
always_comb rs = cis ;
input clk ;
input integer cyc ;
real sum ;
always_ff @ ( negedge clk ) begin
`ifdef TEST_VERBOSE
$write ( " [%0t] w%0d in=%h r=%f rs=%f sum=%f \n " , $time , WIDTH , ci , r , rs , sum ) ;
`endif
if ( cyc < 10 ) sum < = 0 ;
else sum < = sum + r + rs ;
end
endmodule