Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

Command Line Interface (その2)



uvm_cmdline_procに対して、以下のような関数を実行して、コマンドラインの処理を行います。

    function void get_args       ( output string args[$] );
    function void get_plusargs   ( output string args[$] );
    function int get_arg_matches ( string match, ref string args[$]   );
    function int get_arg_value   ( string match, output string value  );
    function int get_arg_values  ( string match, ref string values[$] );

get_args関数の引数argsには、シミュレータの引数すべてが格納されます。
実装は、超簡単です。
    function void get_args (output string args[$]);
        args = m_argv;
    endfunction

get_plusargs関数の引数argsには、シミュレータの引数で+で始まるものが格納されます。
こちらの実装も同様に、超簡単です。
    function void get_plusargs (output string args[$]);
        args = m_plus_argv;
    endfunction

argsは、Queueですので、次のようにすると各引数を表示できます。
    for ( int i = 0; i < args.size() ; i++ ) 
        $display( "args[%d] = %s\n", i, args[i] );

get_arg_matches関数は、match(正規表現)にマッチする引数をargsに、マッチした数を戻り値として返します。

get_arg_value関数は、matchにマッチする最初の値をvalueに、マッチした数を戻り値として返します。
get_arg_values関数は、matchにマッチするすべての引数をvaluesに、マッチした数を戻り値として返します。

おっと、get_arg_value関数の実装で戻り値がおかしくなると思うのだが、いかがだろうか?
    function int get_arg_value (string match, ref string value);
        int chars = match.len();
        get_arg_value = 0;
        foreach (m_argv[i]) begin
            if(m_argv[i].len() >= chars) begin
                if(m_argv[i].substr(0,chars-1) == match) begin
                    get_arg_value++;
                    if(get_arg_value == 1)
                        value = m_argv[i].substr(chars,m_argv[i].len()-1);
                end
            end
        end
    endfunction

次回に続く。

検証、Verification、SystemVerilog、UVM、Unified Verification Methodology