Verification Engineerの戯言
vmm_xvc_tcl_execute_file関数を実行した後は、ファイル内のすべてのコマンドを実行します
IEEE 1800-2005では、すべてのようすをクリアするには、this.arg = {}にすればいいのですが、
VCS2006_06では、this.argv.delete()になるようです。
IEEE 1800-2005では、this.argv.delete(i)になり、指定したインデックス(i)の要素のみを削除します。
// Iterate over every command in the file and process it begin while (this.get_next_cmd()) begin this.process_cmd(); end endthis.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_cmdthis.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関数の戻り値から各引数へ代入しているだけです。
コマンドリスト(xvc_cmd_list)の先頭を取り出しているだけです。
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