verilator/test_regress/t/t_lint_unusedloop_removed_b...

284 lines
7.0 KiB
Systemverilog
Raw Normal View History

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2024 by Antmicro.
// SPDX-License-Identifier: CC0-1.0
// verilator lint_off BLKSEQ
// verilator lint_off DECLFILENAME
module t(/*AUTOARG*/
// Inputs
clk, reset_l
);
input clk;
input reset_l;
parametrized_initial#(.REPETITIONS(0)) parametrized_initial0();
parametrized_initial#(.REPETITIONS(1)) parametrized_initial1();
parametrized_initial#(.REPETITIONS(2)) parametrized_initial2();
non_parametrized_initial non_parametrized_initial();
with_always with_always(.clk(clk));
const_condition const_condition();
loop_with_param loop_with_param();
if_with_param if_with_param();
clock_init_race clock_init_race(.clk(clk), .reset_l(reset_l));
endmodule
// module unused - no warning for any of statements inside
module unused(input clk);
bit unused_variable_while;
bit unused_variable_do_while;
bit unused_variable_for;
const bit always_false = 0;
always @(posedge clk) begin
while(unused_variable_while) begin
unused_variable_while <= 1;
end
do begin
unused_variable_do_while <= 1;
end while (unused_variable_do_while);
for (int i = 0; i < 5; i++)
begin
unused_variable_for <= 1;
end
while(always_false) begin
$write("This will not be printed\n");
end
do begin
$write("This will not be printed\n");
end while (always_false);
for (int i = 0; always_false; i++)
begin
$write("This will not be printed\n");
end
end
endmodule
2025-08-26 00:47:08 +02:00
// no warning for loops under parameterized module
module parametrized_initial #(parameter REPETITIONS = 0);
int prints_while = 0;
int prints_do_while = 0;
// loops with evaluation depending on REPETITIONS
initial begin
while(prints_while < REPETITIONS) begin
prints_while = prints_while + 1;
$write("Writing to console to avoid loop being optimized out\n");
end
while(REPETITIONS < 0) begin
$write("Writing to console to avoid loop being optimized out\n");
end
for (int i = 0; i < REPETITIONS; i++) begin
$write("Writing to console to avoid loop being optimized out\n");
end
do begin
prints_do_while = prints_do_while + 1;
$write("Writing to console to avoid loop being optimized out\n");
end while (prints_do_while < REPETITIONS);
end
// loop not changing variable used for output
int param_unused_while = 0;
initial begin
while(param_unused_while < REPETITIONS) begin
param_unused_while = param_unused_while + 1;
end
end
const logic always_false = 0;
// loops with empty bodies
initial begin
while(0);
while(always_false);
while(REPETITIONS < 0);
end
endmodule
module non_parametrized_initial;
int prints_do_while = 0;
const int always_zero = 0;
// loops with evaluation depending on always_zero
initial begin
while(always_zero < 0) begin
$write("This will not be printed\n");
end
// unrolled - no warning
for (int i = 0; i < always_zero; i++) begin
$write("This will not be printed\n");
end
// inlined - no warning
do begin
prints_do_while = prints_do_while + 1;
$write("Writing to console to avoid loop being optimized out\n");
end while (prints_do_while < always_zero);
end
// loop not changing variable used for output
int param_unused_while = 0;
int param_unused_do_while = 0;
int param_unused_for = 0;
initial begin
// warning
while(param_unused_while < always_zero) begin
param_unused_while++;
end
// unrolled - no warning
for (int i = 0; i < 5; i++)
begin
param_unused_for = 1;
end
// inlined - no warning
do begin
param_unused_do_while = 1;
end while (param_unused_do_while > 0);
end
const logic always_false = 0;
// loops with empty bodies - warning
initial begin
while(0);
while(always_false);
while(always_zero < 0);
do ; while(0);
// unrolled - no warning
for (int i = 0; i < 1; i++);
end
endmodule
// warning for all unused loops under always
module with_always(input clk);
const logic always_false = 0;
always @(posedge clk) begin
while(0);
while(always_false) begin
$write("Test");
end
end
endmodule
module const_condition;
const logic always_zero = 0;
// loops with const false condition - warning
initial begin
while(always_zero) begin
$write("This will not be printed\n");
end
for (int i = 0; always_zero; i++)
begin
$write("This will not be printed\n");
end
for (int i = 0; i < always_zero; i++)
begin
$write("This will not be printed\n");
end
// inlined - no warning
do begin
$write("This will be printed\n");
end while (always_zero);
end
endmodule
// loop with param - no warning
module loop_with_param;
parameter ZERO_PARAM = 0;
int prints = 2;
initial begin
for (int i = 0; ZERO_PARAM; i++) begin
$write("This will not be printed\n");
end
while (ZERO_PARAM != ZERO_PARAM) begin
$write("This will not be printed\n");
end
while(prints > ZERO_PARAM) begin
prints--;
end
end
endmodule
module if_with_param;
parameter ZERO_PARAM = 0;
parameter ONE_PARAM = 1;
initial begin
if (ZERO_PARAM) begin
2025-08-26 00:47:08 +02:00
// loop under false parameterized if - no warning
int prints = 0;
while(prints < 5) begin
prints++;
end
$write("Prints %d\n", prints);
end else if (!ONE_PARAM) begin
2025-08-26 00:47:08 +02:00
// loop under false parameterized if - no warning
int prints = 0;
while(prints < 5) begin
prints++;
end
$write("Prints %d\n", prints);
end else begin
2025-08-26 00:47:08 +02:00
// loop under true parameterized if - no warning
int prints = 0;
while(prints < 5) begin
prints++;
end
$write("Prints %d\n", prints);
end
end
endmodule
module clock_init_race(input clk, input reset_l);
logic m_2_clock;
logic m_3_clock;
logic m_2_reset = reset_l;
logic m_3_reset = reset_l;
assign m_2_clock = clk;
assign m_3_clock = clk;
int m_3_counter;
initial begin
$write("*-* START TEST *-*\n");
end
always @(posedge clk) begin
if (m_3_counter == 25) begin
$write("*-* All Finished *-*\n");
$finish();
end
end
bit m_2_ticked;
always @(posedge m_2_clock) if (!m_2_reset) begin
m_2_ticked = 1'b1;
end
always @(negedge m_2_clock) m_2_ticked = 1'b0;
always @(posedge m_3_clock) if (!m_3_reset) begin
$write("*-* m_3_clocked *-*\n");
// loop empty - unused loop warning
while (m_2_ticked);
m_3_counter += 1;
end
endmodule