2007-07-18 17:01:39 +02: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, 2007 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
2007-07-18 17:01:39 +02:00
2024-07-28 20:40:55 +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)
2007-07-18 17:01:39 +02:00
module t ( /*AUTOARG*/
// Inputs
clk
) ;
input clk ;
2022-05-01 16:10:00 +02:00
integer cyc = 0 ;
reg [ 63 : 0 ] crc ;
reg [ 63 : 0 ] sum ;
2007-07-18 17:01:39 +02:00
// Take CRC data and apply to testblock inputs
wire [ 31 : 0 ] in = crc [ 31 : 0 ] ;
/*AUTOWIRE*/
// Beginning of automatic wires (for undeclared instantiated-module outputs)
2022-05-01 16:10:00 +02:00
wire [ 3 : 0 ] out ; // From test of Test.v
2007-07-18 17:01:39 +02:00
// End of automatics
Test test ( /*AUTOINST*/
2022-05-01 16:10:00 +02:00
// Outputs
. out ( out [ 3 : 0 ] ) ,
// Inputs
. clk ( clk ) ,
. in ( in [ 31 : 0 ] ) ) ;
2007-07-18 17:01:39 +02:00
// Aggregate outputs into a single result vector
wire [ 63 : 0 ] result = { 60 'h0 , out } ;
// What checksum will we end up with
`define EXPECTED_SUM 64'h1a0d07009b6a30d2
2024-07-28 20:40:55 +02:00
initial begin
`checkh ( 3 'b101 = = ? 3 'b100 , 1 'b0 ) ;
`checkh ( 3 'b101 = = ? 3 'b101 , 1 'b1 ) ;
`checkh ( 3 'b100 = = ? 3 'b10 x , 1 'b1 ) ;
`checkh ( 3 'b101 = = ? 3 'b10 x , 1 'b1 ) ;
`checkh ( 3 'b10 x = = ? 3 'b10 ? , 1 'b1 ) ;
`checkh ( 3 'b110 = = ? 3 'b10 ? , 1 'b0 ) ;
`checkh ( 3 'b111 = = ? 3 'b10 ? , 1 'b0 ) ;
`checkh ( 3 'b11 x = = ? 3 'b10 ? , 1 'b0 ) ;
`checkh ( 3 'b101 ! = ? 3 'b100 , ! 1 'b0 ) ;
`checkh ( 3 'b101 ! = ? 3 'b101 , ! 1 'b1 ) ;
`checkh ( 3 'b100 ! = ? 3 'b10 x , ! 1 'b1 ) ;
`checkh ( 3 'b101 ! = ? 3 'b10 x , ! 1 'b1 ) ;
`checkh ( 3 'b10 x ! = ? 3 'b10 ? , ! 1 'b1 ) ;
`checkh ( 3 'b110 ! = ? 3 'b10 ? , ! 1 'b0 ) ;
`checkh ( 3 'b111 ! = ? 3 'b10 ? , ! 1 'b0 ) ;
`checkh ( 3 'b11 x ! = ? 3 'b10 ? , ! 1 'b0 ) ;
end
2007-07-18 17:01:39 +02:00
// Test loop
always @ ( posedge clk ) begin
`ifdef TEST_VERBOSE
2021-11-13 16:46:25 +01:00
$write ( " [%0t] cyc==%0d crc=%x result=%x \n " , $time , cyc , crc , result ) ;
2007-07-18 17:01:39 +02:00
`endif
cyc < = cyc + 1 ;
2021-11-13 16:46:25 +01:00
crc < = { crc [ 62 : 0 ] , crc [ 63 ] ^ crc [ 2 ] ^ crc [ 0 ] } ;
sum < = result ^ { sum [ 62 : 0 ] , sum [ 63 ] ^ sum [ 2 ] ^ sum [ 0 ] } ;
2007-07-18 17:01:39 +02:00
if ( cyc = = 0 ) begin
2022-05-01 16:10:00 +02:00
// Setup
crc < = 64 'h5aef0c8d _d70a4497 ;
2007-07-18 17:01:39 +02:00
end
else if ( cyc < 10 ) begin
2022-05-01 16:10:00 +02:00
sum < = 64 'h0 ;
2007-07-18 17:01:39 +02:00
end
else if ( cyc < 90 ) begin
end
else if ( cyc = = 99 ) begin
2022-05-01 16:10:00 +02:00
$write ( " [%0t] cyc==%0d crc=%x sum=%x \n " , $time , cyc , crc , sum ) ;
if ( crc ! = = 64 'hc77bb9b3784ea091 ) $stop ;
if ( sum ! = = `EXPECTED_SUM ) $stop ;
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
2007-07-18 17:01:39 +02:00
end
end
endmodule
module Test ( /*AUTOARG*/
// Outputs
out ,
// Inputs
clk , in
) ;
input clk ;
2008-06-10 03:25:10 +02:00
input [ 31 : 0 ] in ;
2007-07-18 17:01:39 +02:00
output [ 3 : 0 ] out ;
2022-05-01 16:10:00 +02:00
assign out [ 0 ] = in [ 3 : 0 ] = = ? 4 'b1001 ;
assign out [ 1 ] = in [ 3 : 0 ] ! = ? 4 'b1001 ;
assign out [ 2 ] = in [ 3 : 0 ] = = ? 4 ' bx01x ;
assign out [ 3 ] = in [ 3 : 0 ] ! = ? 4 ' bx01x ;
2019-11-16 15:58:01 +01:00
wire signed [ 3 : 0 ] ins = in [ 3 : 0 ] ;
wire signed [ 3 : 0 ] outs ;
2022-05-01 16:10:00 +02:00
assign outs [ 0 ] = ins = = ? 4 ' sb1001 ;
assign outs [ 1 ] = ins ! = ? 4 ' sb1001 ;
assign outs [ 2 ] = ins = = ? 4 ' sbx01x ;
assign outs [ 3 ] = ins ! = ? 4 ' sbx01x ;
2019-11-16 15:58:01 +01:00
always_comb if ( out ! = outs ) $stop ;
2007-07-18 17:01:39 +02:00
endmodule