Защо изходът в задачата Verilog става x (неизвестна стойност) на първия цикъл?

Объркан съм в изявлението на задачата във Verilog. Подготвих следния примерен код, за да разбера поведението на задачата. Но резултатът от симулацията беше различен, както очаквах. Защото мислех, че task_output на първия цикъл трябва да бъде нула вместо X (непозната стойност). Защо възниква такъв проблем? и някой знае ли как да избегна този проблем? Всяка помощ ще бъде оценена. Благодаря предварително.

[примерен код]

`timescale 1ns/10ps

module TaskTest_tb;
parameter CK_PERIOD = 10;
reg simCk;
reg [15:0] task_output;
integer j;


initial begin
    simCk = 0;
    task_output = 0;

    for(j=0; j<16; j=j+1) begin
        @(posedge simCk)  sample_task(8'h01, j[7:0], task_output);
    end
end

always #(CK_PERIOD/2) simCk <= ~simCk; 

task sample_task;
    input [7:0] x;
    input [7:0] count;
    output reg [15:0] y;
    reg [15:0] y_int;
    integer i;
    begin
        @(posedge simCk) y_int <= 0;

        for(i=0; i<count; i=i+1) begin
            @(posedge simCk) y_int <= y_int + x; 
        end
        @(posedge simCk) y <= y_int;
    end
endtask
endmodule

[Резултатът от инструмента за преглед на вълнови форми]

въведете описание на изображението тук


person yufit_in_Japan    schedule 17.03.2014    source източник
comment
Тази задача насочена ли е към RTL (синтез) или към проверка?   -  person Morgan    schedule 17.03.2014
comment
@Morgan Самата тази задача е само примерен код за въпроса. Искам да използвам такъв вид задача като генератор на тестови шаблони във фазата на проверка. Не е синтезируем RTL код.   -  person yufit_in_Japan    schedule 17.03.2014


Отговори (1)


Опитахте ли да инициализирате изходната стойност на задачата. Очаквам, че от момента на извикване на задачата тя може непрекъснато да управлява стойността и y в рамките на задачата не е дефиниран до последната стъпка.

task sample_task;
    input [7:0] x;
    input [7:0] count;
    output reg [15:0] y;
    reg [15:0] y_int;
    integer i;
    begin
        y<=0; //<--Added line
        @(posedge simCk) y_int <= 0;

        for(i=0; i<count; i=i+1) begin
            @(posedge simCk) y_int <= y_int + x; 
        end
        @(posedge simCk) y <= y_int;
    end
endtask
person Morgan    schedule 17.03.2014