这似乎是一个已经被问到的问题,但我发现这是一个罕见且仍然是一个悬而未决的问题。我的问题取决于 Vivado 控制台,但它不仅仅与 Vivado 控制台相关,可以有任何其他控制台(仅将 Vivado 控制台视为示例)。如果已经有可用的解决方案,我很乐意重定向到那里。
我的目标是使用 tcl 命令构建 vivado 项目。
我有所有可用 tcl 命令的列表,我可以在 vivado 控制台中非常轻松地运行这些命令。在vivado控制台中有两种方法可以做到这一点:
方法一:
vivado -mode tcl
set project_name "VIV_Project"
set user_project_dir C:/viv
create_project -force $project_name $user_project_dir/projects -part xczu11
exit
方法二:
现在还有另一种方法,即将所有这些命令放入一个 tcl 脚本 (tcl_script.tcl) 中,然后运行一个命令来构建整个项目,如下所示:
vivado -mode batch -source tcl_script.tcl
现在的技巧部分是“我不想向任何人授予 tcl 命令的访问权限”。我想让它们隐藏起来。如果我选择方法 1,则需要在 vivado 控制台上手动输入命令,因此我的 tcl 命令对最终用户开放。
如果我选择方法 2,我的命令可在 tcl 脚本中使用,该脚本在目录中也可用。 Vivado 控制台不支持损坏的 tcl 脚本,所以我也不能这样做。
我愿意接受关于如何在没有人知道的情况下仍然执行我的 tcl 命令的建议? 理想情况下,我想要一个可执行文件,用户只需单击即可运行所有命令,然后退出。
我尝试了以下实验,导致在这里提出这个问题:
实验一:
我可以创建perl脚本的可执行文件,所以我尝试使用perl脚本
system()
命令:
system(vivado -mode tcl);
system(set project_name "VIV_Project");
system(set user_project_dir C:/viv);
system(create_project -force $project_name $user_project_dir/projects -part xczu11);
system(exit);
我期待它启动 vivado 控制台,然后我认为下一行会将命令发送到 vivado 控制台。如果一切都按照计划进行,那么我可以构建 Perl 脚本的可执行文件,并且用户可以启动该可执行文件。
现在此方法的问题是
system(vivado -mode tcl);
命令永远不会退出。它启动 vivado 控制台并停留在那里等待输入命令。
实验2: 我尝试使用批处理脚本来运行 vivado 控制台,然后再次遇到同样的问题,一旦启动 vivado,批处理脚本就会等待它返回。
这让我想到了我在标题中提出的问题(所以我将在这里讨论细节):
如何启动并自动向软件控制台发送命令?
我正在使用 perl 脚本通过
system()
运行命令。
system(vivado -mode tcl);
命令启动 vivado 但它永远不会返回,同时 vivado 控制台正在等待一些命令。那么我如何使用环境(perl 或其他东西)来启动 vivado 控制台,然后向该控制台提供命令?
另外,我愿意接受有关如何保护我的 tcl 脚本的建议?我这里只提供了一种方法。
谢谢
在我的脑海中,25 年前在“C”中做过类似的事情,我认为你想使用
open()
一系列带有管道的函数,这样你就可以print()
命令到打开的连接句柄。请参阅 https://perldoc.perl.org/functions/open#Opening-a-filehandle-into-a-command