2025-05-05 03:41:14 +02:00
// DESCRIPTION: Verilator: Verilog Test module
//
2026-01-27 02:24:34 +01:00
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2025 Wilson Snyder
2025-05-05 03:41:14 +02:00
// SPDX-License-Identifier: CC0-1.0
2025-12-21 03:46:43 +01:00
// verilog_format: off
2025-05-05 03:41:14 +02:00
`define stop $stop
`define checks(gotv,expv) do if ((gotv) != (expv)) begin $write("%%Error: %s:%0d: got='%s' exp='%s'\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
2025-12-21 03:46:43 +01:00
// verilog_format: on
2025-05-05 03:41:14 +02:00
module t ;
2026-03-10 02:38:29 +01:00
wire signed [ 21 : 10 ] out0 ;
2025-05-05 03:41:14 +02:00
2026-03-10 02:38:29 +01:00
sub sub ( . out0 ( out0 ) ) ;
2025-05-05 03:41:14 +02:00
2026-03-10 02:38:29 +01:00
sub2 sub2 ( ) ;
2025-05-05 03:41:14 +02:00
2026-03-10 02:38:29 +01:00
string s ;
2025-05-05 03:41:14 +02:00
2026-03-10 02:38:29 +01:00
initial begin
# 20 ;
// Bug with sformat, so can't just number-compare
s = $sformatf ( " out0=%0d " , out0 ) ;
`checks ( s , " out0=-12 " ) ;
if ( out0 > 0 ) $stop ;
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
end
2025-05-05 03:41:14 +02:00
endmodule
2026-03-10 02:38:29 +01:00
module sub (
out0
) ;
reg signed [ 27 : 20 ] reg_4 ;
output wire [ 21 : 10 ] out0 ;
2025-05-05 03:41:14 +02:00
2026-03-10 02:38:29 +01:00
initial begin
# 1 ;
reg_4 = 0 ;
end
2025-05-05 03:41:14 +02:00
2026-03-10 02:38:29 +01:00
wire [ 11 : 0 ] w55 ;
wire [ 11 : 0 ] w23 ;
// verilator lint_off WIDTHEXPAND
assign w55 = ~ reg_4 [ 20 ] ;
// verilator lint_on WIDTHEXPAND
assign { w23 [ 3 ] , w23 [ 1 : 0 ] } = 3 'h0 ;
assign { w23 [ 11 : 4 ] , w23 [ 2 ] } = { w55 [ 11 : 4 ] , w55 [ 2 ] } ;
assign out0 = w23 ;
2025-05-05 03:41:14 +02:00
endmodule
module sub2 ;
2026-03-10 02:38:29 +01:00
reg [ 27 : 5 ] in0 ;
reg [ 26 : 11 ] in1 ;
wire [ 24 : 14 ] wire_0 ;
wire [ 26 : 5 ] out1 ;
wire w085 ;
wire w082 ;
wire [ 10 : 0 ] w092 ;
wire [ 9 : 0 ] w028 ;
2025-05-05 03:41:14 +02:00
2026-03-10 02:38:29 +01:00
string s ;
2025-05-05 03:41:14 +02:00
2026-03-10 02:38:29 +01:00
initial begin
in0 = 6902127 ;
in1 = 10000 ;
# 10 ;
s = $sformatf ( " out0=%0d " , out1 ) ;
`checks ( s , " out0=0 " ) ;
end
2025-05-05 03:41:14 +02:00
2026-03-10 02:38:29 +01:00
assign w028 = ~ { 9 'h000 , in0 [ 23 ] } ;
assign w092 [ 1 ] = 1 'h0 ;
assign { w092 [ 10 : 2 ] , w092 [ 0 ] } = w028 ;
assign wire_0 = w092 ;
assign w082 = | wire_0 [ 18 : 17 ] ;
assign w085 = w082 ? in1 [ 11 ] : 1 'h0 ;
assign out1 = { 21 'h000000 , w085 } ;
2025-05-05 03:41:14 +02:00
endmodule