入力にタスクを使う

[] [] []


入力波形をべた書きするよりも、タスクtaskを使った方が読みやすくなる。taskfunctionと似ているが、functionは出力が1個しかないのに対して、taskではtaskの外部のreg変数に代入することができる。

×// 入力波形をべた書きする

initial

    begin

    // 初期値入力

    wr  = 1'b0;

    rd  = 1'b0;

    adr = 8'bx;

    dat = 16'bz;

    // バスライト動作

    @(posedge clk);

    wr  <= #(TCO) 1'b1;

    adr <= #(TCO) 8'h05;

    dat <= #(TCO) 16'h5555;

    @(posedge clk);

    wr  <= #(TCO) 1'b0;

    adr <= #(TCO) 8'bx;

    dat <= #(TCO) 16'bz;

    // バスライト動作

    @(posedge clk);

    wr  <= #(TCO) 1'b1;

    adr <= #(TCO) 8'h0a;

    dat <= #(TCO) 16'haaaa;

    @(posedge clk);

    wr  <= #(TCO) 1'b0;

    adr <= #(TCO) 8'bx;

    dat <= #(TCO) 16'bz;

    ...

    $finish;

    end

 

// 入力波形をtaskで書く

initial

    begin

    wr  = 1'b0;

    rd  = 1'b0;

    adr = 8'h00;

    dat = 16'bz;

    bus_wr(8'h05,16'h5555);

    bus_wr(8'h0a,16'haaaa);

    bus_rd(8'h05,16'hxxxx);

    bus_rd(8'h0a,16'haaaa);

    ...

    $finish;

    end

 

// バスライト動作のタスク

task bus_wr

    (input[7:0]  a  // アドレス

    ,input[15:0] d  // ライト値

    );

    begin

    @(posedge clk);

    wr  <= #(TCO) 1'b1;

    adr <= #(TCO) a;

    dat <= #(TCO) d;

    @(posedge clk);

    while(ack!==1'b1) @(posedge clk); // ackを待つ

    wr  <= #(TCO) 1'b0;

    adr <= #(TCO) 8'bx;

    dat <= #(TCO) 16'bz;

    end

endtask

 

// バスリード動作のタスク

task bus_rd

    (input[7:0]  a  // アドレス

    ,input[15:0] d  // リード値の期待値

    );

    begin

    @(posedge clk)

    rd  <= #(TCO) 1'b1;

    adr <= #(TCO) a;

    @(posedge clk);

    while(ack!==1'b1) @(posedge clk); // ackを待つ

    rd  <= #(TCO) 1'b0;

    adr <= #(TCO) 8'bx;

  // リード値datの判定

    if(d===16'bx) $display("-- %m: dat=%h",dat);

    else if(d===dat) $display("-- %m: dat=%h [PASS]",dat);

    else $display("-- %m: dat=%h ref=%h [FAIL]",dat,d);

    end

endtask


[] [] []