Jump to content

    
Sign in to follow this  
MaratZuev

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

Recommended Posts

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


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

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

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

А зачем вам 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this