【问题标题】:verilog fwrite output bytesverilog fwrite 输出字节
【发布时间】:2016-10-14 02:05:38
【问题描述】:

我知道如果我在verilog中输出一个二进制文件,那么我可以使用下面的verilog IO标准函数:

$fwrite(fd,"%u",32'hABCDE124); 

但是上面的命令将 4 字节的数据写入文件。如果我要写入的二进制数据只有一个字节、两个字节或三个字节怎么办? 我该怎么做?

例如,我知道以下内容不会满足我的要求:

$fwrite(fd,"%u",8'h24);
$fwrite(fd,"%u",16'hE124);
$fwrite(fd,"%u",24'hCDE124);

有什么方法可以将非 4 字节的多个数据写入文件?

谢谢,

--鲁迪

【问题讨论】:

    标签: verilog system-verilog hdl


    【解决方案1】:

    您可以使用%c 写出单个字节。您可以使用比特流转换将数据转换为字节数组,然后执行

    foreach(array_of_bytes[i]) $fwrite(fd,"%c",array_of_bytes[i]);
    

    如果您有大量数据,您可能希望通过使用 %u 写出 4 字节的倍数以及使用 `%c' 写出剩余字节来优化它。

    【讨论】:

      【解决方案2】:

      我建议另一个版本的 dave_59 的答案。关键是使用多个%c

      wire [7:0] byte;
      wire [15:0] two_bytes;
      wire [23:0] three_bytes;
      ----
      assign byte = 8'h24;
      assign two_bytes = 16'hE124;
      assign three_bytes = 24'hCDE124;
      ----
      $fwrite(fd_s,"%c",byte);
      $fwrite(fd_s,"%c%c",two_bytes[15-:8],two_bytes[7-:8]);
      $fwrite(fd_s,"%c%c%c",three_bytes[23-:8],three_bytes[15-:8],three_bytes[7-:8]);
      

      使用 %u 时 - 请注意您的系统 字节顺序,默认情况下它使用原生。

      【讨论】:

        【解决方案3】:

        您可以使用 %s 代替 %u:

        $fwrite(fd_s,"%s",8'h24);
        $fwrite(fd_s,"%s",16'hE124);
        $fwrite(fd_s,"%s",24'hCDE124);   
        

        https://www.edaplayground.com/x/4vJn

        【讨论】:

          猜你喜欢
          • 2021-04-10
          • 1970-01-01
          • 2017-01-10
          • 2014-04-24
          • 1970-01-01
          • 2020-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多