k0b0's record.

Computer Engineering, Arts and Books

Introduction to SystemVerilog. Test bench with assert

assertを使ってみる

 SystemVerilogのassert文を使って回路の動作を検証してみる。

assert文を使ったテストベンチ(adder_tb.sv)

 assert文は指定した条件のTrue/FalseをチェックしFalseの場合は$errorを実行する。このテストベンチではassert文を用いて入力値(a,b,cin)に対して出力値(s,cout)が正しく出力されているかどうか検証している。

/* adder_tb.sv */
`timescale 1ps/1ps

module adder_tb;

parameter STEP = 10;

logic a,b,cin,s,cout;

adder adder_0(.*);

initial
begin
    a = 1'b0; b = 1'b0; cin = 1'b0; #STEP;
    // 入力a=0 b=0 cin=0に対してs=0 cout=0となっているかチェック
    assert(s==0 & cout==0) else $error("000 failed.");
    display();

    a = 1'b0; b = 1'b0; cin = 1'b1; #STEP;
    // 入力a=0 b=0 cin=1に対してs=1 cout=0となっているかチェック
    assert(s==1 & cout==0) else $error("001 failed.");
    display();

    a = 1'b0; b = 1'b1; cin = 1'b0; #STEP;
    assert(s==1 & cout==0) else $error("010 failed.");
    display();

    a = 1'b0; b = 1'b1; cin = 1'b1; #STEP;
    assert(s==0 & cout==1) else $error("011 failed.");
    display();

    a = 1'b1; b = 1'b0; cin = 1'b0; #STEP;
    assert(s==1 & cout==0) else $error("100 failed.");
    display();

    a = 1'b1; b = 1'b0; cin = 1'b1; #STEP;
    assert(s==0 & cout==1) else $error("101 failed.");
    display();

    a = 1'b1; b = 1'b1; cin = 1'b0; #STEP;
    assert(s==0 & cout==1) else $error("110 failed.");
    display();

    a = 1'b1; b = 1'b1; cin = 1'b1; #STEP;
    assert(s==1 & cout==1) else $error("111 failed.");
    display();
end

task display;
    $display("a:%d + b:%d + cin:%d= s:%d cout:%d", a,b,cin,s,cout);
endtask

endmodule

テスト対象モジュール(adder.sv)

/*adder.sv*/
module adder (input  a, b,cin,
              output s, cout);

logic p,g;
assign p = a ^ b;
assign g = a & b;

assign s = p ^ cin;
assign cout = g | (p & cin);
endmodule