2006-12-19 15:09:57 +01:00
// DESCRIPTION: Verilator: Verilog Test module
//
2020-03-21 16:24:24 +01:00
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2003 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
2006-12-19 15:09:57 +01:00
2023-07-27 12:47:37 +02:00
`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);
2020-07-01 23:32:15 +02:00
`ifdef WRITEMEM_BIN
`define READMEMX $readmemb
`define WRITEMEMX $writememb
`else
`define READMEMX $readmemh
`define WRITEMEMX $writememh
`endif
2006-12-19 15:09:57 +01:00
module t ;
2023-03-21 01:44:11 +01:00
// verilator lint_off ASCRANGE
2016-03-02 00:57:15 +01:00
reg [ 5 : 0 ] binary_string [ 2 : 15 ] ;
2006-12-19 15:09:57 +01:00
reg [ 5 : 0 ] binary_nostart [ 2 : 15 ] ;
reg [ 5 : 0 ] binary_start [ 0 : 15 ] ;
reg [ 175 : 0 ] hex [ 0 : 15 ] ;
2018-03-12 21:44:01 +01:00
reg [ ( 32 * 6 ) - 1 : 0 ] hex_align [ 0 : 15 ] ;
2023-07-27 12:47:37 +02:00
reg [ 55 : 0 ] qdata [ 0 : 15 ] ;
reg [ 25 : 0 ] idata [ 0 : 15 ] ;
reg [ 10 : 0 ] sdata [ 0 : 15 ] ;
reg [ 6 : 0 ] cdata [ 0 : 15 ] ;
2018-03-12 21:44:01 +01:00
string fns ;
`ifdef WRITEMEM_READ_BACK
reg [ 5 : 0 ] binary_string_tmp [ 2 : 15 ] ;
reg [ 5 : 0 ] binary_nostart_tmp [ 2 : 15 ] ;
reg [ 5 : 0 ] binary_start_tmp [ 0 : 15 ] ;
reg [ 175 : 0 ] hex_tmp [ 0 : 15 ] ;
reg [ ( 32 * 6 ) - 1 : 0 ] hex_align_tmp [ 0 : 15 ] ;
2023-07-27 12:47:37 +02:00
reg [ 55 : 0 ] qdata_tmp [ 0 : 15 ] ;
reg [ 25 : 0 ] idata_tmp [ 0 : 15 ] ;
reg [ 10 : 0 ] sdata_tmp [ 0 : 15 ] ;
reg [ 6 : 0 ] cdata_tmp [ 0 : 15 ] ;
2018-03-12 21:44:01 +01:00
string fns_tmp ;
`endif
2023-03-21 01:44:11 +01:00
// verilator lint_on ASCRANGE
2006-12-19 15:09:57 +01:00
integer i ;
initial begin
2018-03-12 21:44:01 +01:00
begin
// Initialize memories to zero,
// avoid differences between 2-state and 4-state.
for ( i = 0 ; i < 16 ; i = i + 1 ) begin
2023-07-27 12:47:37 +02:00
binary_start [ i ] = '0 ;
hex [ i ] = '0 ;
hex_align [ i ] = '0 ;
qdata [ i ] = '0 ;
idata [ i ] = '0 ;
sdata [ i ] = '0 ;
cdata [ i ] = '0 ;
2018-03-12 21:44:01 +01:00
`ifdef WRITEMEM_READ_BACK
2023-07-27 12:47:37 +02:00
binary_start_tmp [ i ] = '0 ;
hex_tmp [ i ] = '0 ;
hex_align_tmp [ i ] = '0 ;
qdata_tmp [ i ] = '0 ;
idata_tmp [ i ] = '0 ;
sdata_tmp [ i ] = '0 ;
cdata_tmp [ i ] = '0 ;
2018-03-12 21:44:01 +01:00
`endif
end
for ( i = 2 ; i < 16 ; i = i + 1 ) begin
binary_string [ i ] = 6 'h0 ;
binary_nostart [ i ] = 6 'h0 ;
`ifdef WRITEMEM_READ_BACK
binary_string_tmp [ i ] = 6 'h0 ;
binary_nostart_tmp [ i ] = 6 'h0 ;
`endif
end
end
2006-12-19 15:09:57 +01:00
begin
2018-03-12 21:44:01 +01:00
`ifdef WRITEMEM_READ_BACK
$readmemb ( " t/t_sys_readmem_b.mem " , binary_nostart_tmp ) ;
2020-07-01 23:32:15 +02:00
// Do a round-trip $writememh(b) and $readmemh(b) cycle.
2018-03-12 21:44:01 +01:00
// This covers $writememh and ensures we can read our
// own memh output file.
2020-07-01 23:32:15 +02:00
// If WRITEMEM_BIN is also defined, use $writememb and
// $readmemb, otherwise use $writememh and $readmemh.
2018-03-12 21:44:01 +01:00
`ifdef TEST_VERBOSE
$display ( " -Writing %s " , `OUT_TMP1 ) ;
`endif
2020-07-01 23:32:15 +02:00
`WRITEMEMX ( `OUT_TMP1 , binary_nostart_tmp ) ;
`READMEMX ( `OUT_TMP1 , binary_nostart ) ;
2018-03-12 21:44:01 +01:00
`else
2020-01-14 13:01:17 +01:00
$readmemb ( " t/t_sys_readmem_b.mem " , binary_nostart ) ;
2018-03-12 21:44:01 +01:00
`endif
2006-12-19 15:09:57 +01:00
`ifdef TEST_VERBOSE
2020-01-14 13:01:17 +01:00
for ( i = 0 ; i < 16 ; i = i + 1 ) $write ( " @%x = %x \n " , i , binary_nostart [ i ] ) ;
2006-12-19 15:09:57 +01:00
`endif
2020-01-14 13:01:17 +01:00
if ( binary_nostart [ 'h2 ] ! = 6 'h02 ) $stop ;
if ( binary_nostart [ 'h3 ] ! = 6 'h03 ) $stop ;
if ( binary_nostart [ 'h4 ] ! = 6 'h04 ) $stop ;
if ( binary_nostart [ 'h5 ] ! = 6 'h05 ) $stop ;
if ( binary_nostart [ 'h6 ] ! = 6 'h06 ) $stop ;
if ( binary_nostart [ 'h7 ] ! = 6 'h07 ) $stop ;
if ( binary_nostart [ 'h8 ] ! = 6 'h10 ) $stop ;
if ( binary_nostart [ 'hc ] ! = 6 'h14 ) $stop ;
if ( binary_nostart [ 'hd ] ! = 6 'h15 ) $stop ;
2006-12-19 15:09:57 +01:00
end
begin
2020-01-14 13:01:17 +01:00
binary_start [ 'h0c ] = 6 'h3f ; // Not in read range
//
2018-03-12 21:44:01 +01:00
`ifdef WRITEMEM_READ_BACK
$readmemb ( " t/t_sys_readmem_b_8.mem " , binary_start_tmp , 4 , 4 + 7 ) ;
`ifdef TEST_VERBOSE
$display ( " -Writing %s " , `OUT_TMP2 ) ;
`endif
2020-07-01 23:32:15 +02:00
`WRITEMEMX ( `OUT_TMP2 , binary_start_tmp , 4 , 4 + 7 ) ;
`READMEMX ( `OUT_TMP2 , binary_start , 4 , 4 + 7 ) ;
2018-03-12 21:44:01 +01:00
`else
2020-01-14 13:01:17 +01:00
$readmemb ( " t/t_sys_readmem_b_8.mem " , binary_start , 4 , 4 + 7 ) ; // 4-11
2018-03-12 21:44:01 +01:00
`endif
2006-12-19 15:09:57 +01:00
`ifdef TEST_VERBOSE
2020-01-14 13:01:17 +01:00
for ( i = 0 ; i < 16 ; i = i + 1 ) $write ( " @%x = %x \n " , i , binary_start [ i ] ) ;
2006-12-19 15:09:57 +01:00
`endif
2020-01-14 13:01:17 +01:00
if ( binary_start [ 'h04 ] ! = 6 'h10 ) $stop ;
if ( binary_start [ 'h05 ] ! = 6 'h11 ) $stop ;
if ( binary_start [ 'h06 ] ! = 6 'h12 ) $stop ;
if ( binary_start [ 'h07 ] ! = 6 'h13 ) $stop ;
if ( binary_start [ 'h08 ] ! = 6 'h14 ) $stop ;
if ( binary_start [ 'h09 ] ! = 6 'h15 ) $stop ;
if ( binary_start [ 'h0a ] ! = 6 'h16 ) $stop ;
if ( binary_start [ 'h0b ] ! = 6 'h17 ) $stop ;
//
if ( binary_start [ 'h0c ] ! = 6 'h3f ) $stop ;
2006-12-19 15:09:57 +01:00
end
begin
2018-03-12 21:44:01 +01:00
// The 'hex' array is a non-exact multiple of word size
// (possible corner case)
`ifdef WRITEMEM_READ_BACK
$readmemh ( " t/t_sys_readmem_h.mem " , hex_tmp , 0 ) ;
`ifdef TEST_VERBOSE
$display ( " -Writing %s " , `OUT_TMP3 ) ;
`endif
2020-07-01 23:32:15 +02:00
`WRITEMEMX ( `OUT_TMP3 , hex_tmp , 0 ) ;
`READMEMX ( `OUT_TMP3 , hex , 0 ) ;
2018-03-12 21:44:01 +01:00
`else
2020-01-14 13:01:17 +01:00
$readmemh ( " t/t_sys_readmem_h.mem " , hex , 0 ) ;
2018-03-12 21:44:01 +01:00
`endif
2006-12-19 15:09:57 +01:00
`ifdef TEST_VERBOSE
2020-01-14 13:01:17 +01:00
for ( i = 0 ; i < 16 ; i = i + 1 ) $write ( " @%x = %x \n " , i , hex [ i ] ) ;
2006-12-19 15:09:57 +01:00
`endif
2020-01-14 13:01:17 +01:00
if ( hex [ 'h04 ] ! = 176 'h400437654321276543211765432107654321abcdef10 ) $stop ;
if ( hex [ 'h0a ] ! = 176 'h400a37654321276543211765432107654321abcdef11 ) $stop ;
if ( hex [ 'h0b ] ! = 176 'h400b37654321276543211765432107654321abcdef12 ) $stop ;
if ( hex [ 'h0c ] ! = 176 'h400c37654321276543211765432107654321abcdef13 ) $stop ;
2006-12-19 15:09:57 +01:00
end
2008-06-10 03:25:10 +02:00
2016-03-02 00:57:15 +01:00
begin
2018-03-12 21:44:01 +01:00
// The 'hex align' array is similar to 'hex', but it is an
// exact multiple of word size -- another possible corner case.
`ifdef WRITEMEM_READ_BACK
$readmemh ( " t/t_sys_readmem_align_h.mem " , hex_align_tmp , 0 ) ;
`ifdef TEST_VERBOSE
$display ( " -Writing %s " , `OUT_TMP4 ) ;
`endif
2020-07-01 23:32:15 +02:00
`WRITEMEMX ( `OUT_TMP4 , hex_align_tmp , 0 ) ;
`READMEMX ( `OUT_TMP4 , hex_align , 0 ) ;
2018-03-12 21:44:01 +01:00
`else
2020-01-14 13:01:17 +01:00
$readmemh ( " t/t_sys_readmem_align_h.mem " , hex_align , 0 ) ;
2018-03-12 21:44:01 +01:00
`endif
`ifdef TEST_VERBOSE
2020-01-14 13:01:17 +01:00
for ( i = 0 ; i < 16 ; i = i + 1 ) $write ( " @%x = %x \n " , i , hex_align [ i ] ) ;
2018-03-12 21:44:01 +01:00
`endif
2020-01-14 13:01:17 +01:00
if ( hex_align [ 'h04 ] ! = 192 'h77554004 _37654321_27654321_17654321_07654321_abcdef10 ) $stop ;
if ( hex_align [ 'h0a ] ! = 192 'h7755400a _37654321_27654321_17654321_07654321_abcdef11 ) $stop ;
if ( hex_align [ 'h0b ] ! = 192 'h7755400b _37654321_27654321_17654321_07654321_abcdef12 ) $stop ;
if ( hex_align [ 'h0c ] ! = 192 'h7755400c _37654321_27654321_17654321_07654321_abcdef13 ) $stop ;
2018-03-12 21:44:01 +01:00
end
2023-07-27 12:47:37 +02:00
begin
`ifdef WRITEMEM_READ_BACK
$readmemh ( " t/t_sys_readmem_q.mem " , qdata_tmp , 0 ) ;
`ifdef TEST_VERBOSE
$display ( " -Writing %s " , `OUT_TMP5 ) ;
`endif
`WRITEMEMX ( `OUT_TMP5 , qdata_tmp , 0 ) ;
`READMEMX ( `OUT_TMP5 , qdata , 0 ) ;
`else
$readmemh ( " t/t_sys_readmem_q.mem " , qdata , 0 ) ;
`endif
`ifdef TEST_VERBOSE
for ( i = 0 ; i < 16 ; i = i + 1 ) $write ( " @%x = %x \n " , i , qdata [ i ] ) ;
`endif
`checkh ( qdata [ 'h04 ] , 56 'hdcba9876540004 ) ;
`checkh ( qdata [ 'h0a ] , 56 'hdcba987654000a ) ;
`checkh ( qdata [ 'h0b ] , 56 'hdcba987654000b ) ;
`checkh ( qdata [ 'h0c ] , 56 'hdcba987654000c ) ;
end
begin
`ifdef WRITEMEM_READ_BACK
$readmemh ( " t/t_sys_readmem_i.mem " , idata_tmp , 0 ) ;
`ifdef TEST_VERBOSE
$display ( " -Writing %s " , `OUT_TMP6 ) ;
`endif
`WRITEMEMX ( `OUT_TMP6 , idata_tmp , 0 ) ;
`READMEMX ( `OUT_TMP6 , idata , 0 ) ;
`else
$readmemh ( " t/t_sys_readmem_i.mem " , idata , 0 ) ;
`endif
`ifdef TEST_VERBOSE
for ( i = 0 ; i < 16 ; i = i + 1 ) $write ( " @%x = %x \n " , i , idata [ i ] ) ;
`endif
`checkh ( idata [ 'h04 ] , 26 'h6540004 ) ;
`checkh ( idata [ 'h0a ] , 26 'h654000a ) ;
`checkh ( idata [ 'h0b ] , 26 'h654000b ) ;
`checkh ( idata [ 'h0c ] , 26 'h654000c ) ;
end
begin
`ifdef WRITEMEM_READ_BACK
$readmemh ( " t/t_sys_readmem_s.mem " , sdata_tmp , 0 ) ;
`ifdef TEST_VERBOSE
$display ( " -Writing %s " , `OUT_TMP7 ) ;
`endif
`WRITEMEMX ( `OUT_TMP7 , sdata_tmp , 0 ) ;
`READMEMX ( `OUT_TMP7 , sdata , 0 ) ;
`else
$readmemh ( " t/t_sys_readmem_s.mem " , sdata , 0 ) ;
`endif
`ifdef TEST_VERBOSE
for ( i = 0 ; i < 16 ; i = i + 1 ) $write ( " @%x = %x \n " , i , sdata [ i ] ) ;
`endif
`checkh ( sdata [ 'h04 ] , 11 'h654 ) ;
`checkh ( sdata [ 'h0a ] , 11 'h65a ) ;
`checkh ( sdata [ 'h0b ] , 11 'h65b ) ;
`checkh ( sdata [ 'h0c ] , 11 'h65c ) ;
end
begin
`ifdef WRITEMEM_READ_BACK
$readmemh ( " t/t_sys_readmem_c.mem " , cdata_tmp , 0 ) ;
`ifdef TEST_VERBOSE
$display ( " -Writing %s " , `OUT_TMP8 ) ;
`endif
`WRITEMEMX ( `OUT_TMP8 , cdata_tmp , 0 ) ;
`READMEMX ( `OUT_TMP8 , cdata , 0 ) ;
`else
$readmemh ( " t/t_sys_readmem_c.mem " , cdata , 0 ) ;
`endif
`ifdef TEST_VERBOSE
for ( i = 0 ; i < 16 ; i = i + 1 ) $write ( " @%x = %x \n " , i , cdata [ i ] ) ;
`endif
`checkh ( cdata [ 'h04 ] , 7 'h14 ) ;
`checkh ( cdata [ 'h0a ] , 7 'h1a ) ;
`checkh ( cdata [ 'h0b ] , 7 'h1b ) ;
`checkh ( cdata [ 'h0c ] , 7 'h1c ) ;
end
2018-03-12 21:44:01 +01:00
begin
fns = " t/t_sys_readmem_b.mem " ;
`ifdef WRITEMEM_READ_BACK
2023-07-27 12:47:37 +02:00
fns_tmp = `OUT_TMP8 ;
2018-03-12 21:44:01 +01:00
$readmemb ( fns , binary_string_tmp ) ;
`ifdef TEST_VERBOSE
2023-07-27 12:47:37 +02:00
$display ( " -Writing %s " , `OUT_TMP8 ) ;
2018-03-12 21:44:01 +01:00
`endif
2020-07-01 23:32:15 +02:00
`WRITEMEMX ( fns_tmp , binary_string_tmp ) ;
`READMEMX ( fns_tmp , binary_string ) ;
2018-03-12 21:44:01 +01:00
`else
2020-01-14 13:01:17 +01:00
$readmemb ( fns , binary_string ) ;
2018-03-12 21:44:01 +01:00
`endif
2016-03-02 00:57:15 +01:00
`ifdef TEST_VERBOSE
2020-01-14 13:01:17 +01:00
for ( i = 0 ; i < 16 ; i = i + 1 ) $write ( " @%x = %x \n " , i , binary_string [ i ] ) ;
2016-03-02 00:57:15 +01:00
`endif
2020-01-14 13:01:17 +01:00
if ( binary_string [ 'h2 ] ! = 6 'h02 ) $stop ;
2016-03-02 00:57:15 +01:00
end
2006-12-19 15:09:57 +01:00
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
end
endmodule