Jump to content

    

Почему не передаётся переменная из задачи

Доброго всем пятничного!


Либо уже устал к концу недели, либо ещё что, но не могу понять в чём дело:
 

module tb;

    logic clk;

    initial begin
        clk = 0;
        forever #10ns clk = !clk;
    end;    

    task process_zone;
    input logic [7:0] size;
    output logic process_zone_end;

        enum {ST_ZONE_IDLE, ST_ZONE, ST_END_ZONE} state_zone;
        integer i;
        i = 0;

        forever @(posedge clk) begin    
            case (state_zone) 
                ST_ZONE_IDLE :   state_zone <= ST_ZONE;
                ST_ZONE      :   state_zone <= i == size ? ST_END_ZONE : ST_ZONE;
                ST_END_ZONE  :   state_zone <= ST_END_ZONE;   
                default      :   state_zone <= ST_ZONE_IDLE;       
            endcase
            i = state_zone == ST_ZONE ? i + 1 : 0;
            process_zone_end = state_zone == ST_END_ZONE;
        end
        
    endtask : process_zone

    logic state_next_zone;

    initial #10ns process_zone (8'd5, state_next_zone);

endmodule : tb

state_next_zone остаётся в третьем состоянии, невзирая на process_zone_end:


Clipboard01.thumb.png.0e8ed9cdc9ec3a20df601f0540715452.png

ЧЯДНТ?

Проект на всякий случай также прилагаю.

 

test.zip

Share this post


Link to post
Share on other sites

ST_END_ZONE: state_zone <= ST_END_ZONE;

Вы не выходите из третьего состояния.

Share this post


Link to post
Share on other sites

Приветствую!

А зачем вам forever в таске?  forever  выполняется всегда  (вот бы не подумал :smile: ) без всякого условия!   То есть ваш  код выглядит для сима так 

task process_zone;
...
  forever begin: b_forever
    @(posedge clk) begin : b_posedge   
      ...
      i = state_zone == ST_ZONE ? i + 1 : 0;
      process_zone_end = state_zone == ST_END_ZONE;
    end // b_posedge
  end // b_forever
endtask : process_zone

а значит вы не выходите из taska, а так как output переменные присваиваются при выходе из task то на выходе у вас нет изменения внешней переменной  state_next_zone. Меняется только локальная переменная process_zone_end. 

Удачи! Rob.

Share this post


Link to post
Share on other sites

Спасибо, преобразовал код в следующее:
 

module tb;

    logic clk;

    initial begin
        clk = 0;
        forever #10ns clk = !clk;
    end; 

    task process_zone;
    input logic [7:0] size;
    input logic start;
    
        enum {ST_IDLE, ST_ZONE, ST_END_ZONE} state_zone;
        integer i;    
        
        $display("%g ns task started with size = %0d", $time, size);
        
        i = 0;
        state_zone <= ST_ZONE;

        while (i <= size) 
            @(posedge clk) begin    
                case (state_zone)
                    ST_IDLE      :   state_zone <= start ? ST_ZONE : ST_IDLE;
                    ST_ZONE      :   state_zone <= i == size ? ST_END_ZONE : ST_ZONE;
                    ST_END_ZONE  :   state_zone <= ST_IDLE;
                    default      :   state_zone <= ST_IDLE;       
                endcase
                i = i + 1;
            end
        disable process_zone;
        
    endtask : process_zone

    event signal;
    logic start;
    
    task toggle_start;
        start = 1'b1;
        #10ns start = 1'b0;
    endtask : toggle_start 

    initial begin
        #50ns -> signal;
        fork
            toggle_start;
            process_zone (8'd5, start);
        join    
        -> signal;
    end
    
    initial begin 
        #250ns -> signal;
        fork
            toggle_start;
            process_zone (8'd7, start);
        join    
        -> signal;
    end
    
endmodule : tb

Clipboard02.thumb.png.702a2939bbd53782cffb4892e7abd5e3.png

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now