I have written a module which contains a simple function which indeed is a counter which increments based on condition and start being true. I am planning to use the same function with different arguments. But the problem I am facing is the pre_count value is getting overlapped with the first function call value.
Expected results when I run this
counter value from first loop will be 30
counter value from second loop will be 24
but I see both loops counter value will be same always as pre_count is getting over ridden by first function call.
Attaching the log at the end.
Thanks in advance for you time and help.
module main;
logic rtc_clk;
logic tb_rtc_clk;
logic tb_ish_clk;
logic rtc_clk_rst;
logic [7:0] forced_val;
logic force_en;
logic start_main_clk_cg_count;
logic stop_main_clk_cg_count;
logic clear_main_clk_cg_count;
logic main_clk_condition;
logic func_clk_condition;
logic [31:0] main_clk_cg_count;
logic [31:0] main2_clk_cg_count;
bit first_loop;
function counter(input string name,input force_en,input [10:0] forced_val,input condition,input start,input stop,input clear,input [31:0] pre_count_val,output [31:0] count_val);
if(first_loop) begin
if(force_en) count_val = forced_val;
else count_val = 0;
$display("[%s] First-Loop val:%d ***** counter_val:%d force_en:%d forced_val:%d",name,first_loop,count_val,force_en,forced_val);
end
if(clear | !rtc_clk_rst) begin
count_val = 0;
$display("[%s] check clear and reset check passed....counter val:%d",name,count_val);
end else if(stop) begin
$psprintf("[%s] saw stop",name);
start = 0;
end else begin
if(condition && start) begin
if(first_loop & force_en) count_val = forced_val;
$display("[%s] counter incrementing....counter val:%d force_val:%d pre_count_val:%d",name,count_val,forced_val,pre_count_val);
count_val = pre_count_val+1;
first_loop = 0;
end
end
endfunction
initial rtc_clk = 0;
always #2 rtc_clk = ~rtc_clk;
assign tb_clk = rtc_clk;
initial begin
clear_main_clk_cg_count = 0;
stop_main_clk_cg_count = 0;
rtc_clk_rst = 0;
func_clk_condition = 0;
main_clk_cg_count = 0;
main2_clk_cg_count = 0;
first_loop =1;
#10;
rtc_clk_rst = 1;
main_clk_condition = 1;
#2;
start_main_clk_cg_count = 1;
#25;
func_clk_condition = 1;
#100; $finish;
end
initial
begin
forever begin
@(posedge tb_clk) begin
counter("first_loop",force_en,forced_val,main_clk_condition,start_main_clk_cg_count,stop_main_clk_cg_count,clear_main_clk_cg_count,main_clk_cg_count,main_clk_cg_count);
counter("second_loop",0,100,func_clk_condition,start_main_clk_cg_count,stop_main_clk_cg_count,clear_main_clk_cg_count,main2_clk_cg_count,main2_clk_cg_count);
end
end
end
endmodule
Log:
[first_loop] First-Loop val:1 ***** counter_val: 0 force_en:x forced_val: X
[first_loop] check clear and reset check passed…counter val: 0
[second_loop] First-Loop val:1 ***** counter_val: 0 force_en:0 forced_val: 100
[second_loop] check clear and reset check passed…counter val: 0
[first_loop] First-Loop val:1 ***** counter_val: 0 force_en:x forced_val: X
[first_loop] check clear and reset check passed…counter val: 0
[second_loop] First-Loop val:1 ***** counter_val: 0 force_en:0 forced_val: 100
[second_loop] check clear and reset check passed…counter val: 0
[first_loop] First-Loop val:1 ***** counter_val: 0 force_en:x forced_val: X
[second_loop] First-Loop val:1 ***** counter_val: 0 force_en:0 forced_val: 100
[first_loop] First-Loop val:1 ***** counter_val: 0 force_en:x forced_val: X
[first_loop] counter incrementing…counter val: 0 force_val: X pre_count_val: 0
[first_loop] counter incrementing…counter val: 1 force_val: X pre_count_val: 1
[first_loop] counter incrementing…counter val: 2 force_val: X pre_count_val: 2
[first_loop] counter incrementing…counter val: 3 force_val: X pre_count_val: 3
[first_loop] counter incrementing…counter val: 4 force_val: X pre_count_val: 4
[first_loop] counter incrementing…counter val: 5 force_val: X pre_count_val: 5
[first_loop] counter incrementing…counter val: 6 force_val: X pre_count_val: 6
[second_loop] counter incrementing…counter val: 7 force_val: 100 pre_count_val: 6
[first_loop] counter incrementing…counter val: 7 force_val: X pre_count_val: 7
[second_loop] counter incrementing…counter val: 8 force_val: 100 pre_count_val: 7
[first_loop] counter incrementing…counter val: 8 force_val: X pre_count_val: 8
[second_loop] counter incrementing…counter val: 9 force_val: 100 pre_count_val: 8
[first_loop] counter incrementing…counter val: 9 force_val: X pre_count_val: 9
[second_loop] counter incrementing…counter val: 10 force_val: 100 pre_count_val: 9
[first_loop] counter incrementing…counter val: 10 force_val: X pre_count_val: 10
[second_loop] counter incrementing…counter val: 11 force_val: 100 pre_count_val: 10
[first_loop] counter incrementing…counter val: 11 force_val: X pre_count_val: 11
[second_loop] counter incrementing…counter val: 12 force_val: 100 pre_count_val: 11
[first_loop] counter incrementing…counter val: 12 force_val: X pre_count_val: 12
[second_loop] counter incrementing…counter val: 13 force_val: 100 pre_count_val: 12
[first_loop] counter incrementing…counter val: 13 force_val: X pre_count_val: 13
[second_loop] counter incrementing…counter val: 14 force_val: 100 pre_count_val: 13
[first_loop] counter incrementing…counter val: 14 force_val: X pre_count_val: 14
[second_loop] counter incrementing…counter val: 15 force_val: 100 pre_count_val: 14
[first_loop] counter incrementing…counter val: 15 force_val: X pre_count_val: 15
[second_loop] counter incrementing…counter val: 16 force_val: 100 pre_count_val: 15
[first_loop] counter incrementing…counter val: 16 force_val: X pre_count_val: 16
[second_loop] counter incrementing…counter val: 17 force_val: 100 pre_count_val: 16
[first_loop] counter incrementing…counter val: 17 force_val: X pre_count_val: 17
[second_loop] counter incrementing…counter val: 18 force_val: 100 pre_count_val: 17
[first_loop] counter incrementing…counter val: 18 force_val: X pre_count_val: 18
[second_loop] counter incrementing…counter val: 19 force_val: 100 pre_count_val: 18
[first_loop] counter incrementing…counter val: 19 force_val: X pre_count_val: 19
[second_loop] counter incrementing…counter val: 20 force_val: 100 pre_count_val: 19
[first_loop] counter incrementing…counter val: 20 force_val: X pre_count_val: 20
[second_loop] counter incrementing…counter val: 21 force_val: 100 pre_count_val: 20
[first_loop] counter incrementing…counter val: 21 force_val: X pre_count_val: 21
[second_loop] counter incrementing…counter val: 22 force_val: 100 pre_count_val: 21
[first_loop] counter incrementing…counter val: 22 force_val: X pre_count_val: 22
[second_loop] counter incrementing…counter val: 23 force_val: 100 pre_count_val: 22
[first_loop] counter incrementing…counter val: 23 force_val: X pre_count_val: 23
[second_loop] counter incrementing…counter val: 24 force_val: 100 pre_count_val: 23
[first_loop] counter incrementing…counter val: 24 force_val: X pre_count_val: 24
[second_loop] counter incrementing…counter val: 25 force_val: 100 pre_count_val: 24
[first_loop] counter incrementing…counter val: 25 force_val: X pre_count_val: 25
[second_loop] counter incrementing…counter val: 26 force_val: 100 pre_count_val: 25
[first_loop] counter incrementing…counter val: 26 force_val: X pre_count_val: 26
[second_loop] counter incrementing…counter val: 27 force_val: 100 pre_count_val: 26
[first_loop] counter incrementing…counter val: 27 force_val: X pre_count_val: 27
[second_loop] counter incrementing…counter val: 28 force_val: 100 pre_count_val: 27
[first_loop] counter incrementing…counter val: 28 force_val: X pre_count_val: 28
[second_loop] counter incrementing…counter val: 29 force_val: 100 pre_count_val: 28
[first_loop] counter incrementing…counter val: 29 force_val: X pre_count_val: 29
[second_loop] counter incrementing…counter val: 30 force_val: 100 pre_count_val: 29
[first_loop] counter incrementing…counter val: 30 force_val: X pre_count_val: 30
[second_loop] counter incrementing…counter val: 31 force_val: 100 pre_count_val: 30
$finish called from file “main_final.sv”, line 124.
$finish at simulation time 137