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