Vengineerの妄想(準備期間)

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

vmm_vxc_managerクラスの実装(その4)

Verification Engineerの戯言

vmm_xvc_tcl_execute_file関数を実行した後は、ファイル内のすべてのコマンドを実行します
        // Iterate over every command in the file and process it
        begin
            while (this.get_next_cmd()) begin
                this.process_cmd();
           end
        end
this.get_next_cmd関数は、次のようになっています。
    function int vmm_xvc_manager::get_next_cmd();
        string argv_array[0:99];
        int    argc, i;
        string linec_str;

    `ifdef VCS2006_06
        // Work-around for NYI feature in VCS2006.06
        // *NOT* IEEE compliant :-(
        this.argv.delete();
    `else
        // Works in VCS2008.03
        this.argv = '{};
    `endif

        get_next_cmd = vmm_xvc_get_next_cmd(argc,
                                            argv_array,
                                            this.testfile,
                                            linec_str,
                                            this.errMsg);
        if (get_next_cmd == 0) return 0;

        this.line = "";
        this.linec = linec_str.atoi();
        for (i = 0; i < argc; i++) begin
           this.argv.push_back(argv_array[i]);
           this.line = {this.line, argv_array[i], " "};
        end
    endfunction: get_next_cmd
this.argvは、local string argv[$]のように型が文字列のキューです。
IEEE 1800-2005では、すべてのようすをクリアするには、this.arg = {}にすればいいのですが、
VCS2006_06では、this.argv.delete()になるようです。
IEEE 1800-2005では、this.argv.delete(i)になり、指定したインデックス(i)の要素のみを削除します。

vmm_xvc_get_next_cmd関数は、vmm_xvc_dpi.cファイル内で次のように定義されています。
xvc_get_cmd関数の戻り値から各引数へ代入しているだけです。
    int vmm_xvc_get_next_cmd(int *argc_p,
                             char **argv,
                             char **testfile_p,
                             char **linec_p,
                             char **err_msg_p) {
        int i;
        xvc_parse_cmd_t *item;
     
        if ((item = xvc_get_cmd()) == NULL)
            return (0);

        *argc_p     = item->argc;
        *testfile_p = item->testfile;
        *linec_p    = item->linec;
        *err_msg_p  = item->err_msg;

        for (i = 0; i < item->argc; i++) {
            argv[i] = item->argv[i];
        }

        return(1);
    }
xvc_get_cmd関数は、vmm_xvc_dpi.cファイル内で次のように定義されています。
コマンドリスト(xvc_cmd_list)の先頭を取り出しているだけです。
    xvc_parse_cmd_t *xvc_get_cmd() {
        xvc_parse_cmd_t *retval;

        if (xvc_cmd_list) {
            retval = xvc_current_cmd_read_p;
            if (xvc_current_cmd_read_p)
                xvc_current_cmd_read_p = xvc_current_cmd_read_p->next;
            } else {
                retval = NULL;
            } 
        return(retval);
    }
} 戻り値の型(xvc_parse_cmd_t)は、次のようにvmm_xvc_dpi.cファイルの最初に定義されています。
    typedef struct xvc_parse_cmd {
       int  argc;
       char **argv;    /* arg list */  
       char *testfile; /* source file */  
       char *linec;    /* line no.*/ 
       char *err_msg;  /* error msg seen in parsing */
       struct xvc_parse_cmd *next;
    } xvc_parse_cmd_t;

次回は、process_cmd関数をみていきます。

検証、Verification、SystemVerilog、VMM、Verification Methodology Manual