【问题标题】:How do I read an environment variable in Verilog/System Verilog?如何在 Verilog/System Verilog 中读取环境变量?
【发布时间】:2013-02-22 22:08:07
【问题描述】:

如何在 Verilog 中读取环境变量? (在 VCS 模拟器上运行)

我正在努力完成

File=$fopen("$PATH/FileName","r");

$PATH 是一个环境变量。

【问题讨论】:

    标签: environment-variables verilog system-verilog


    【解决方案1】:

    您可以简单地使用 SystemVerilog DPI 来获取环境。 而且因为getenv是每个POSIX平台的标准C库,所以你不需要再为函数定义实现自己的getenv()等效函数。

    SV 中的示例代码。

    import "DPI-C" function string getenv(input string env_name);
    
    module top;
    
      initial begin
        $write("env = %s\n", {getenv("HOME"), "/FileName"});
      end
    endmodule
    

    跑步

    ncverilog -sv dpi.v
    

    vcs -sverilog dpi.v
    

    它会显示

    env = /home/user/FileName
    

    你原来的问题还有一个问题,PATH 是一个可执行搜索路径的环境,并与“:”字符连接。我认为这应该是一个例子,而不是真正的“PATH”环境。否则你的fopen文件名可能是"/bin:/usr/bin:/usr/local/bin/FileName",这是错误的。

    【讨论】:

      【解决方案2】:

      您可以使用简单的 PLI 应用程序来读取环境变量。这是一个示例,没有任何错误检查:

      #include <stdlib.h>
      #include <string.h>
      
      #include "vpi_user.h"
      
      PLI_INT32 pli_getenv (PLI_BYTE8 * arg) {
      
          vpiHandle tf_obj = vpi_handle (vpiSysTfCall, NULL);
          vpiHandle arg_iter = vpi_iterate (vpiArgument, tf_obj);
      
          vpiHandle arg1, arg2;
          arg1 = vpi_scan (arg_iter);
          arg2 = vpi_scan (arg_iter);
      
          s_vpi_value vi, vo;
          vi.format = vpiStringVal;
          vpi_get_value (arg2, &vi);
      
          vo.format = vpiStringVal;
          vo.value.str = strdup (getenv (vi.value.str));
          vpi_put_value (arg1, &vo, NULL, vpiNoDelay);
      
          return 0;
      }
      

      VCS 文档应说明如何将其链接到模拟器中。

      【讨论】:

      • 使用 DPI 就简单多了。查看其他答案。
      【解决方案3】:

      使用 Verilog 预处理器通常更简单

      File = $fopen(`PATH_FILENAME, "r");
      

      然后从您的 Makefile/shell 脚本中调用模拟器,指定要替换的值

      $(SIM) -DPATH_FILENAME=\"$PATH/FileName\" blah.v ...

      我经常和 Icarus 的 iverilog 一起使用这个,vsim 和朋友可能支持类似的。

      引号被转义,以便它们包含在替换值中,因为预处理器不会在文字值内替换。例如,这种组合不起作用

      File = $fopen("`PATH_FILENAME", "r");
      

      ...

      `$(SIM) -DPATH_FILENAME=$PATH/FileName blah.v ...`
      

      【讨论】:

        【解决方案4】:

        在这里我可以看到所有答案,要么他们使用了一些 DPI,要么需要一些命令行参数。所以我用 only SystemVerilog 语法分享我的答案。答案并非特定于任何模拟器。但肯定是针对 Linux 环境的;对于其他操作系统,我们需要更改 $system 命令。

        我们需要使用一些预先设置这个“logPath”系统变量 在我们开始之前处理脚本或模拟脚本 模拟。

         string myPath;
        
         initial begin
             //Writing System Variable To A File
             $system("echo ${logPath} > logPath.txt");
        
             //Opening that file and reading to a string variable
             fh = $fopen ("./logPath.txt", "r");
             void'($fscanf(fh,"%s",myPath));
        
             //Appending File Name To That Path
             myPath = {myPath,"/note.txt"};
        
             //Closed and remove this temporary file
             $fclose(fh);
             $system("rm -rf logPath.txt");
              
             //Open a file at the path that you have extracted from System Variable
             //Do whatever you want now 
             fh = $fopen (myPath, "w");
             
             repeat(10) begin
                 $fdisplay (fh, "%t %M: Write Line Number =|%0d| ", $time, i);
                 i++;
             end
        
             $fclose(fh);
          end
        

        【讨论】:

          猜你喜欢
          • 2019-07-03
          • 1970-01-01
          • 1970-01-01
          • 2022-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多